HTSim/ProduceSystem.py

100 lines
6.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import agentpy as ap
import numpy as np
import random
class ProduceSystem(ap.Agent):
ev_str_status: int # 0,6,8,10 pp_id
ev_lst_backtrans_material: list # 退回Iss的原材料
ev_ary_produce_number: np.ndarray
xv_ary_bom: np.ndarray
xv_ary_plan: np.ndarray
xv_product_num: int
ev_ary_product: np.ndarray
xv_ary_material: np.ndarray
def setup(self, xv_ary_bom, xv_ary_plan, xv_product_num, xv_ary_product_id, xv_ary_material_id):
self.ev_str_status = 0 # 设置初始生产状态
self.ev_lst_backtrans_material = []
self.ev_ary_produce_number = np.zeros((xv_product_num, 2))
self.xv_ary_bom = xv_ary_bom
self.xv_ary_plan = xv_ary_plan
self.xv_product_num = xv_product_num
self.ev_ary_product = xv_ary_product_id
self.xv_ary_material = xv_ary_material_id
def change_status(self):
self.ev_str_status = self.model.the_firm.the_os.ev_int_produce_type
def run_produce(self, ev_lst_trans_quan_material,
ev_ary_product_to_produce): # ev_ary_product_to_produce 是 需求和库存的gap 23x1
# 生产状态由Iss确定这个函数需要计算生产数量和原材料消耗量。
# 如果原材料不足就按照production gap(ev_ary_product_to_produce) 大小进行生产如果没有gap的产品了就按照库存水平由少到多进行生产。
# 输出生产结果和原材料消耗结果
produce_plan = self.xv_ary_plan[self.xv_ary_plan[:, 0] == self.ev_str_status] # 当前生产状态下的产品生产速度
sorted_indices = np.argsort(ev_ary_product_to_produce)[::-1]
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]) # 对库存进行从小到大排序
# 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]]
# 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:
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:
# 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 = float(produce_plan[produce_plan[:, 1] == current_product[0]][0, 3])
for material in product_material:
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])[0][0]] -= produce_number * \
float(material[
2]) # 更新原材料消耗情况
produce_number_lst.append([current_product[0], produce_number])
break
self.ev_ary_produce_number = np.array(produce_number_lst)
# return self.ev_ary_produce_number, self.ev_lst_backtrans_material