遗传算法001
This commit is contained in:
54
my_model.py
54
my_model.py
@@ -62,7 +62,7 @@ class MyModel(Model):
|
||||
self.cap_limit_level = params['cap_limit_level'] # 产能限制的水平。
|
||||
self.diff_new_conn = params['diff_new_conn'] # 是否允许差异化的新连接。
|
||||
# 初始化停止时间步,可能是用户通过参数传入
|
||||
self.int_stop_ts = params.get('n_iter', 3) # 默认停止时间为 100
|
||||
self.int_stop_ts = params.get('n_iter', 100) # 默认停止时间为 100
|
||||
|
||||
# 网络初始化
|
||||
self.firm_network = nx.MultiDiGraph() # 企业之间的有向多重图。
|
||||
@@ -465,12 +465,9 @@ class MyModel(Model):
|
||||
production_output = self.data_produced.loc[self.data_produced['Firm_Code'] == int(ag_node)]
|
||||
|
||||
# 获取企业的资源信息,同时处理 R、P、C 的情况
|
||||
try:
|
||||
R = self.firm_resource_R.loc[int(ag_node)]
|
||||
P = self.firm_resource_P.get(int(ag_node))
|
||||
C = self.firm_resource_C.loc[int(ag_node)]
|
||||
except KeyError:
|
||||
R, P, C = [], {}, [] # 如果任何资源不存在,返回空列表
|
||||
R = self.firm_resource_R.get(int(ag_node), [])
|
||||
P = self.firm_resource_P.get(int(ag_node), {})
|
||||
C = self.firm_resource_C.get(int(ag_node), [])
|
||||
# 在模型初始化时,构建 unique_id -> agent 的快速映射字典
|
||||
self.agent_map = {agent.unique_id: agent for agent in self.company_agents}
|
||||
|
||||
@@ -717,13 +714,20 @@ class MyModel(Model):
|
||||
for firm in self.company_agents:
|
||||
if not firm.R: # 跳过没有资源的企业
|
||||
continue
|
||||
|
||||
# 遍历资源列表,检查哪些资源需要补货
|
||||
for resource_id, resource_quantity in firm.R:
|
||||
if resource_quantity <= firm.s_r: # 如果资源低于阈值,记录需求
|
||||
required_quantity = firm.S_r - resource_quantity
|
||||
# purchase_material_firms 用于记录需要补充材料的企业
|
||||
purchase_material_firms = {}
|
||||
|
||||
for i, (resource_id, resource_quantity) in enumerate(firm.R):
|
||||
# 对应位置的初始值
|
||||
init_quantity = firm.R1[i][1] # R1[i] = [resource_id, 初始数量]
|
||||
|
||||
if resource_quantity <= init_quantity * firm.s_r: # 判断阈值
|
||||
required_quantity = init_quantity * firm.S_r - resource_quantity
|
||||
|
||||
if firm not in purchase_material_firms:
|
||||
purchase_material_firms[firm] = []
|
||||
|
||||
purchase_material_firms[firm].append((resource_id, required_quantity))
|
||||
|
||||
# 寻找供应商并处理补货
|
||||
@@ -754,7 +758,7 @@ class MyModel(Model):
|
||||
# 检查设备残值,记录需要补充的设备
|
||||
for equipment in firm.C:
|
||||
equipment_id, equipment_quantity, equipment_salvage = equipment
|
||||
equipment_salvage -= firm.x # 减少设备残值
|
||||
equipment_salvage -= equipment_salvage*firm.x # 减少设备残值
|
||||
if equipment_salvage <= 0: # 如果残值小于等于 0
|
||||
equipment_quantity -= 1
|
||||
required_quantity = 1 # 需要补充的设备数量
|
||||
@@ -869,22 +873,29 @@ class MyModel(Model):
|
||||
else:
|
||||
self.int_stop_ts = self.t
|
||||
|
||||
def end(self):
|
||||
def end(self, ga_id=None):
|
||||
"""
|
||||
结束模型运行并保存结果。
|
||||
- 如果当前样本的结果未保存,则保存所有生产状态为非正常状态的结果。
|
||||
- 更新样本状态为完成,并记录相关信息。
|
||||
- 按照 (sample.id, ga_id) 双键标识每次运行。
|
||||
- 若该组合结果已存在,则不重复保存。
|
||||
- 更新样本状态。
|
||||
"""
|
||||
# 检查当前样本结果是否已存在
|
||||
if not db_session.query(Result).filter_by(s_id=self.sample.id).first():
|
||||
# 生成需要保存的结果列表
|
||||
# 1️⃣ 检查该 sample + ga_id 是否已有结果
|
||||
exists = db_session.query(Result).filter_by(
|
||||
s_id=self.sample.id,
|
||||
ga_id=ga_id
|
||||
).first()
|
||||
|
||||
if not exists:
|
||||
# 2️⃣ 构造要保存的结果列表
|
||||
lst_result_info = [
|
||||
Result(
|
||||
s_id=self.sample.id,
|
||||
id_firm=firm.unique_id,
|
||||
id_product=prod.unique_id,
|
||||
ts=ts,
|
||||
status=status
|
||||
status=status,
|
||||
ga_id=ga_id, # 标记当前代次
|
||||
)
|
||||
for firm in self.company_agents
|
||||
for prod, dct_status_supply in firm.dct_prod_up_prod_stat.items()
|
||||
@@ -892,13 +903,14 @@ class MyModel(Model):
|
||||
for status, ts in dct_status_supply['p_stat']
|
||||
]
|
||||
|
||||
# 批量保存结果到数据库
|
||||
# 3️⃣ 插入结果
|
||||
if lst_result_info:
|
||||
db_session.bulk_save_objects(lst_result_info)
|
||||
db_session.commit()
|
||||
|
||||
# 更新样本状态为已完成
|
||||
# 4️⃣ 更新样本状态
|
||||
self.sample.is_done_flag = 1
|
||||
self.sample.computer_name = platform.node()
|
||||
self.sample.stop_t = self.int_stop_ts
|
||||
db_session.commit()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user