Step Success
This commit is contained in:
		
							parent
							
								
									1229d9e3c2
								
							
						
					
					
						commit
						382efa2139
					
				|  | @ -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({   #需要引入生产状态表 | ||||
|  |  | |||
							
								
								
									
										8
									
								
								Firm.py
								
								
								
								
							
							
						
						
									
										8
									
								
								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() | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
							
								
								
									
										4
									
								
								Order.py
								
								
								
								
							
							
						
						
									
										4
									
								
								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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
							
								
								
									
										
											BIN
										
									
								
								bom23.xlsx
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								bom23.xlsx
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue