遗传算法001

This commit is contained in:
Cricial
2025-10-18 16:16:05 +08:00
parent 91f2122b65
commit dfd5c5b32d
49 changed files with 8473 additions and 1825 deletions

View File

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