Step Success

This commit is contained in:
Yofuria 2023-07-25 23:17:57 +08:00
parent 1229d9e3c2
commit 382efa2139
7 changed files with 72 additions and 45 deletions

View File

@ -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({ #需要引入生产状态表

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.