60 lines
3.6 KiB
Python
60 lines
3.6 KiB
Python
import agentpy as ap
|
||
import numpy as np
|
||
import random
|
||
|
||
|
||
class ProduceSystem(ap.Agent):
|
||
ev_str_status: str # 0,6,8,10 pp_id
|
||
ev_lst_backtrans_material: list # 退回Iss的原材料
|
||
ev_ary_produce_number: np.ndarray
|
||
|
||
def setup(self, dct_status_info):
|
||
self.ev_str_status = 0
|
||
self.ev_lst_backtrans_material = []
|
||
|
||
def change_status(self):
|
||
self.ev_str_status = self.model.the_firm.the_os.produce_status()
|
||
|
||
|
||
def run_produce(self, ev_lst_material, ev_lst_trans_quan_material, ev_ary_product_to_produce, xv_plan_excel,
|
||
xv_ary_bom): # ev_ary_product_to_produce 是 需求和库存的gap 23x2
|
||
# 生产状态由Iss确定,这个函数需要计算生产数量和原材料消耗量。
|
||
# 如果原材料不足,就按照production gap(ev_ary_product_to_produce) 大小进行生产;如果没有gap的产品了,就按照库存水平由少到多进行生产。
|
||
# 输出生产结果和原材料消耗结果
|
||
produce_plan = xv_plan_excel[xv_plan_excel[:, 0] == self.ev_str_status]
|
||
sorted_indices = np.argsort(ev_ary_product_to_produce[:, 1])[::-1]
|
||
sorted_data = ev_ary_product_to_produce[sorted_indices] # 对gap进行从大到小排序
|
||
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]
|
||
self.ev_lst_backtrans_material = ev_lst_trans_quan_material
|
||
self.ev_ary_produce_number = []
|
||
for product in sorted_data:
|
||
if product[1] > 0: # gap存在
|
||
product_material = xv_ary_bom[xv_ary_bom[:, 0] == product[0]]
|
||
produce_number = produce_plan[produce_plan[:, 1] == product[0]][3]
|
||
for material in product_material:
|
||
produce_number = min(produce_number, int(
|
||
self.ev_lst_backtrans_material[np.where(ev_lst_material == material[1])] / material[
|
||
2])) # 取能生产的最小个数
|
||
for material in product_material:
|
||
self.ev_lst_backtrans_material[np.where(ev_lst_material == material[1])] -= produce_number * material[
|
||
2] # 更新原材料消耗情况
|
||
self.ev_ary_produce_number.append([product[0], produce_number])
|
||
sorted_data_product = sorted_data_product[sorted_data_product[:, 0] != product[0]]
|
||
else:
|
||
for current_product in sorted_data_product:
|
||
product_material = xv_ary_bom[xv_ary_bom[:, 0] == current_product[0]]
|
||
produce_number = produce_plan[produce_plan[:, 1] == current_product[0]][3]
|
||
for material in product_material:
|
||
produce_number = min(produce_number, int(
|
||
self.ev_lst_backtrans_material[np.where(ev_lst_material == material[1])] / material[
|
||
2])) # 取能生产的最小个数
|
||
for material in product_material:
|
||
self.ev_lst_backtrans_material[np.where(ev_lst_material == material[1])] -= produce_number * \
|
||
material[2] # 更新原材料消耗情况
|
||
self.ev_ary_produce_number.append([current_product[0], produce_number])
|
||
break
|
||
|
||
self.ev_ary_produce_number = np.array(self.ev_ary_produce_number)
|
||
|
||
return self.ev_ary_produce_number, self.ev_lst_backtrans_material |