diff --git a/Environment.py b/Environment.py index cf6239a..6143305 100644 --- a/Environment.py +++ b/Environment.py @@ -93,7 +93,7 @@ class FMSEnv(ap.Model): self.op_os_to_dlv = self.the_firm.the_os.ev_ary_to_dlv # 当期及之前未满足需求总和 # self.op_os_all_delay_time = self.the_firm.the_os.ev_lst_all_delay_time - self.op_ps_produced_num = self.the_firm.the_ps.ev_ary_produced_num # 当期产品生产数量 + self.op_ps_produced_num = self.the_firm.the_ps.ev_ary_produce_number # 当期产品生产数量 self.op_ps_str_status = self.the_firm.the_os.ev_int_produce_type # 当期生产状态 # self.op_is_current_product = self.model.the_firm.the_is.ev_ary_current_product @@ -124,16 +124,18 @@ if __name__ == '__main__': # 'xv_array_lead_time': 2, # 读取原材料表格 np.read, 暂时不读 变量代表的含义 # 'xv_int_lead_time_c': 3, # 'xv_int_lead_time_d': 1, - 'xv_ary_product_id': pd.read_excel("initial_product.xlsx").to_numpy()[:, 0], # 产成品id顺序 - 'xv_ary_material_id': pd.read_excel("initial_material.xlsx").to_numpy()[:, 0], # 原材料id顺序 + 'xv_ary_product_id': tuple(pd.read_excel("initial_product.xlsx").iloc[:, 0]), # 产成品id顺序 + 'xv_ary_material_id': tuple(pd.read_excel("initial_material.xlsx").iloc[:, 0]), # 原材料id顺序 'xv_product_num': len(pd.read_excel("initial_product.xlsx").to_numpy()), # 产成品个数 'xv_material_num': len(pd.read_excel("initial_material.xlsx").to_numpy()), # 原材料个数 - 'xv_ary_initial_product_num': pd.read_excel("initial_product.xlsx").to_numpy(), # 初始产成品库存 23x2 - 'xv_ary_initial_material_num': pd.read_excel("initial_material.xlsx").to_numpy(), # 初始原材料库存 115x2 - 'xv_ary_bom': pd.read_excel("bom23.xlsx").to_numpy(), # bom表 - 'xv_ary_plan': pd.read_excel("plan.xlsx").to_numpy(), # plan表 - 'xv_ary_s': pd.read_excel("rawmaterial - s.xlsx").to_numpy(), # s - 'xv_ary_S': pd.read_excel("rawmaterialS.xlsx").to_numpy(), # S + 'xv_ary_initial_product_num': tuple([tuple(x) for x in pd.read_excel("initial_product.xlsx").values]), + # 初始产成品库存 23x2 + 'xv_ary_initial_material_num': tuple([tuple(x) for x in pd.read_excel("initial_material.xlsx").values]), + # 初始原材料库存 115x2 + 'xv_ary_bom': tuple([tuple(x) for x in pd.read_excel("bom23.xlsx").values]), # bom表 + 'xv_ary_plan': tuple([tuple(x) for x in pd.read_excel("plan.xlsx").values]), # plan表 + 'xv_ary_s': tuple([tuple(x) for x in pd.read_excel("rawmaterial - s.xlsx").values]), # s + 'xv_ary_S': tuple([tuple(x) for x in pd.read_excel("rawmaterialS.xlsx").values]), # S # 应读取遗传算法中随机生成的s,暂写为'1' 创建两个excel分别存储产品和原材料的库存 每个excel中存系统代码和库存 # 'xv_flt_initial_cash': 50000.0, # 'dct_status_info': json.dumps({ #需要引入生产状态表 diff --git a/Firm.py b/Firm.py index 8a9e897..fcd96e2 100644 --- a/Firm.py +++ b/Firm.py @@ -20,7 +20,7 @@ class Firm: self.xv_ary_initial_material_num = np.asarray(dct_all_para['xv_ary_initial_material_num']) # 初始原材料库存 self.xv_product_num = int(dct_all_para['xv_product_num']) # 产成品个数 self.xv_material_num = int(dct_all_para['xv_material_num']) # 原材料个数 - self.xv_ary_plan = np.asarray(dct_all_para['xy_ary_plan']) + self.xv_ary_plan = np.asarray(dct_all_para['xv_ary_plan']) self.xv_ary_bom = np.asarray(dct_all_para['xv_ary_bom']) self.xv_ary_product_id = np.asarray(dct_all_para['xv_ary_product_id']) self.xv_ary_material_id = np.asarray(dct_all_para['xv_ary_material_id']) @@ -30,13 +30,13 @@ class Firm: # self.xv_ary_lead_time = np.array([dct_all_para['xv_int_lead_time_a'], dct_all_para['xv_int_lead_time_b']]) # create agents here - self.the_os = OrderSystem(env, xv_produt_num=self.xv_product_num, xv_ary_plan=self.xv_ary_plan, + self.the_os = OrderSystem(env, xv_product_num=self.xv_product_num, xv_ary_plan=self.xv_ary_plan, xv_ary_product_id=self.xv_ary_product_id) # 实例Oss self.the_is = InventorySystem(env, xv_ary_initial_material_num=self.xv_ary_initial_material_num, xv_ary_initial_product_num=self.xv_ary_initial_product_num, xv_product_num=self.xv_product_num, xv_material_num=self.xv_material_num, - xv_ary_bom=self.xv_ary_bom, xv_ary_pan=self.xv_ary_plan, + xv_ary_bom=self.xv_ary_bom, xv_ary_plan=self.xv_ary_plan, xv_ary_material_id=self.xv_ary_material_id) # 实例Iss self.the_ps = ProduceSystem(env, xv_ary_bom=self.xv_ary_bom, xv_ary_plan=self.xv_ary_plan, xv_product_num=self.xv_product_num, @@ -55,7 +55,7 @@ class Firm: self.the_is.consume_and_store(ev_ary_produced_num=self.the_ps.ev_ary_produce_number, ev_changed_product=self.the_os.ev_changed_product, ev_lst_backtrans_material=self.the_ps.ev_lst_backtrans_material) - self.the_is.material_replenishment() + self.the_is.material_replenishment(xv_ary_s=self.xv_ary_s, xv_ary_S=self.xv_ary_S) self.the_os.do_shipment(ev_ary_current_product=self.the_is.ev_ary_current_product) # self.the_is.inventory_cost() # self.the_fs.financial_calculating() diff --git a/InventorySystem.py b/InventorySystem.py index 18ad354..8391ec1 100644 --- a/InventorySystem.py +++ b/InventorySystem.py @@ -23,7 +23,6 @@ class InventorySystem(ap.Agent): ev_lst_trans_quan_material: list # Iss传递给Pss的原材料数量 ev_lst_backtrans_quan_material: list # Pss退回的原材料数量 - # Material list xv_ary_material: np.ndarray xv_ary_bom: np.ndarray @@ -63,8 +62,8 @@ class InventorySystem(ap.Agent): self.xv_ary_bom = xv_ary_bom # bom表 self.xv_ary_plan = xv_ary_plan # plan表 - self.ev_lst_trans_quan_material = [] # Iss传递给Pss的原材料数量 - self.ev_lst_backtrans_quan_material = [] # Pss退回的原材料数量 + self.ev_lst_trans_quan_material = [0 for i in range(xv_material_num)] # Iss传递给Pss的原材料数量 + self.ev_lst_backtrans_quan_material = [0 for i in range(xv_material_num)] # Pss退回的原材料数量 self.ev_ary_order_time = np.zeros((xv_material_num,)) # 原材料订货时间戳 self.ev_ary_arrive_time = np.zeros((xv_material_num,)) # 原材料到货时间戳 @@ -82,21 +81,25 @@ class InventorySystem(ap.Agent): for product_plan in produce_plan: for bom in self.xv_ary_bom: if product_plan[1] == bom[0]: - self.ev_ary_material_state_to_use[np.where(self.xv_ary_material == bom[1])] += product_plan[3] * \ - bom[ - 2] # 某原材料的生产数量加等产品生产量乘单位原材料消耗量 + self.ev_ary_material_state_to_use[np.where(self.xv_ary_material == bom[1])] += float( + product_plan[3]) * \ + float(bom[ + 2]) # 某原材料的生产数量加等产品生产量乘单位原材料消耗量 def material_check(self): # 检查库存是否充足 # 根据Iss决策,核对库存是否充足,并将拥有的原材料交给Pss # 可能需要一部生成原材料列表在调用 # Check whether materials are enough and transfer material + # print(len(self.ev_ary_current_material), self.xv_material_num) + # print(self.ev_ary_current_material[0, 1]) for i in range(self.xv_material_num): - self.ev_lst_trans_quan_material[i] = min(self.ev_ary_current_material[i, 1], - self.ev_ary_material_state_to_use[i]) # 需要数量和库存两者间的较小值 + self.ev_lst_trans_quan_material[i] = float(min(float(self.ev_ary_current_material[i, 1]), + self.ev_ary_material_state_to_use[i])) # 需要数量和库存两者间的较小值 # if self.ev_ary_current_material[i, 1] >= ev_ary_material_state_to_use[i]: # 库存足够按照计划生产 # self.ev_lst_trans_quan_material[i] = ev_ary_material_state_to_use[i] # else: # self.ev_lst_trans_quan_material[i] = self.ev_ary_current_material[i] + # print(type(self.ev_lst_trans_quan_material[i])) def consume_and_store(self, ev_ary_produced_num, ev_changed_product, ev_lst_backtrans_material): @@ -107,12 +110,12 @@ class InventorySystem(ap.Agent): self.ev_lst_backtrans_quan_material[i] if self.ev_ary_arrive_time[i] == self.model.t: # 判断材料是否到达 - self.ev_ary_current_material[i, 1] = self.ev_ary_current_material[i, 1] - self.ev_ary_material_to_use[i] \ + self.ev_ary_current_material[i, 1] = float(self.ev_ary_current_material[i, 1]) - self.ev_ary_material_to_use[i] \ + self.ev_ary_num_material_to_order[i] # 减消耗量 加订购量 self.ev_ary_num_material_to_order[i] = 0 self.ev_ary_is_order_material[i] = False - self.ev_ary_current_product[:, 1] = ev_changed_product + ev_ary_produced_num[:, 1] # 上期期末加本期生产 + self.ev_ary_current_product[:, 1] = ev_changed_product + np.array([float(x) for x in ev_ary_produced_num[:, 1]]) # 上期期末加本期生产 # return self.ev_ary_current_material, self.ev_ary_current_product @@ -123,9 +126,9 @@ class InventorySystem(ap.Agent): for i in range(self.xv_material_num): if self.ev_ary_current_material[i, 1] <= xv_ary_s[i, 1] and self.ev_ary_is_order_material[i] == False: self.ev_ary_is_order_material[i] = True - self.ev_ary_num_material_to_order[i] = xv_ary_S[i, 1] - self.ev_ary_current_material[i, 1] + self.ev_ary_num_material_to_order[i] = float(xv_ary_S[i, 1]) - float(self.ev_ary_current_material[i, 1]) self.ev_ary_order_time[i] = self.model.t - self.ev_ary_arrive_time[i] = self.ev_int_order_time[i] + self.xv_ary_lead_time[ - self.xv_ary_lead_time[:, 0] == self.ev_ary_current_material[i, 0]][0, 1] + self.ev_ary_arrive_time[i] = self.ev_ary_order_time[i] + float(self.xv_ary_lead_time[ + self.xv_ary_lead_time[:, 0] == self.ev_ary_current_material[i, 0]][0, 1]) else: self.ev_ary_num_material_to_order[i] = 0 diff --git a/Order.py b/Order.py index 3720ed5..a4a3fa9 100644 --- a/Order.py +++ b/Order.py @@ -21,8 +21,8 @@ class Order(ap.Agent): def setup(self, time_created): self.xv_time_created = time_created # 订单创建时间 # read the demand of 23 productions - self.xv_ary_dlv_product = pd.read_excel("demand23.xlsx").to_numpy() # 接神经网络结果 - self.ev_ary_dlv_product = pd.read_excel("demand23.xlsx").to_numpy()[:, 1] # 23x1 把产品的顺序按照xv_ary_product_id重新排列!!! + self.xv_ary_dlv_product = np.asarray(pd.read_excel("demand23.xlsx").to_records(index=False)) # 接神经网络结果 + self.ev_ary_dlv_product = np.asarray(tuple(pd.read_excel("demand23.xlsx").iloc[:, 1])) # 23x1 把产品的顺序按照xv_ary_product_id重新排列!!! self.xv_time_circle = np.random.randint(7, 11, 1) self.xv_dlv_t = self.xv_time_created + self.xv_time_circle # 随机生成期望交付时间 self.ev_actual_dlv_t = self.xv_dlv_t diff --git a/OrderSystem.py b/OrderSystem.py index 99b7ff5..f32fe42 100644 --- a/OrderSystem.py +++ b/OrderSystem.py @@ -47,7 +47,7 @@ class OrderSystem(ap.Agent): self.ev_ary_to_dlv = np.zeros((self.xv_product_num,)) # 产品需求总和 for order in self.a_lst_order: self.ev_ary_to_dlv += order.ev_ary_dlv_product # 当前天之前所有的还未满足的需求求和 - self.ev_ary_product_to_produce = self.ev_ary_to_dlv - self.model.the_firm.the_is.ev_ary_current_product[:, 1] + self.ev_ary_product_to_produce = self.ev_ary_to_dlv - np.array([float(x) for x in self.model.the_firm.the_is.ev_ary_current_product[:, 1]]) # self.ev_ary_product_to_produce = self.model.the_firm.the_is.ev_ary_current_product - self.ev_ary_to_dlv # self.ev_ary_product_to_produce > 0: # 选出这些产品,按照数值大小进行分类,数值最大的产品对应的能带来最大生产率的状态,则选定为ev_int_produce_type @@ -75,7 +75,7 @@ class OrderSystem(ap.Agent): # 需要更新 order.ev_ary_dlv_product # Make shipments based on ranked order list self.ev_ave_delay_time = 0 - self.ev_changed_product = ev_ary_current_product[:, 1] # 23x1 ndarray 存储本次库存的改变 + self.ev_changed_product = np.array([float(x) for x in ev_ary_current_product[:, 1]]) # 23x1 ndarray 存储本次库存的改变 for order in self.a_lst_order: if order.xv_dlv_t == self.model.t: # 第一次交付 # Check and make shipment diff --git a/ProduceSystem.py b/ProduceSystem.py index 7de0f74..bf728d4 100644 --- a/ProduceSystem.py +++ b/ProduceSystem.py @@ -37,37 +37,59 @@ class ProduceSystem(ap.Agent): sorted_data = ev_ary_product_to_produce[sorted_indices] # 对gap进行从大到小排序 self.ev_ary_product = self.ev_ary_product[sorted_indices] sorted_indices_product = np.argsort(self.model.the_firm.the_is.ev_ary_current_product[:, 1]) # 对库存进行从小到大排序 - sorted_data_product = self.model.the_firm.the_is.ev_ary_current_product[:, sorted_indices_product] + # print(sorted_indices_product) + sorted_data_product = self.model.the_firm.the_is.ev_ary_current_product[sorted_indices_product, :] self.ev_lst_backtrans_material = ev_lst_trans_quan_material # 存储退回给Iss的原材料 self.ev_ary_produce_number = np.zeros((self.xv_product_num, 2)) produce_number_lst = [] for i in range(self.xv_product_num): if sorted_data[i] > 0: # gap存在 product_material = self.xv_ary_bom[self.xv_ary_bom[:, 0] == self.ev_ary_product[i]] - produce_number = produce_plan[produce_plan[:, 1] == self.ev_ary_product[i]][3] + # print(product_material) + # print(self.xv_ary_material) + # print(len(self.xv_ary_material)) + # print(np.where(self.xv_ary_material == 'D12087F2126')[0][0]) + # print(produce_plan[produce_plan[:, 1] == self.ev_ary_product[i]]) + produce_number = float(produce_plan[produce_plan[:, 1] == self.ev_ary_product[i]][0, 3]) + # print(type(produce_number)) for material in product_material: - produce_number = min(produce_number, int( - self.ev_lst_backtrans_material[np.where(self.xv_ary_material == material[1])] / material[ - 2])) # 取能生产的最小个数 + if np.isnan( + self.ev_lst_backtrans_material[np.where(self.xv_ary_material == material[1])[0][0]] / float( + material[ + 2])): + number = 100000 + else: + number = self.ev_lst_backtrans_material[ + np.where(self.xv_ary_material == material[1])[0][0]] / float(material[ + 2]) + produce_number = min(produce_number, int(number)) # 取能生产的最小个数 for material in product_material: - self.ev_lst_backtrans_material[np.where(self.xv_ary_material == material[1])] -= produce_number * \ - material[ - 2] # 更新原材料消耗情况 + # print(type(np.where(self.xv_ary_material == material[1]))) + self.ev_lst_backtrans_material[ + np.where(self.xv_ary_material == material[1])[0][0]] -= produce_number * \ + float(material[ + 2]) # 更新原材料消耗情况 produce_number_lst.append([self.ev_ary_product[i], produce_number]) sorted_data_product = sorted_data_product[sorted_data_product[:, 0] != self.ev_ary_product[i]] else: for current_product in sorted_data_product: product_material = self.xv_ary_bom[self.xv_ary_bom[:, 0] == current_product[0]] - produce_number = produce_plan[produce_plan[:, 1] == current_product[0]][3] + produce_number = float(produce_plan[produce_plan[:, 1] == current_product[0]][0, 3]) for material in product_material: - produce_number = min(produce_number, int( - self.ev_lst_backtrans_material[np.where(self.xv_ary_material == material[1])] / material[ - 2])) # 取能生产的最小个数 + if np.isnan(self.ev_lst_backtrans_material[ + np.where(self.xv_ary_material == material[1])[0][0]] / float(material[ + 2])): + number = 100000 + else: + number = self.ev_lst_backtrans_material[ + np.where(self.xv_ary_material == material[1])[0][0]] / float(material[ + 2]) + produce_number = min(produce_number, int(number)) # 取能生产的最小个数 for material in product_material: self.ev_lst_backtrans_material[ - np.where(self.xv_ary_material == material[1])] -= produce_number * \ - material[ - 2] # 更新原材料消耗情况 + np.where(self.xv_ary_material == material[1])[0][0]] -= produce_number * \ + float(material[ + 2]) # 更新原材料消耗情况 produce_number_lst.append([current_product[0], produce_number]) break diff --git a/bom23.xlsx b/bom23.xlsx index 43a982b..25d5d0f 100644 Binary files a/bom23.xlsx and b/bom23.xlsx differ