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])) # 取能生产的最小个数
|
||||
for material in product_material:
|
||||
self.ev_lst_backtrans_material[np.where(self.xv_ary_material == material[1])] -= produce_number * \
|
||||
if np.isnan(
|
||||
self.ev_lst_backtrans_material[np.where(self.xv_ary_material == material[1])[0][0]] / float(
|
||||
material[
|
||||
2] # 更新原材料消耗情况
|
||||
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:
|
||||
# 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