diff --git a/.idea/csv-editor.xml b/.idea/csv-editor.xml
index c775f95..f5b85e2 100644
--- a/.idea/csv-editor.xml
+++ b/.idea/csv-editor.xml
@@ -24,6 +24,13 @@
+
+
+
+
+
+
+
@@ -52,6 +59,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/__pycache__/controller_db.cpython-38.pyc b/__pycache__/controller_db.cpython-38.pyc
index 293cece..46bb379 100644
Binary files a/__pycache__/controller_db.cpython-38.pyc and b/__pycache__/controller_db.cpython-38.pyc differ
diff --git a/__pycache__/firm.cpython-38.pyc b/__pycache__/firm.cpython-38.pyc
index 17f3ddf..aac9f35 100644
Binary files a/__pycache__/firm.cpython-38.pyc and b/__pycache__/firm.cpython-38.pyc differ
diff --git a/__pycache__/my_model.cpython-38.pyc b/__pycache__/my_model.cpython-38.pyc
index 3615165..2a5336d 100644
Binary files a/__pycache__/my_model.cpython-38.pyc and b/__pycache__/my_model.cpython-38.pyc differ
diff --git a/__pycache__/product.cpython-38.pyc b/__pycache__/product.cpython-38.pyc
index d61ad03..6bd52dd 100644
Binary files a/__pycache__/product.cpython-38.pyc and b/__pycache__/product.cpython-38.pyc differ
diff --git a/controller_db.py b/controller_db.py
index 409056f..d4900a4 100644
--- a/controller_db.py
+++ b/controller_db.py
@@ -64,12 +64,13 @@ class ControllerDB:
# 行索引 (index):这一行在数据帧中的索引值。
# 行数据 (row):这一行的数据,是一个 pandas.Series 对象,包含该行的所有列和值。
- for _, row in firm.iterrows():
- code = row['Code']
- row = row['1':]
- for product_code in row.index[row == 1].to_list():
- dct = {code: [product_code]}
- list_dct.append(dct)
+ firm_industry=pd.read_csv("input_data/firm_industry_relation.csv")
+ firm_industry['Firm_Code'] = firm_industry['Firm_Code'].astype('string')
+ for _, row in firm_industry.iterrows():
+ code = row['Firm_Code']
+ row = row['Product_Code']
+ dct = {code: [row]}
+ list_dct.append(dct)
# fill g_bom
# 结点属性值 相当于 图上点的 原始 产品名称
diff --git a/firm.py b/firm.py
index 41aa190..567e7ec 100644
--- a/firm.py
+++ b/firm.py
@@ -2,21 +2,54 @@ from mesa import Agent
class FirmAgent(Agent):
- def __init__(self, unique_id, model, type_region, revenue_log, a_lst_product):
+ def __init__(self, unique_id, model, type_region, revenue_log, n_equip_c, a_lst_product,
+ production_output, demand_quantity, c_price, R, P, C):
# 调用超类的 __init__ 方法
super().__init__(unique_id, model)
# 初始化模型中的网络引用
self.firm_network = self.model.firm_network
self.product_network = self.model.product_network
-
# 初始化代理自身的属性
self.type_region = type_region
-
self.size_stat = []
self.dct_prod_up_prod_stat = {}
self.dct_prod_capacity = {}
-
+ # 企业涉及的产业
+ self.indus_i = a_lst_product
+ # 各资源库存信息,库存资源,库存量
+ self.R = R
+ # 包括库存时间的值 方便后面统计
+ self.R1 = {0: R}
+ # 设备资产信息,持有设备,设备数量, 增加 设备残值 [[1,2,3],[] ]
+ self.C = C
+ # 包括设备时间步的值
+ self.C1 = {0: C}
+ # 复制一份
+ self.C0 = C
+ # 产品库存信息 库存产品,库存量 ID 数量
+ self.P = P
+ # 包括 产品时间
+ self.P1={0:P}
+ # 企业i的供应商
+ self.upper_i = [u for u, v in self.firm_network.in_edges(self.unique_id)]
+ # 企业i的客户
+ self.downer_i = [u for u, v in self.firm_network.out_edges(self.unique_id)]
+ # 设备c的数量 (总量) 使用这个来判断设备数量
+ self.n_equip_c = n_equip_c
+ # 设备c产量 更具设备量进行估算
+ self.c_yield = production_output
+ # 消耗材料量 根据设备量进行估算
+ self.c_consumption = demand_quantity
+ # 设备c购买价格(初始值)
+ self.c_price = c_price
+ # 资源r补货库存阈值
+ self.s_r = 40
+ self.S_r = 120
+ # 设备补货阙值 可选
+ # self.ss_r = 70
+ # 每一个周期步减少残值:x
+ self.x = 20
# 试验中的参数
self.dct_n_trial_up_prod_disrupted = {}
self.dct_cand_alt_supp_up_prod_disrupted = {}
@@ -200,6 +233,89 @@ class FirmAgent(Agent):
else:
down_firm.dct_cand_alt_supp_up_prod_disrupted[product].remove(self)
+ def seek_material_supply(self, material_type):
+ lst_firm_material_connect = [] # 符合条件 可选择的上游
+ upper_i_material = [] # 特定 资源的上游 企业集合
+ for firm in self.upper_i:
+ for sub_list in firm.R:
+ if sub_list[0] == material_type:
+ upper_i_material.append(firm)
+ # 没有 上游 没有 材料的情况,也就是紊乱的情况
+ # if len(upper_i_material)==0:
+
+ if self.is_prf_conn:
+ for firm in upper_i_material:
+ if self.firm_network.has_edge(self.unique_id, firm.unique_id) or self.firm_network.has_edge(
+ firm.unique_id, self.unique_id):
+ lst_firm_material_connect.append(firm)
+ if len(lst_firm_material_connect) == 0:
+ if self.is_prf_size:
+ lst_size = [firm.size_stat[-1][0] for firm in upper_i_material]
+ lst_prob = [size / sum(lst_size) for size in lst_size]
+ select_alt_supply = \
+ self.random.choices(upper_i_material, weights=lst_prob)[0]
+ else:
+ select_alt_supply = self.random.choice(upper_i_material)
+ elif len(lst_firm_material_connect) > 0:
+ if self.is_prf_size:
+ lst_firm_size = [firm.size_stat[-1][0] for firm in lst_firm_material_connect]
+ lst_prob = [size / sum(lst_firm_size) for size in lst_firm_size]
+ select_alt_supply = self.random.choices(lst_firm_material_connect, weights=lst_prob)[0]
+ else:
+ select_alt_supply = self.random.choice(lst_firm_material_connect)
+ return select_alt_supply
+
+ def seek_machinery_supply(self, machinery_type):
+ lst_firm_machinery_connect = [] # 符合条件 可选择的上游
+ upper_i_machinery = [] # 特定 资源的上游 企业集合
+ for firm in self.upper_i:
+ for sub_list in firm.R:
+ if sub_list[0] == machinery_type:
+ upper_i_machinery.append(firm)
+ # 没有 上游 没有 材料的情况,也就是紊乱的情况
+ # if len(upper_i_machinery)==0:
+
+ if self.is_prf_conn:
+ for firm in upper_i_machinery:
+ if self.firm_network.has_edge(self.unique_id, firm.unique_id) or self.firm_network.has_edge(
+ firm.unique_id, self.unique_id):
+ lst_firm_machinery_connect.append(firm)
+ if len(lst_firm_machinery_connect) == 0:
+ if self.is_prf_size:
+ lst_size = [firm.size_stat[-1][0] for firm in upper_i_machinery]
+ lst_prob = [size / sum(lst_size) for size in lst_size]
+ select_alt_supply = \
+ self.random.choices(upper_i_machinery, weights=lst_prob)[0]
+ else:
+ select_alt_supply = self.random.choice(upper_i_machinery)
+ elif len(lst_firm_machinery_connect) > 0:
+ if self.is_prf_size:
+ lst_firm_size = [firm.size_stat[-1][0] for firm in lst_firm_machinery_connect]
+ lst_prob = [size / sum(lst_firm_size) for size in lst_firm_size]
+ select_alt_supply = self.random.choices(lst_firm_machinery_connect, weights=lst_prob)[0]
+ else:
+ select_alt_supply = self.random.choice(lst_firm_machinery_connect)
+ return select_alt_supply
+
+ def handle_material_request(self, material_list):
+ for list in self.P:
+ if list[0] == material_list[0]:
+ list[1] -= material_list[1]
+
+ def handle_machinery_request(self, machinery_list):
+ for list in self.C:
+ if list[0] == machinery_list[0]:
+ list[1] -= machinery_list[1]
+
+ def refresh_R(self):
+ self.R1[self.model.t] = self.R
+
+ def refresh_C(self):
+ self.C1[self.model.t] = self.C
+
+ def refresh_P(self):
+ self.P1[self.model.t] = self.P
+
def clean_before_trial(self):
self.dct_request_prod_from_firm = {}
diff --git a/input_data/Firm_amended.csv b/input_data/Firm_amended.csv
index 9561f52..55bac16 100644
--- a/input_data/Firm_amended.csv
+++ b/input_data/Firm_amended.csv
@@ -169,4 +169,4 @@
167,SZ,2021,78220000000,24.43927396,41100000000,L,9.500843462,13371,qichacha,Non_Beijing,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
168,SH,2021,10350000000,22.23155657,4519000000,L,8.528528701,5057,qichacha,Non_Beijing,,,,1,,,,,,,,,,,,,,,,,,1,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,1
169,SH,2021,2.30233E+11,24.27012079,34704000000,L,8.55120807,5173,qichacha,Non_Beijing,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-170,,,,18.42068074,100000000,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+170,,,,18.42068074,100000000,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
\ No newline at end of file
diff --git a/input_data/firm_industry_relation.csv b/input_data/firm_industry_relation.csv
new file mode 100644
index 0000000..3dcc5e8
--- /dev/null
+++ b/input_data/firm_industry_relation.csv
@@ -0,0 +1,476 @@
+Firm_Code,Product_Code
+0,1.4.4
+1,2.1.1.5
+2,1.1.3
+3,1.3.1.4
+3,1.3.1.5
+3,1.3.1.6
+3,1.3.4.1
+4,1.2.2
+5,1.4.5.3
+5,1.4.5.4
+5,1.4.5.5
+5,1.4.5.9
+6,1.3.1.2
+6,2.1.2.1
+6,2.1.2.2
+6,2.1.2.3
+6,2.1.2.4
+7,2.2
+8,1.4.1.1
+9,1.3.3.6
+9,1.3.3.7
+10,1.3.3.5
+11,1.4.4.2
+12,1.2.1
+13,1.2.2
+13,2.1.3.1
+13,2.1.3.2
+13,2.1.3.3
+13,2.1.3.4
+13,2.1.3.5
+13,2.1.3.6
+13,2.1.3.7
+13,2.1.4.1.1
+13,2.1.4.1.2
+13,2.1.4.1.3
+13,2.1.4.1.4
+13,2.1.4.2.1
+13,2.1.4.2.2
+13,2.3.1
+13,2.3.2
+13,2.3.3
+14,1.3.3.4
+14,1.3.4.3
+15,1.3.3.5
+16,1.1.3
+16,2.3.1
+16,2.3.2
+16,2.3.3
+17,1.4.2.4
+18,1.3.3.2
+19,1.4.2.1
+20,1.3.1.2
+21,1.3.1.3
+22,1.2.1
+22,1.2.2
+22,1.3.3.6
+22,2.1.1.1
+22,2.1.1.2
+22,2.1.1.3
+22,2.1.1.4
+22,2.1.1.5
+22,2.1.3.1
+22,2.1.3.2
+22,2.1.3.3
+22,2.1.3.4
+22,2.1.3.5
+22,2.1.3.6
+22,2.1.3.7
+22,2.1.4.1.1
+22,2.1.4.1.2
+22,2.1.4.1.3
+22,2.1.4.1.4
+22,2.1.4.2.1
+22,2.1.4.2.2
+22,2.3.1
+22,2.3.2
+22,2.3.3
+23,1.1.2
+23,1.3.3.1
+23,1.3.3.2
+23,1.3.3.3
+23,1.3.3.4
+23,1.4.2.7
+23,2.1.3.6
+23,2.3.1
+23,2.3.2
+23,2.3.3
+24,1.1.1
+25,1.3.1.7
+26,2.1.3.1
+26,2.1.3.2
+26,2.1.3.3
+26,2.1.3.4
+26,2.1.3.5
+26,2.1.3.6
+26,2.1.3.7
+27,1.4.4.2
+28,2.2
+29,1.3
+30,1.4.2.6
+31,1.3.3.3
+31,2.1.4.1.1
+31,2.1.4.1.2
+31,2.1.4.1.3
+31,2.1.4.1.4
+31,2.1.4.2.1
+31,2.1.4.2.2
+32,1.2.3
+33,2.1.2.1
+33,2.1.2.2
+33,2.1.2.3
+33,2.1.2.4
+34,1.3.3.3
+35,1.1.3
+36,1.1.1
+37,1.4.1.2
+37,1.4.1.4
+37,1.4.2.2
+37,1.4.3.1
+37,1.4.4.3
+37,1.4.5.2
+38,2.1.1.1
+38,2.1.1.2
+38,2.1.1.3
+38,2.1.1.4
+38,2.1.1.5
+39,1.3.1
+40,1.4.2.1
+40,1.4.2.5
+40,1.4.3.3
+40,1.4.4
+41,1.4.1.2
+41,1.4.1.5
+41,1.4.3.1
+41,1.4.3.2
+41,1.4.3.4
+41,1.4.3.5
+41,1.4.5
+42,1.3.1.1
+42,1.3.1.3
+42,1.3.1.4
+43,1.3.1.5
+43,1.3.1.6
+44,1.1.1
+45,1.3.3.1
+45,1.3.4.1
+45,1.3.4.2
+45,2.1.4.1.1
+45,2.1.4.1.2
+45,2.1.4.1.3
+45,2.1.4.1.4
+45,2.1.4.2.1
+45,2.1.4.2.2
+46,1.3.1.2
+47,2.1.1.1
+47,2.1.1.2
+47,2.1.1.3
+47,2.1.1.4
+47,2.1.2.1
+47,2.1.2.2
+47,2.1.2.3
+47,2.1.2.4
+47,2.1.3.6
+48,1.2.2
+49,1.3.1.1
+49,1.3.1.4
+49,1.3.1.6
+49,1.3.3.1
+49,2.1.2.1
+49,2.1.2.2
+49,2.1.2.3
+49,2.1.2.4
+50,1.3.1.5
+51,1.4.2.1
+52,1.4.5.5
+53,1.4.1.3
+53,1.4.1.4
+53,1.4.1.5
+53,1.4.2.3
+53,1.4.2.4
+53,1.4.3.3
+53,1.4.3.4
+53,1.4.3.5
+53,1.4.3.6
+53,1.4.4.4
+53,1.4.5.2
+53,1.4.5.3
+53,1.4.5.6
+53,1.4.5.7
+53,1.4.5.8
+54,1.4.1.3
+54,1.4.2.4
+54,1.4.4.3
+55,1.4.1.1
+55,1.4.1.2
+55,1.4.1.3
+55,1.4.2.1
+55,1.4.2.2
+55,1.4.4.4
+56,1.1.1
+56,1.3.1.7
+57,1.3.3.3
+57,2.3.1
+57,2.3.2
+57,2.3.3
+58,1.2.2
+58,1.3.1.6
+58,1.3.2
+58,1.3.4.1
+58,1.3.4.2
+58,1.3.4.3
+58,2.1.2
+59,1.4.2.5
+60,2.1.1.1
+60,2.1.1.2
+60,2.1.1.3
+60,2.1.1.4
+60,2.1.1.5
+61,1.3.3.3
+62,1.3.1.2
+62,2.1.2.1
+62,2.1.2.2
+62,2.1.2.3
+62,2.1.2.4
+63,1.4.1.1
+63,1.4.2.4
+63,1.4.4.5
+64,1.1.2
+65,1.2.1
+66,1.2.1
+67,1.2
+68,1.3.1.1
+68,1.3.1.2
+68,1.3.1.3
+69,1.1.1
+70,1.3.3.2
+70,1.3.3.4
+71,1.3.1.2
+72,1.3.1.2
+73,2.1.3
+74,1.3.3.2
+74,2.1.3
+75,1.3.3
+76,1.3.1.3
+77,1.3.3.6
+77,1.3.4
+78,2.1.1.1
+78,2.1.1.2
+78,2.1.1.3
+78,2.1.1.4
+78,2.1.1.5
+79,1.3.1.1
+79,1.3.1.4
+79,1.3.1.6
+79,2.1.2
+79,2.1.3.1
+79,2.1.3.2
+79,2.1.3.3
+79,2.1.3.4
+79,2.1.3.5
+79,2.1.3.6
+79,2.1.3.7
+79,2.1.4.1
+79,2.1.4.2
+79,2.3.1
+79,2.3.2
+79,2.3.3
+80,1.3.4
+80,2.1.1
+81,1.3.4
+81,2.1.2
+81,2.1.4.1
+81,2.1.4.2
+82,2.1.2.1
+82,2.1.2.2
+82,2.1.2.3
+82,2.1.2.4
+83,1.3.3.2
+84,2.1.2
+84,2.1.4
+84,2.3
+85,1.3.1
+85,2.1.1
+86,1.1
+87,1.1.1
+88,1.1.3
+89,1.1.2
+89,1.2.1
+89,1.3.3.1
+90,1.3.1.7
+91,1.2.1
+92,1.3.3.4
+93,1.3.1
+94,1.1
+95,1.2.3
+95,2.3
+96,1.2.1
+96,1.2.3
+97,1.2
+97,1.3.3
+97,2.1.3
+98,2
+99,1.1.2
+99,1.2.1
+99,1.3.1
+99,1.3.3
+99,2.1
+99,2.3
+100,1.3.1
+101,1.1.1
+102,2
+102,2.1.4
+103,1.1.1
+104,1.1.1
+105,1.1
+106,1.1
+106,1.2
+106,1.3
+106,2.1.1
+106,2.1.3
+106,2.2
+107,1.4.3.3
+108,2.1.3
+108,2.2
+109,1.3.3.1
+110,1.3.3.5
+111,1.3.1.6
+111,1.3.3.1
+111,1.3.4.1
+112,1.3.3.7
+113,1.1.1
+114,1.3.5.1
+115,1.1.3
+115,2.1.4
+116,1.3.1.7
+117,2.1.1.1
+117,2.1.1.2
+117,2.1.1.3
+117,2.1.1.4
+117,2.1.1.5
+117,2.1.4.1.1
+117,2.1.4.1.2
+117,2.1.4.1.3
+117,2.1.4.1.4
+117,2.1.4.2.1
+117,2.1.4.2.2
+118,1.3.3.6
+119,1.3.1.1
+120,1.2.3
+121,1.4.2.4
+122,1.4.2.6
+123,1.1.2
+124,1.2.1
+124,2.3
+125,1.2.3
+126,1.1
+126,1.2
+126,1.4
+126,2.1.1.5
+126,2.1.3
+126,2.2
+126,2.3
+127,1.1.1
+127,1.1.3
+128,1.1.2
+129,1.1.2
+129,1.2.3
+130,1.3.2
+130,1.3.4.1
+130,1.3.4.2
+130,1.3.4.3
+130,1.3.5
+131,2.1.1.1
+131,2.1.1.2
+131,2.1.1.3
+131,2.1.1.4
+131,2.1.1.5
+132,1.3.3.2
+133,1.4.1.3
+133,1.4.4.1
+134,1.3.3.5
+135,1.1.3
+135,1.3.2.1
+135,1.3.4.1
+135,2.1.3.1
+135,2.1.3.2
+135,2.1.3.3
+135,2.1.3.4
+135,2.1.3.5
+135,2.1.3.6
+135,2.1.3.7
+135,2.2
+136,1.2.1
+137,2.1.4.1.1
+137,2.1.4.1.2
+137,2.1.4.1.3
+137,2.1.4.1.4
+137,2.1.4.2.1
+137,2.1.4.2.2
+138,1.3.1.5
+139,1.3.3.7
+140,1.4.1.1
+140,1.4.1.4
+140,1.4.1.5
+140,1.4.5.1
+140,1.4.5.3
+140,1.4.5.4
+140,1.4.5.9
+141,1.3.3.2
+142,1.4.1.1
+142,1.4.2
+142,1.4.3
+143,2.1.1.1
+143,2.1.1.2
+143,2.1.1.3
+143,2.1.1.4
+143,2.1.1.5
+144,2.1.2.1
+144,2.1.2.2
+144,2.1.2.3
+144,2.1.2.4
+145,1.3.1.4
+146,1.3.1.1
+147,1.1.2
+148,2.1.1
+148,2.1.3
+148,2.2
+149,2.1.2.1
+149,2.1.2.2
+149,2.1.2.3
+149,2.1.2.4
+150,1.1.1
+151,1.3.5.1
+152,1.4.4.1
+153,1.3.1.1
+153,1.3.1.4
+154,2.1.4.1.1
+154,2.1.4.1.2
+154,2.1.4.1.3
+154,2.1.4.1.4
+154,2.1.4.2.1
+154,2.1.4.2.2
+155,2.3
+156,1.3.1.7
+157,1.4.1
+158,1.4.4.1
+159,2.1.2
+160,1.4.1.3
+161,2.3.1
+161,2.3.2
+161,2.3.3
+162,1.4.5.6
+162,1.4.5.7
+163,2.1.4.1.1
+163,2.1.4.1.2
+163,2.1.4.1.3
+163,2.1.4.1.4
+163,2.1.4.2.1
+163,2.1.4.2.2
+164,1.3.3.6
+165,2.1.2.1
+165,2.1.2.2
+165,2.1.2.3
+165,2.1.2.4
+166,1.2.3
+167,1.1.1
+168,1.1.2
+168,1.3.3.1
+168,1.3.3.2
+168,1.3.3.4
+168,2.3.1
+168,2.3.2
+168,2.3.3
+169,1.1.1
+170,1
diff --git a/input_data/xv_with_exp.csv b/input_data/xv_with_exp.csv
index 0730991..b2d8ff3 100644
--- a/input_data/xv_with_exp.csv
+++ b/input_data/xv_with_exp.csv
@@ -2,4 +2,4 @@
7,TRUE,TRUE,uniform,5,0.3,3,3
5,FALSE,FALSE,normal,10,0.5,5,2
3,,,,15,0.7,7,1
-,,
\ No newline at end of file
+,,,,,
\ No newline at end of file
diff --git a/input_data/测试 BomNodes.csv b/input_data/测试 BomNodes.csv
new file mode 100644
index 0000000..157bf18
--- /dev/null
+++ b/input_data/测试 BomNodes.csv
@@ -0,0 +1,108 @@
+Index,Code,Level,Name,产业种类
+0,1,0,工业互联网,0
+1,1.1,1,工业自动化硬件,1
+2,1.1.1,2,工业计算芯片,0
+3,1.1.2,2,工业控制器,0
+4,1.1.3,2,工业服务器,0
+5,1.2,1,工业互联网网络,1
+6,1.2.1,2,网络互联服务,0
+7,1.2.2,2,标识解析服务,0
+8,1.2.3,2,数据互通服务,0
+9,1.3,1,工业软件,1
+10,1.3.1,2,设计研发软件,0
+11,1.3.1.1,3,计算机辅助设计CAD,0
+12,1.3.1.2,3,计算机辅助工程CAE,0
+13,1.3.1.3,3,计算机辅助制造CAM,0
+14,1.3.1.4,3,计算机辅助工艺过程设计CAPP,0
+15,1.3.1.5,3,产品数据管理PDM,1
+16,1.3.1.6,3,产品生命周期管理PLM,1
+17,1.3.1.7,3,电子设计自动化EDA,1
+18,1.3.2,2,采购供应软件,1
+19,1.3.2.1,3,供应链管理SCM,1
+20,1.3.3,2,生产制造软件,1
+21,1.3.3.1,3,制造执行系统MES,1
+22,1.3.3.2,3,分布式控制系统DCS,0
+23,1.3.3.3,3,数据采集与监视控制系统SCADA,1
+24,1.3.3.4,3,可编程逻揖控制系统PLC,1
+25,1.3.3.5,3,企业资产管理系统EAM,1
+26,1.3.3.6,3,运维保障系统MRO,1
+27,1.3.3.7,3,故障预测与健康管理PHM,1
+28,1.3.4,2,企业运营管理软件,1
+29,1.3.4.1,3,企业资源计划ERP,1
+30,1.3.4.2,3,客户关系管理CRM,1
+31,1.3.4.3,3,人力资源管理HRM,1
+32,1.3.5,2,仓储物流软件,0
+33,1.3.5.1,3,仓储物流管理WMS,1
+34,1.4,1,工业互联网安全管理,1
+35,1.4.1,2,设备安全,1
+36,1.4.1.1,3,工业防火墙,1
+37,1.4.1.2,3,下一代防火墙,0
+38,1.4.1.3,3,防毒墙,1
+39,1.4.1.4,3,入侵检测系统,1
+40,1.4.1.5,3,统一威胁管理系统,1
+41,1.4.2,2,控制安全,1
+42,1.4.2.1,3,工控安全监测与审计,1
+43,1.4.2.2,3,工控主机卫士,1
+44,1.4.2.3,3,工控漏洞扫描,0
+45,1.4.2.4,3,安全隔离与信息交换系统,1
+46,1.4.2.5,3,安全日志与审计,1
+47,1.4.2.6,3,隐私计算,1
+48,1.4.2.7,3,工控原生安全,1
+49,1.4.3,2,网络安全,1
+50,1.4.3.1,3,网络漏洞扫描和补丁管理,0
+51,1.4.3.2,3,流量检测,1
+52,1.4.3.3,3,APT检测,0
+53,1.4.3.4,3,攻击溯源,0
+54,1.4.3.5,3,负载均衡,1
+55,1.4.3.6,3,沙箱类设备,0
+56,1.4.4,2,平台安全,1
+57,1.4.4.1,3,身份鉴别与访问控制,0
+58,1.4.4.2,3,密钥管理,0
+59,1.4.4.3,3,接入认证,0
+60,1.4.4.4,3,工业应用行为监控,1
+61,1.4.4.5,3,安全态势感知,0
+62,1.4.5,2,数据安全,0
+63,1.4.5.1,3,恶意代码检测系统,1
+64,1.4.5.2,3,数据防泄漏系统,1
+65,1.4.5.3,3,数据审计系统,0
+66,1.4.5.4,3,数据脱敏,1
+67,1.4.5.5,3,敏感数据发现与监控,0
+68,1.4.5.6,3,数据容灾备份,0
+69,1.4.5.7,3,数据恢复,1
+70,1.4.5.8,3,数据加密,1
+71,1.4.5.9,3,数据防火墙,0
+72,2,0,工业互联网平台,1
+73,2.1,1,PaaS,0
+74,2.1.1,2,开发工具,1
+75,2.1.1.1,3,算法建模工具,1
+76,2.1.1.2,3,低代码开发工具,0
+77,2.1.1.3,3,流程开发工具,1
+78,2.1.1.4,3,组态建模工具,1
+79,2.1.1.5,3,数字孪生建模工具,1
+80,2.1.2,2,工业模型库,1
+81,2.1.2.1,3,数据算法模型,0
+82,2.1.2.2,3,业务流程模型,0
+83,2.1.2.3,3,研发仿真模型,0
+84,2.1.2.4,3,行业机理模型,1
+85,2.1.3,2,工业物联网,1
+86,2.1.3.1,3,物联网服务,0
+87,2.1.3.2,3,平台基础服务,1
+88,2.1.3.3,3,工业引擎服务,1
+89,2.1.3.4,3,应用管理服务,1
+90,2.1.3.5,3,容器服务,1
+91,2.1.3.6,3,微服务,1
+92,2.1.3.7,3,制造类API,0
+93,2.1.4,2,工业大数据,1
+94,2.1.4.1,3,工业大数据存储,1
+95,2.1.4.1.1,4,关系型数据库,0
+96,2.1.4.1.2,4,分布式数据库,1
+97,2.1.4.1.3,4,实时数据库,0
+98,2.1.4.1.4,4,时序数据库,0
+99,2.1.4.2,3,工业大数据管理,0
+100,2.1.4.2.1,4,数据质量管理,1
+101,2.1.4.2.2,4,数据安全管理,1
+102,2.2,1,IaaS,0
+103,2.3,1,边缘层,0
+104,2.3.1,2,工业数据接入,0
+105,2.3.2,2,边缘数据处理,0
+106,2.3.3,2,协议转换,1
diff --git a/input_data/测试 Firm_amended 170.csv b/input_data/测试 Firm_amended 170.csv
new file mode 100644
index 0000000..a8bd955
--- /dev/null
+++ b/input_data/测试 Firm_amended 170.csv
@@ -0,0 +1,171 @@
+Code,Company Name,原材料,库存商品,设备数量,Revenue,Total Employees (People),Type_Region,Self-supply Business (Yes/No),Revenue_Log,production_output,demand_quantity
+1,Company_1,284.02,982.67,452.15,29692.44,963,Suburban,Yes,10.298647746934053,204.215,481.402
+2,Company_2,591.75,232.7,597.47,37552.56,222,Urban,No,10.533496830634064,553.747,253.175
+3,Company_3,514.2,466.73,388.52,23557.62,355,Urban,No,10.067204613987071,227.852,377.42
+4,Company_4,893.84,633.71,580.73,89135.78,496,Urban,No,11.397916104118977,221.073,483.384
+5,Company_5,306.54,844.63,474.67,60818.82,117,Suburban,Yes,11.015654559530484,391.467,209.654
+6,Company_6,830.89,831.11,177.37,73695.09,279,Rural,No,11.207691454519859,372.737,473.089
+7,Company_7,483.95,603.67,603.02,73826.05,832,Rural,Yes,11.209466929335226,186.302,485.395
+8,Company_8,483.1,525.24,116.64,83568.26,242,Rural,Yes,11.333419061909991,437.664,500.31
+9,Company_9,958.73,267.31,682.18,36015.98,351,Suburban,No,10.491718007837608,433.217,460.873
+10,Company_10,946.82,215.02,393.99,26255.05,324,Suburban,No,10.175613630469309,472.399,381.682
+11,Company_11,454.76,689.55,232.49,84782.37,81,Suburban,Yes,11.3478428992222,243.249,260.476
+12,Company_12,323.83,177.09,624.04,26639.31,170,Suburban,No,10.19014322341799,321.404,148.382
+13,Company_13,425.17,396.05,274.2,31290.59,265,Rural,No,10.351072692349652,287.42,490.517
+14,Company_14,109.55,739.42,406.11,87814.36,788,Suburban,No,11.38298031978054,148.611,401.955
+15,Company_15,202.82,923.13,100.91,43238.15,487,Suburban,No,10.674478486379028,210.091,336.282
+16,Company_16,160.02,615.97,486.87,32433.19,658,Urban,No,10.386937560174536,327.687,459.002
+17,Company_17,292.47,762.76,981.28,22436.39,755,Rural,Yes,10.018439473254828,433.128,232.247
+18,Company_18,331.51,800.32,145.21,65352.83,631,Rural,Yes,11.087556023393986,388.521,358.151
+19,Company_19,508.01,104.76,862.05,67955.82,579,Rural,No,11.126613067125563,576.205,465.801
+20,Company_20,484.81,906.52,943.38,70611.44,692,Urban,No,11.164947450014383,325.33799999999997,513.481
+21,Company_21,769.67,739.38,736.02,76562.51,383,Suburban,Yes,11.245862810333419,455.602,197.96699999999998
+22,Company_22,533.36,234.46,657.71,38283.05,722,Urban,No,10.552762518463977,416.771,354.336
+23,Company_23,641.84,872.33,487.84,42673.07,791,Suburban,Yes,10.661323321098049,183.784,208.184
+24,Company_24,700.51,197.06,621.79,66410.79,503,Urban,No,11.10361482226283,257.179,341.051
+25,Company_25,628.84,292.82,571.1,72622.08,997,Urban,No,11.19302428680546,240.11,317.884
+26,Company_26,653.23,970.24,221.15,81298.66,667,Suburban,No,11.305884813235249,382.115,371.323
+27,Company_27,747.52,130.58,938.29,73435.38,990,Urban,No,11.204161114818818,214.829,339.752
+28,Company_28,878.41,322.67,211.96,77726.12,556,Rural,No,11.260946644601198,438.196,371.841
+29,Company_29,758.14,433.16,956.4,33200.84,568,Suburban,No,10.410330455789328,458.64,510.81399999999996
+30,Company_30,916.25,613.21,455.27,43485.34,347,Rural,No,10.680179148781386,252.527,267.625
+31,Company_31,900.34,969.81,394.83,50244.63,433,Rural,No,10.824658954539137,373.483,322.034
+32,Company_32,996.22,755.3,640.05,33162.77,550,Urban,No,10.409183140139199,514.005,450.622
+33,Company_33,515.17,844.15,161.39,57032.93,853,Rural,Yes,10.951384099299384,272.139,470.517
+34,Company_34,540.93,578.49,650.09,74078.09,806,Suburban,Yes,11.21287508605031,236.00900000000001,334.093
+35,Company_35,366.24,940.41,849.01,19617.56,483,Rural,Yes,9.884180362490643,519.901,169.624
+36,Company_36,405.22,450.03,380.13,11929.17,371,Rural,No,9.386741940165397,290.013,425.522
+37,Company_37,760.77,517.35,208.94,86851.29,464,Suburban,No,11.371952624754107,145.894,425.077
+38,Company_38,818.17,404.74,315.82,78053.26,201,Suburban,Yes,11.265146693168688,265.582,258.817
+39,Company_39,586.03,697.5,155.23,42210.17,931,Suburban,No,10.650416466250073,158.523,523.603
+40,Company_40,814.27,687.38,477.47,18756.58,673,Urban,Yes,9.839299903169191,295.747,192.427
+41,Company_41,872.52,234.9,598.33,33207.98,178,Urban,No,10.410545487468179,269.833,469.252
+42,Company_42,318.98,744.42,671.43,45471.87,404,Rural,No,10.72484917199056,178.143,350.898
+43,Company_43,453.11,750.88,926.15,99013.81,875,Suburban,No,11.503014614337706,490.615,434.311
+44,Company_44,130.39,274.92,629.0,13707.42,384,Urban,Yes,9.525692571040127,474.9,479.039
+45,Company_45,578.76,368.08,890.9,26604.81,901,Rural,No,10.188847305490215,324.09000000000003,202.876
+46,Company_46,265.4,987.58,137.93,39924.26,335,Suburban,No,10.594739438158781,349.793,331.54
+47,Company_47,743.33,304.14,867.21,90417.33,567,Urban,Yes,11.412191231547315,371.721,453.33299999999997
+48,Company_48,873.08,651.74,589.46,49837.92,599,Urban,Yes,10.816531419043114,371.946,299.308
+49,Company_49,797.72,610.35,866.25,71390.29,680,Urban,Yes,11.17591714468184,317.625,432.772
+50,Company_50,173.31,403.93,398.59,19134.31,577,Rural,No,9.859238337632949,383.859,427.331
+51,Company_51,713.05,943.63,786.47,33400.45,814,Suburban,No,10.416324651927923,242.647,554.305
+52,Company_52,769.5,939.62,827.64,15891.9,622,Urban,No,9.673564824440492,500.764,351.95
+53,Company_53,424.01,131.65,979.59,68631.67,998,Rural,Yes,11.13650936898853,240.959,315.401
+54,Company_54,923.68,474.15,214.87,18889.97,631,Suburban,Yes,9.84638637235242,403.487,459.368
+55,Company_55,671.6,928.96,584.73,93556.96,965,Suburban,No,11.446325727652052,191.473,350.15999999999997
+56,Company_56,740.88,450.42,624.08,75711.44,741,Rural,Yes,11.234684550861001,524.408,318.08799999999997
+57,Company_57,409.56,660.05,574.35,30617.71,416,Rural,No,10.32933387869449,211.435,536.956
+58,Company_58,436.2,294.82,599.98,78445.43,977,Urban,Yes,11.270158502799614,276.998,387.62
+59,Company_59,516.54,770.6,290.97,37174.96,441,Suburban,Yes,10.523390695335847,419.097,475.654
+60,Company_60,721.93,305.6,412.97,98848.66,842,Urban,Yes,11.501345272614115,316.297,280.193
+61,Company_61,712.26,395.66,391.41,92570.96,996,Urban,No,11.435730764537892,151.14100000000002,496.226
+62,Company_62,498.75,142.06,747.78,71608.94,917,Rural,Yes,11.178975205489529,536.778,380.875
+63,Company_63,623.33,901.33,397.15,23513.3,567,Suburban,Yes,10.065321497485543,362.715,297.333
+64,Company_64,263.36,133.88,830.99,20195.09,241,Urban,Yes,9.913194784536234,392.099,319.336
+65,Company_65,479.22,672.42,688.79,41600.33,951,Suburban,No,10.635863378910198,528.879,334.922
+66,Company_66,586.48,947.72,733.06,13215.54,624,Rural,Yes,9.489148688859606,487.306,478.648
+67,Company_67,145.29,158.54,178.11,64118.35,910,Rural,Yes,11.068485873391767,260.811,258.529
+68,Company_68,267.7,992.49,846.41,83839.88,127,Urban,No,11.336664068256136,552.641,188.77
+69,Company_69,207.33,621.93,942.4,54187.36,793,Suburban,Yes,10.900202949897876,349.24,518.733
+70,Company_70,107.17,406.95,154.29,15249.9,383,Suburban,Yes,9.632328224637009,506.429,294.717
+71,Company_71,835.06,230.35,568.8,91044.0,294,Rural,No,11.419098185126074,318.88,291.506
+72,Company_72,149.12,861.62,775.5,97301.35,155,Urban,No,11.485568142692438,360.55,156.912
+73,Company_73,385.5,741.6,846.34,19971.89,201,Rural,Yes,9.902081063894537,205.63400000000001,445.55
+74,Company_74,363.13,524.32,314.91,46296.94,763,Rural,Yes,10.742831147177496,255.491,284.313
+75,Company_75,647.69,363.06,973.17,77340.29,460,Urban,No,11.25597031483101,381.317,278.769
+76,Company_76,439.41,498.97,944.89,30625.18,754,Rural,Yes,10.329577825380776,526.489,258.94100000000003
+77,Company_77,466.64,397.98,979.11,86794.57,418,Rural,Yes,11.371299341087946,417.911,347.664
+78,Company_78,641.64,202.48,850.07,29307.04,807,Urban,No,10.285583039181757,259.007,379.164
+79,Company_79,732.01,600.48,239.65,93479.02,864,Rural,Yes,11.445492305071953,246.965,195.201
+80,Company_80,922.97,177.28,277.08,83955.43,883,Urban,Yes,11.33804134177189,500.70799999999997,222.297
+81,Company_81,627.27,621.58,542.03,87676.13,277,Urban,No,11.38140496343402,546.203,518.727
+82,Company_82,165.15,637.29,220.57,35181.96,313,Urban,Yes,10.468288730213176,371.057,246.515
+83,Company_83,819.04,221.6,785.02,16422.34,471,Urban,No,9.706397881988158,424.502,273.904
+84,Company_84,495.01,235.24,793.64,18346.41,797,Suburban,No,9.817189194015675,465.36400000000003,229.501
+85,Company_85,189.98,626.37,530.14,49793.11,669,Suburban,No,10.815631900027373,492.014,420.998
+86,Company_86,786.61,983.8,224.61,27511.88,420,Urban,No,10.222373190369527,296.461,200.661
+87,Company_87,775.36,813.93,242.21,94867.05,336,Rural,Yes,11.460231716720575,458.221,433.536
+88,Company_88,316.03,569.38,505.27,31548.83,265,Suburban,Yes,10.35929178328807,307.527,299.603
+89,Company_89,411.42,968.1,873.75,17001.83,274,Suburban,No,9.741076264303647,220.375,534.142
+90,Company_90,360.91,720.1,917.41,33781.07,582,Suburban,Yes,10.427655865407793,473.741,252.091
+91,Company_91,358.16,611.27,878.08,94174.16,361,Urban,Yes,11.452901112955821,500.808,146.816
+92,Company_92,353.58,598.11,973.92,46314.41,797,Suburban,No,10.743208422753485,540.392,251.358
+93,Company_93,796.81,261.4,254.01,36160.77,589,Suburban,No,10.495730108527182,202.401,310.681
+94,Company_94,479.78,168.81,256.88,40033.55,561,Rural,No,10.597473131541856,467.688,210.978
+95,Company_95,500.33,585.43,362.28,58187.29,708,Urban,No,10.971422224990354,253.228,302.033
+96,Company_96,267.69,499.92,214.82,79427.15,318,Suburban,No,11.282595528333824,179.482,373.769
+97,Company_97,755.05,985.95,179.24,82469.43,673,Suburban,Yes,11.320182958199297,140.924,446.505
+98,Company_98,302.62,320.94,594.75,51363.17,367,Suburban,No,10.84667665764297,510.475,362.262
+99,Company_99,714.96,972.27,684.7,26131.27,620,Rural,No,10.170887960471719,552.47,208.496
+100,Company_100,945.42,505.3,509.87,57539.11,222,Urban,Yes,10.960220169485046,174.987,338.54200000000003
+101,Company_101,160.02,165.31,985.52,97438.02,772,Urban,Yes,11.486971762540222,329.552,243.002
+102,Company_102,445.92,108.59,838.78,65823.19,990,Rural,No,11.094727486834918,310.878,233.59199999999998
+103,Company_103,591.79,603.5,225.38,17043.42,511,Suburban,Yes,9.74351948447026,211.538,287.179
+104,Company_104,252.06,450.61,405.59,57402.73,571,Rural,No,10.95784714215228,316.55899999999997,462.206
+105,Company_105,165.62,951.39,306.5,45833.17,398,Rural,Yes,10.73276334377794,173.65,386.562
+106,Company_106,255.06,128.16,259.17,13244.48,616,Urban,No,9.491336140837323,395.91700000000003,362.506
+107,Company_107,447.35,180.41,643.05,70700.8,449,Rural,No,11.166212167237902,476.305,380.735
+108,Company_108,781.83,434.34,550.93,81277.04,720,Suburban,Yes,11.305618844826347,450.093,377.183
+109,Company_109,169.85,134.46,977.71,94591.41,473,Suburban,No,11.45732194753443,239.77100000000002,273.985
+110,Company_110,125.7,708.42,777.62,11615.85,473,Rural,Yes,9.360125823758061,452.762,334.57
+111,Company_111,866.33,981.73,892.43,14848.63,251,Suburban,Yes,9.605662884082752,436.243,392.63300000000004
+112,Company_112,725.77,590.82,558.44,15328.79,949,Urban,Yes,9.63748803854849,397.844,518.577
+113,Company_113,958.57,191.31,188.92,97104.67,310,Urban,Yes,11.483544747870583,305.892,306.85699999999997
+114,Company_114,729.39,511.32,120.71,69592.56,191,Urban,No,11.150412944056944,457.071,390.93899999999996
+115,Company_115,365.17,638.89,288.41,18567.32,982,Rural,Yes,9.829158325138039,372.841,401.517
+116,Company_116,265.79,429.39,476.28,86839.57,716,Urban,No,11.371817672344777,372.628,356.579
+117,Company_117,559.33,264.97,113.88,15724.66,744,Rural,Yes,9.66298545971327,444.388,394.933
+118,Company_118,781.96,443.32,862.47,74245.47,273,Rural,No,11.215132044702743,427.247,508.196
+119,Company_119,890.02,331.77,697.16,83693.72,772,Rural,Yes,11.334919223794108,531.716,428.002
+120,Company_120,358.86,588.14,768.94,84336.55,101,Urban,No,11.342570620606638,188.894,371.886
+121,Company_121,589.37,192.81,994.71,30198.07,651,Urban,Yes,10.315533294036035,451.471,426.937
+122,Company_122,808.28,297.7,455.05,30809.46,875,Urban,Yes,10.335577064660097,157.505,494.828
+123,Company_123,988.78,307.96,869.8,44511.43,310,Suburban,Yes,10.703501289105592,455.98,326.878
+124,Company_124,461.81,849.69,521.11,84053.28,549,Suburban,Yes,11.339206162465574,425.111,217.18099999999998
+125,Company_125,438.73,683.75,458.4,34747.89,771,Rural,Yes,10.455874129724979,386.84,305.873
+126,Company_126,791.33,299.04,650.17,84231.54,634,Urban,Yes,11.341324714414265,208.017,494.13300000000004
+127,Company_127,369.59,143.99,204.6,27639.11,536,Rural,Yes,10.22698707765262,338.46,479.959
+128,Company_128,524.05,885.87,431.91,22997.06,766,Suburban,Yes,10.04312166065388,507.19100000000003,410.405
+129,Company_129,677.07,490.74,311.48,21524.13,781,Rural,No,9.97692991036063,444.148,564.707
+130,Company_130,178.2,260.51,858.09,83651.2,562,Rural,No,11.334411051799224,185.809,333.82
+131,Company_131,691.31,398.92,644.53,87442.53,582,Rural,No,11.378737056558094,443.453,357.131
+132,Company_132,189.46,575.78,346.71,13257.65,284,Rural,Yes,9.492330023297646,296.671,473.946
+133,Company_133,488.33,731.67,953.18,26643.92,489,Rural,Yes,10.190316260976394,559.318,406.83299999999997
+134,Company_134,369.02,465.67,667.29,78924.61,793,Suburban,No,11.27624837201392,238.72899999999998,205.902
+135,Company_135,738.44,879.57,465.81,92477.88,609,Suburban,No,11.434724759768017,365.581,546.844
+136,Company_136,758.99,786.45,658.38,52134.69,989,Urban,Yes,10.861585841104548,218.838,231.899
+137,Company_137,464.53,270.67,133.65,25976.63,552,Suburban,Yes,10.164952566645338,168.365,274.453
+138,Company_138,580.02,793.08,931.46,40643.76,471,Rural,Yes,10.612600597657721,362.146,444.002
+139,Company_139,274.51,795.06,500.42,35139.32,233,Rural,Yes,10.46707601038709,281.04200000000003,458.451
+140,Company_140,959.71,868.21,107.06,49994.95,428,Rural,Yes,10.81967727930944,361.706,578.971
+141,Company_141,354.71,563.01,350.48,42908.83,610,Urban,No,10.666832911242361,272.048,357.471
+142,Company_142,396.03,603.89,128.42,39303.37,668,Urban,No,10.579065544817109,332.842,170.603
+143,Company_143,892.61,311.16,670.46,43027.27,864,Suburban,Yes,10.669589379711221,549.046,279.26099999999997
+144,Company_144,486.76,626.8,943.16,39879.69,50,Rural,No,10.593622450725602,318.31600000000003,189.676
+145,Company_145,917.34,288.69,643.88,55254.01,873,Suburban,Yes,10.919696195931778,281.38800000000003,371.73400000000004
+146,Company_146,435.58,284.0,802.41,14442.55,517,Suburban,Yes,9.577933989653928,362.241,241.558
+147,Company_147,202.67,381.12,247.09,64747.68,871,Rural,Yes,11.07825314880404,335.709,272.267
+148,Company_148,394.8,297.97,982.49,64826.8,825,Suburban,No,11.079474377086543,261.249,240.48000000000002
+149,Company_149,703.7,551.4,223.33,52703.5,186,Rural,No,10.872437145986403,325.333,248.37
+150,Company_150,271.26,639.62,669.86,54145.21,286,Urban,No,10.899424790529425,392.986,361.126
+151,Company_151,741.21,534.21,734.27,99208.27,649,Urban,Yes,11.504976656733618,459.427,365.121
+152,Company_152,946.16,900.51,456.7,12725.19,836,Rural,Yes,9.451338772544975,533.67,282.616
+153,Company_153,230.74,396.22,221.36,44064.93,469,Rural,No,10.693419506970148,279.136,139.074
+154,Company_154,390.33,162.83,592.72,41020.68,592,Urban,Yes,10.621831608768346,283.272,484.033
+155,Company_155,729.59,982.05,479.26,33549.17,191,Suburban,No,10.420767402898578,377.926,280.959
+156,Company_156,873.45,147.99,568.87,10530.31,621,Urban,No,9.262013044390788,262.887,409.345
+157,Company_157,799.45,990.69,784.19,76686.49,803,Rural,No,11.247480831032389,299.419,216.945
+158,Company_158,491.74,143.25,906.25,59283.77,370,Suburban,No,10.990090854439025,558.625,390.174
+159,Company_159,367.87,208.07,473.62,83903.97,372,Suburban,Yes,11.33742820957182,282.362,264.787
+160,Company_160,564.46,355.27,733.19,61663.32,609,Urban,No,11.029444543649397,275.319,363.446
+161,Company_161,607.02,300.46,718.76,99731.85,231,Suburban,No,11.510240363309093,538.876,257.702
+162,Company_162,363.2,676.84,915.1,81358.78,101,Urban,No,11.306624035526434,493.51,285.32
+163,Company_163,976.79,481.49,329.12,87221.77,246,Urban,No,11.37620923470151,221.912,377.679
+164,Company_164,738.36,396.44,379.5,95322.53,249,Rural,No,11.465021473034172,364.95,406.836
+165,Company_165,785.54,427.37,589.4,84393.08,683,Suburban,No,11.343240686701314,288.94,373.554
+166,Company_166,992.29,576.28,173.55,43056.45,352,Rural,No,10.670267324417088,470.355,363.229
+167,Company_167,346.54,528.08,728.16,68761.38,309,Rural,Yes,11.138397529103418,195.816,262.654
+168,Company_168,523.22,482.95,699.79,58914.32,735,Rural,No,10.983839464028723,344.979,293.322
+169,Company_169,891.58,418.18,511.08,28763.31,576,Urban,Yes,10.26685589561593,178.108,286.158
+170,Company_170,712.0,906.86,583.05,16881.59,957,Urban,Yes,9.73397895802674,309.305,519.2
diff --git a/my_model.py b/my_model.py
index 1792522..891cb67 100644
--- a/my_model.py
+++ b/my_model.py
@@ -14,7 +14,6 @@ from product import ProductAgent
class MyModel(Model):
def __init__(self, params):
-
# 属性
self.is_prf_size = params['prf_size']
self.prf_conn = params['prf_conn']
@@ -60,12 +59,15 @@ class MyModel(Model):
self.is_prf_size = bool(params['prf_size'])
self.remove_t = int(params['remove_t'])
self.int_netw_prf_n = int(params['netw_prf_n'])
+
# 方法执行
self.initialize_product_network(params)
self.initialize_firm_network()
self.initialize_firm_product_network()
self.add_edges_to_firm_network()
self.connect_unconnected_nodes()
+ self.resource_integration()
+ self.j_comp_consumed_produced()
self.initialize_agents()
self.initialize_disruptions()
@@ -74,18 +76,33 @@ class MyModel(Model):
self.product_network = nx.adjacency_graph(json.loads(params['g_bom']))
except Exception as e:
print(f"Failed to initialize product network: {e}")
+ # 赋予 产业的量
+ # 产业种类
+ data = pd.read_csv('测试数据 products_materials_equipment.csv')
+ self.type = data
+ # 设备c折旧比值
+ device_salvage_values = pd.read_csv('测试数据 device_salvage_values.csv')
+ self.device_salvage_values = device_salvage_values
def initialize_firm_network(self):
# Read the firm data
- firm = pd.read_csv("input_data/Firm_amended.csv")
+
+ firm = pd.read_csv("input_data/测试 Firm_amended 170.csv")
+
firm['Code'] = firm['Code'].astype('string')
firm.fillna(0, inplace=True)
- firm_attr = firm.loc[:, ["Code", "Type_Region", "Revenue_Log"]]
+
+ firm_attr = firm.loc[:, ["Code", "Type_Region", "Revenue_Log", "原材料", "设备数量", "库存商品"]]
+
+ firm_industry_relation = pd.read_csv("input_data/firm_industry_relation.csv")
+ firm_industry_relation['Firm_Code'] = firm_industry_relation['Firm_Code'].astype('string')
firm_product = []
- for _, row in firm.loc[:, '1':].iterrows():
- firm_product.append(row[row == 1].index.to_list())
- firm_attr.loc[:, 'Product_Code'] = firm_product
+
+ grouped = firm_industry_relation.groupby('Firm_Code')['Product_Code'].apply(list)
+ firm_product.append(grouped)
+
+ firm_attr['Product_Code'] = firm_attr['Code'].map(grouped)
firm_attr.set_index('Code', inplace=True)
self.G_Firm.add_nodes_from(firm["Code"])
@@ -97,21 +114,15 @@ class MyModel(Model):
self.Firm = firm
def initialize_firm_product_network(self):
- """ Initialize the firm-product network """
- # Read the firm-product data
- Firm_Prod = pd.read_csv("input_data/Firm_amended.csv")
- Firm_Prod.fillna(0, inplace=True)
- # Stack the firm-product relationships into a DataFrame
- firm_prod = pd.DataFrame({'bool': Firm_Prod.loc[:, '1':].stack()})
- firm_prod = firm_prod[firm_prod['bool'] == 1].reset_index()
- firm_prod.drop('bool', axis=1, inplace=True)
- firm_prod.rename({'level_0': 'Firm_Code', 'level_1': 'Product_Code'}, axis=1, inplace=True)
- firm_prod['Firm_Code'] = firm_prod['Firm_Code'].astype('string')
+ firm_industry_relation = pd.read_csv("input_data/firm_industry_relation.csv")
+ firm_industry_relation['Firm_Code'] = firm_industry_relation['Firm_Code'].astype('string')
+ # 将 'firm_prod' 表中的每一行作为图中的节点
+ self.G_FirmProd.add_nodes_from(firm_industry_relation.index)
- self.G_FirmProd.add_nodes_from(firm_prod.index)
- # Assign attributes to the firm-product nodes
- firm_prod_labels_dict = {code: firm_prod.loc[code].to_dict() for code in firm_prod.index}
+ # 为每个节点分配属性
+ firm_prod_labels_dict = {code: firm_industry_relation.loc[code].to_dict() for code in
+ firm_industry_relation.index}
nx.set_node_attributes(self.G_FirmProd, firm_prod_labels_dict)
def add_edges_to_firm_network(self):
@@ -204,19 +215,52 @@ class MyModel(Model):
def initialize_agents(self):
""" Initialize agents and add them to the model. """
for ag_node, attr in self.product_network.nodes(data=True):
- product = ProductAgent(ag_node, self, name=attr['Name'])
+ # 产业种类
+ type2 = self.type.loc[ag_node, '种类']
+
+ device_salvage_values = self.type.loc[ag_node, '设备残值']
+
+ j_comp_data_consumed = self.data_consumed.loc[ag_node]
+
+ j_comp_data_produced = self.data_consumed.loc[ag_node]
+
+ product = ProductAgent(ag_node, self, name=attr['Name'], type2=type2,
+ device_salvage_values=device_salvage_values,
+ j_comp_data_consumed=j_comp_data_consumed,
+ j_comp_data_produced=j_comp_data_produced, )
+
self.add_agent(product)
# self.grid.place_agent(product, ag_node)
-
##print(f"Product agent created: {product.name}, ID: {product.unique_id}")
for ag_node, attr in self.firm_network.nodes(data=True):
a_lst_product = [agent for agent in self.product_agents if agent.unique_id in attr['Product_Code']]
+
+ n_equip_c = self.Firm.loc[ag_node, '设备数量']
+
+ demand_quantity = self.Firm.loc[ag_node, 'production_output']
+
+ production_output = self.Firm.loc[ag_node, 'demand_quantity']
+
+ c_price = self.Firm.loc[ag_node, 'c_price']
+
+ # 资源 资源库存信息 利用 firm_resource
+ R = self.firm_resource_R.loc[ag_node]
+ P = self.firm_resource_R.loc[ag_node]
+ C = self.firm_resource_R.loc[ag_node]
+
firm_agent = FirmAgent(
ag_node, self,
type_region=attr['Type_Region'],
revenue_log=attr['Revenue_Log'],
+ n_equip_c=n_equip_c,
a_lst_product=a_lst_product,
+ demand_quantity=demand_quantity,
+ production_output=production_output,
+ c_price=c_price,
+ R=R,
+ P=P,
+ C=C
)
self.add_agent(firm_agent)
@@ -258,6 +302,33 @@ class MyModel(Model):
elif isinstance(agent, ProductAgent):
self.product_agents.append(agent)
+ def resource_integration(self):
+ data_R = pd.read_csv("测试数据 companies_materials.csv")
+ data_C = pd.read_csv("测试数据 companies_devices.csv")
+ data_P = pd.read_csv("测试数据 companies_products.csv")
+ firm_resource_R = (data_R.groupby('Firm_Code')[['材料id', '材料数量']]
+ .apply(lambda x: x.values.tolist()))
+ firm_resource_C = (data_C.groupby('Firm_Code')[['材料id', '材料数量']]
+ .apply(lambda x: x.values.tolist()))
+
+ firm_resource_P = (data_P.groupby('Firm_Code')[['材料id', '材料数量']]
+ .apply(lambda x: x.values.tolist()))
+
+ self.firm_resource_R = firm_resource_R
+ self.firm_resource_C = firm_resource_C
+ self.firm_resource_P = firm_resource_P
+
+ def j_comp_consumed_produced(self):
+ data_consumed = pd.read_csv('测试数据 consumed_materials.csv')
+ data_produced = pd.read_csv('测试数据 produced_products.csv')
+ data_consumed = (data_consumed.groupby('产业id')[['消耗材料id', '消耗材料数量']]
+ .apply(lambda x: x.values.tolist()))
+ data_produced = (data_produced.groupby('产业id')[['制造产品id', '制造产品数量']]
+ .apply(lambda x: x.values.tolist()))
+
+ self.data_consumed = data_consumed
+ self.data_produced = data_produced
+
def step(self):
# 1. Remove edge to customer and disrupt customer up product
for firm in self.company_agents:
@@ -303,5 +374,83 @@ class MyModel(Model):
for firm in self.company_agents:
firm.clean_before_trial()
+ # 3. 判断是否需要购买资源 判断是否需要购买机器
+ purchase_material_firms = {}
+ purchase_machinery_firms = {}
+ material_list = []
+ machinery_list = []
+ list_seek_material_firm = [] # 每一个收到请求的企业
+ list_seek_machinery_firm = [] # 每一个收到请求的企业
+ for firm in self.company_agents:
+ # 资源
+ for sub_list in firm.R:
+ if sub_list[1] <= firm.s_r:
+ required_material_quantity = firm.S_r - sub_list[1]
+ (material_list
+ .append([sub_list[0], required_material_quantity]))
+ purchase_material_firms[firm] = material_list
+ # 设备
+ for sub_list in firm.C:
+ # 对于设备的required_machinery_quantity 要有所改变 根据残值而言! 每一个周期固定减少残值值 x firm 里面定义
+ sub_list[2] -= firm.x
+ if sub_list[2] <= 0: # 残值小于等于 0 时
+ sub_list[1] -= 1
+ required_machinery_quantity = firm.C1[0][1] - sub_list[1] # 补回原来的量 也就是 1
+ (machinery_list
+ .append([sub_list[0], required_machinery_quantity]))
+ purchase_machinery_firms[firm] = machinery_list
+
+ # 寻源并发送请求 决定是否接受供应 并更新
+
+ for material_firm, sub_list in purchase_material_firms:
+ for material_list in sub_list:
+ (list_seek_material_firm
+ .append(material_firm.seek_material_supply(material_list[0])))
+ if len(list_seek_material_firm) != 0:
+ for seek_material_firm in list_seek_material_firm:
+ seek_material_firm.handle_material_request(material_list) # 更新产品
+ for R_list in firm.R:
+ R_list[1] = firm.S_r
+
+ for machinery_firm, sub_list in purchase_machinery_firms:
+ for machinery_list in sub_list:
+ (list_seek_machinery_firm
+ .append(machinery_firm.seek_machinery_supply(machinery_list[0])))
+ if len(list_seek_machinery_firm) != 0:
+ for seek_machinery_firm in list_seek_machinery_firm:
+ seek_machinery_firm.handle_machinery_request(machinery_list)
+ for C_list, C0_list in zip(firm.C, firm.C0):
+ C_list[1] = C0_list[1] # 赋值回去
+ C_list[2] = C0_list[2]
+
+ # 消耗资源过程
+ consumed_material = []
+ for product in firm.a_lst_product:
+ for sub_list_data_consumed in product.j_comp_data_consumed:
+ consumed_material_id = sub_list_data_consumed[0]
+ consumed_material_num = sub_list_data_consumed[1]
+ consumed_material.append([consumed_material_id, consumed_material_num])
+ for sub_list_consumed_material in consumed_material:
+ for sub_list_material in firm.R:
+ if sub_list_material[0] == sub_list_consumed_material[0]:
+ sub_list_material[1] = sub_list_material[1] - sub_list_consumed_material[1]
+ # 生产产品过程
+ produced_products = []
+ for product in firm.a_lst_product:
+ for sub_list_produced_products in product.j_comp_data_consumed:
+ produced_products_id = sub_list_produced_products[0]
+ produced_products_num = sub_list_produced_products[1]
+ produced_products.append([produced_products_id, produced_products_num])
+ for sub_list_data_produced_products in produced_products:
+ for sub_list_products in firm.P:
+ if sub_list_products[0] == sub_list_data_produced_products[0]:
+ sub_list_products[1] = sub_list_products[1] - sub_list_data_produced_products[1]
+ # 刷新 R状态
+ firm.refresh_R()
+ # 刷新 C状态
+ firm.refresh_C()
+ # 刷新 P状态
+ firm.refresh_P()
+
# Increment the time step
self.t += 1
diff --git a/product.py b/product.py
index 51181ed..8d32c77 100644
--- a/product.py
+++ b/product.py
@@ -1,13 +1,22 @@
from mesa import Agent
+
class ProductAgent(Agent):
- def __init__(self, unique_id, model, name):
+ def __init__(self, unique_id, model, name, type2, device_salvage_values, j_comp_data_consumed, j_comp_data_produced):
# 调用超类的 __init__ 方法
super().__init__(unique_id, model)
# 初始化代理属性
self.name = name
self.product_network = self.model.product_network
+ if type2 == 0:
+ self.is_equip = True
+ else:
+ self.is_mater = True
+ self.device_salvage_values = device_salvage_values
+
+ self.j_comp_data_produced = j_comp_data_produced
+ self.j_comp_data_consumed = j_comp_data_consumed
def a_successors(self):
# 从 product_network 中找到当前代理的后继节点
@@ -22,4 +31,3 @@ class ProductAgent(Agent):
# 通过 unique_id 查找前驱节点对应的代理对象,直接从 self.product_agents 列表中获取
return [agent for agent in self.model.product_agents if agent.unique_id in predecessors]
-
diff --git a/测试数据 产业 数据.py b/测试数据 产业 数据.py
new file mode 100644
index 0000000..70db33a
--- /dev/null
+++ b/测试数据 产业 数据.py
@@ -0,0 +1,43 @@
+import pandas as pd
+import numpy as np
+
+# 设置随机种子
+np.random.seed(42)
+
+# 生成企业和设备数据
+num_rows = 10 # 每个表的行数
+
+# 构造数据
+company_ids = np.random.randint(1000, 1100, size=num_rows)
+device_ids = np.random.randint(100, 200, size=num_rows)
+material_ids = np.random.randint(0, 100, size=num_rows)
+product_ids = np.random.randint(0, 200, size=num_rows)
+
+device_quantities = np.random.randint(50, 200, size=num_rows)
+material_quantities = np.random.randint(100,200, size=num_rows)
+product_quantities = np.random.randint(20, 100, size=num_rows)
+
+# 创建三个表格的数据框
+df_devices = pd.DataFrame({
+ '企业id': company_ids,
+ '设备id': device_ids,
+ '设备数量': device_quantities
+})
+
+df_materials = pd.DataFrame({
+ '企业id': company_ids,
+ '材料id': material_ids,
+ '材料数量': material_quantities
+})
+
+df_products = pd.DataFrame({
+ '企业id': company_ids,
+ '产品id': product_ids,
+ '产品数量': product_quantities
+})
+
+# 保存为CSV文件
+df_devices.to_csv('测试数据 companies_devices.csv', index=False)
+df_materials.to_csv('测试数据 companies_materials.csv', index=False)
+df_products.to_csv('测试数据 companies_products.csv', index=False)
+
diff --git a/测试数据 产业-原材料消耗-产品生产量.py b/测试数据 产业-原材料消耗-产品生产量.py
new file mode 100644
index 0000000..930c2cb
--- /dev/null
+++ b/测试数据 产业-原材料消耗-产品生产量.py
@@ -0,0 +1,42 @@
+import pandas as pd
+import numpy as np
+
+# 设置随机种子,确保结果可重复
+np.random.seed(42)
+
+# 定义产业数量
+num_industries = 10
+
+# 创建产业ID列表
+industry_ids = [i for i in range(0, num_industries + 1)]
+
+# 为每个产业生成随机的材料id、消耗量、产品id和制造量
+consumed_materials_data = []
+produced_products_data = []
+
+for industry in industry_ids:
+ # 每个产业消耗的材料(生成1到3个随机材料ID和消耗量)
+ num_materials = np.random.randint(1, 4)
+ for _ in range(num_materials):
+ material_id = np.random.randint(0, 100)
+ consumption_quantity = np.random.randint(50, 500)
+ consumed_materials_data.append([industry, material_id, consumption_quantity])
+
+ # 每个产业制造的产品(生成1到3个随机产品ID和制造量)
+ num_products = np.random.randint(1, 4)
+ for _ in range(num_products):
+ product_id = np.random.randint(100, 201)
+ production_quantity = np.random.randint(100, 1000)
+ produced_products_data.append([industry, product_id, production_quantity])
+
+# 创建两个数据框
+df_consumed_materials = pd.DataFrame(consumed_materials_data, columns=['产业ID', '消耗材料ID', '消耗量'])
+df_produced_products = pd.DataFrame(produced_products_data, columns=['产业ID', '制造产品ID', '制造量'])
+
+# 保存两个数据框为CSV文件
+file_path_consumed = '测试数据 consumed_materials.csv'
+file_path_produced = '测试数据 produced_products.csv'
+
+df_consumed_materials.to_csv(file_path_consumed, index=False)
+df_produced_products.to_csv(file_path_produced, index=False)
+
diff --git a/测试数据 BomNodes.csv.py b/测试数据 BomNodes.csv.py
new file mode 100644
index 0000000..95ddd87
--- /dev/null
+++ b/测试数据 BomNodes.csv.py
@@ -0,0 +1,15 @@
+import pandas as pd
+import random
+import numpy as np
+
+# 生成170条测试数据的函数
+data=pd.read_csv('input_data/BomNodes.csv')
+# 生成数据
+df = pd.DataFrame(data)
+df['产业种类'] = [random.choice([0, 1]) for _ in range(107)]
+
+# 显示前几行
+print(df.head())
+
+# 保存数据到CSV文件
+df.to_csv('input_data/测试 BomNodes.csv', index=False)
diff --git a/测试数据 Firm_amended.csv.py b/测试数据 Firm_amended.csv.py
new file mode 100644
index 0000000..016c029
--- /dev/null
+++ b/测试数据 Firm_amended.csv.py
@@ -0,0 +1,36 @@
+import pandas as pd
+import random
+import numpy as np
+
+
+# 生成170条测试数据的函数
+def generate_test_data(num_rows=170):
+ data = {
+ 'Company ID': [i for i in range(1, num_rows + 1)], # 生成1到170的公司ID
+ 'Company Name': [f'Company_{i}' for i in range(1, num_rows + 1)], # 生成公司名称
+ '原材料': [round(random.uniform(100, 1000), 2) for _ in range(num_rows)], # 原材料
+ '库存商品': [round(random.uniform(100, 1000), 2) for _ in range(num_rows)], # 库存商品
+ '固定资产原值': [round(random.uniform(100, 1000), 2) for _ in range(num_rows)], # 固定资产原值
+ 'Revenue': [round(random.uniform(10000, 100000), 2) for _ in range(num_rows)], # Revenue
+ 'Total Employees (People)': [random.randint(50, 1000) for _ in range(num_rows)], # 员工总数
+ 'Type_Region': [random.choice(['Urban', 'Rural', 'Suburban']) for _ in range(num_rows)], # 区域类型
+ 'Self-supply Business (Yes/No)': [random.choice(['Yes', 'No']) for _ in range(num_rows)] # 自营业务
+ }
+
+ df = pd.DataFrame(data)
+
+ # 添加Revenue_Log列
+ df['Revenue_Log'] = np.log(df['Revenue'])
+ df['production_output'] = df['固定资产原值'] / 10+np.random.randint(100, 500, size=len(df))
+ df['demand_quantity'] = df['原材料'] / 10 +np.random.randint(100, 500, size=len(df))
+ return df
+
+
+# 生成数据
+df_test_data = generate_test_data()
+
+# 显示前几行
+print(df_test_data.head())
+
+# 保存数据到CSV文件
+df_test_data.to_csv('input_data/测试 Firm_amended 170.csv', index=False)
diff --git a/测试数据 companies_devices.csv b/测试数据 companies_devices.csv
new file mode 100644
index 0000000..ae382cb
--- /dev/null
+++ b/测试数据 companies_devices.csv
@@ -0,0 +1,11 @@
+企业id,设备id,设备数量
+1051,187,104
+1092,199,113
+1014,123,180
+1071,102,100
+1060,121,184
+1020,152,70
+1082,101,122
+1086,187,67
+1074,129,181
+1074,137,138
diff --git a/测试数据 companies_materials.csv b/测试数据 companies_materials.csv
new file mode 100644
index 0000000..7b42404
--- /dev/null
+++ b/测试数据 companies_materials.csv
@@ -0,0 +1,11 @@
+企业id,材料id,材料数量
+1051,1,159
+1092,63,113
+1014,59,108
+1071,20,189
+1060,32,152
+1020,75,101
+1082,57,183
+1086,21,191
+1074,88,159
+1074,48,170
\ No newline at end of file
diff --git a/测试数据 companies_products.csv b/测试数据 companies_products.csv
new file mode 100644
index 0000000..725ee0b
--- /dev/null
+++ b/测试数据 companies_products.csv
@@ -0,0 +1,11 @@
+企业id,产品id,产品数量
+1051,58,63
+1092,169,27
+1014,187,66
+1071,14,54
+1060,189,97
+1020,189,55
+1082,174,69
+1086,189,23
+1074,50,21
+1074,107,25
diff --git a/测试数据 consumed_materials.csv b/测试数据 consumed_materials.csv
new file mode 100644
index 0000000..8348aef
--- /dev/null
+++ b/测试数据 consumed_materials.csv
@@ -0,0 +1,24 @@
+产业ID,消耗材料ID,消耗量
+0,51,398
+0,14,156
+0,71,238
+1,74,137
+1,99,409
+1,23,180
+2,37,435
+2,63,493
+3,21,302
+3,88,98
+4,61,224
+4,61,100
+5,72,216
+6,8,395
+6,52,435
+7,80,469
+7,49,409
+8,62,451
+9,47,320
+9,71,264
+9,61,345
+10,52,329
+10,25,266
diff --git a/测试数据 device_salvage_values.csv b/测试数据 device_salvage_values.csv
new file mode 100644
index 0000000..47d1118
--- /dev/null
+++ b/测试数据 device_salvage_values.csv
@@ -0,0 +1,11 @@
+设备id,设备残值
+151,97
+192,382
+114,109
+171,881
+160,673
+120,140
+182,671
+186,318
+174,779
+174,353
diff --git a/测试数据 material_device_product_ids.csv b/测试数据 material_device_product_ids.csv
new file mode 100644
index 0000000..53a9fc6
--- /dev/null
+++ b/测试数据 material_device_product_ids.csv
@@ -0,0 +1,101 @@
+材料id,设备id,产品id
+51,192,14
+71,160,20
+82,186,74
+74,187,116
+99,123,130
+21,152,1
+87,129,37
+1,163,187
+20,132,57
+21,188,48
+90,158,169
+91,159,14
+61,161,174
+61,150,107
+54,163,130
+50,106,20
+72,138,17
+3,188,59
+13,108,89
+52,101,83
+91,159,198
+43,107,174
+34,177,80
+35,149,103
+3,101,133
+53,103,190
+17,189,43
+33,173,189
+99,113,94
+47,114,199
+77,186,189
+39,184,81
+52,123,153
+88,159,123
+40,128,14
+44,164,88
+70,108,87
+0,107,62
+10,180,135
+34,134,32
+4,140,27
+6,172,71
+11,133,32
+47,122,61
+87,136,98
+43,185,34
+64,198,100
+46,177,130
+0,104,141
+26,108,14
+89,141,123
+76,150,62
+95,151,131
+93,200,150
+14,142,28
+35,112,159
+70,158,85
+27,165,169
+44,161,184
+5,127,27
+43,183,29
+61,174,127
+91,188,189
+96,100,120
+26,161,120
+76,102,197
+71,126,136
+61,136,50
+43,123,58
+31,195,179
+61,157,51
+11,138,129
+2,200,112
+55,180,186
+1,101,53
+86,200,128
+18,101,52
+43,189,159
+69,131,67
+54,174,183
+16,137,23
+68,197,138
+15,196,200
+58,169,92
+2,119,186
+35,118,89
+66,118,147
+95,170,51
+32,139,127
+38,181,103
+0,110,184
+88,149,150
+30,193,41
+98,106,143
+89,159,112
+1,100,47
+11,168,36
+31,108,98
+18,147,130
+19,123,53
diff --git a/测试数据 produced_products.csv b/测试数据 produced_products.csv
new file mode 100644
index 0000000..8631620
--- /dev/null
+++ b/测试数据 produced_products.csv
@@ -0,0 +1,22 @@
+产业ID,制造产品ID,制造量
+0,182,314
+1,152,869
+1,187,591
+2,132,559
+3,158,610
+3,141,575
+3,159,882
+4,163,604
+4,102,584
+4,150,746
+5,103,700
+5,159,113
+6,159,554
+6,143,608
+6,107,134
+7,105,665
+7,103,921
+8,143,261
+8,173,369
+9,179,848
+10,140,256
diff --git a/测试数据 products_materials_equipment.csv b/测试数据 products_materials_equipment.csv
new file mode 100644
index 0000000..0e5ae40
--- /dev/null
+++ b/测试数据 products_materials_equipment.csv
@@ -0,0 +1,101 @@
+产品id,种类
+1,材料
+2,材料
+3,材料
+4,材料
+5,材料
+6,材料
+7,材料
+8,材料
+9,材料
+10,材料
+11,材料
+12,材料
+13,材料
+14,材料
+15,材料
+16,材料
+17,材料
+18,材料
+19,材料
+20,材料
+21,材料
+22,材料
+23,材料
+24,材料
+25,材料
+26,材料
+27,材料
+28,材料
+29,材料
+30,材料
+31,材料
+32,材料
+33,材料
+34,材料
+35,材料
+36,材料
+37,材料
+38,材料
+39,材料
+40,材料
+41,材料
+42,材料
+43,材料
+44,材料
+45,材料
+46,材料
+47,材料
+48,材料
+49,材料
+50,材料
+51,材料
+52,材料
+53,材料
+54,材料
+55,材料
+56,材料
+57,材料
+58,材料
+59,材料
+60,材料
+61,材料
+62,设备
+63,设备
+64,设备
+65,设备
+66,设备
+67,设备
+68,设备
+69,设备
+70,设备
+71,设备
+72,设备
+73,设备
+74,设备
+75,设备
+76,设备
+77,设备
+78,设备
+79,设备
+80,设备
+81,设备
+82,设备
+83,设备
+84,设备
+85,设备
+86,设备
+87,设备
+88,设备
+89,设备
+90,设备
+91,设备
+92,设备
+93,设备
+94,设备
+95,设备
+96,设备
+97,设备
+98,设备
+99,设备
+100,设备
diff --git a/测试数据 产品通编码.py b/测试数据 产品通编码.py
new file mode 100644
index 0000000..d7a4b31
--- /dev/null
+++ b/测试数据 产品通编码.py
@@ -0,0 +1,25 @@
+import pandas as pd
+import numpy as np
+
+# 设置数据行数
+total_rows = 100 # 总共100行
+material_count = 61 # 前61行为材料
+
+# 生成产品id
+product_ids = np.arange(1, total_rows + 1)
+
+# 生成种类,前61行是材料,后面是设备
+categories = ['材料'] * material_count + ['设备'] * (total_rows - material_count)
+
+# 创建数据框
+df_products = pd.DataFrame({
+ '产品id': product_ids,
+ '种类': categories
+})
+
+# 保存为CSV文件
+file_path_products = '测试数据 products_materials_equipment.csv'
+df_products.to_csv(file_path_products, index=False) # index=False 不保存行索引
+
+# 打印文件路径
+print(f"CSV 文件已生成,路径为: {file_path_products}")
diff --git a/测试数据 材料设备产品.py b/测试数据 材料设备产品.py
new file mode 100644
index 0000000..1172cbf
--- /dev/null
+++ b/测试数据 材料设备产品.py
@@ -0,0 +1,42 @@
+import pandas as pd
+import numpy as np
+
+# 设置随机种子,以便结果可重复
+np.random.seed(42)
+
+# 定义生成数据的行数
+num_rows = 100 # 生成 100 行数据
+
+# 创建空列表来存储生成的ID
+material_ids = []
+device_ids = []
+product_ids = []
+
+# 生成材料、设备、产品的ID,确保同一行内的ID不重复
+for _ in range(num_rows):
+ mat_id = np.random.randint(0, 100) # 材料ID范围 0-99
+ dev_id = np.random.randint(100, 201) # 设备ID范围 100-199
+
+ # 确保产品ID在当前行与材料ID和设备ID不重复
+ while True:
+ prod_id = np.random.randint(0, 201)
+ if prod_id != mat_id and prod_id != dev_id:
+ break
+
+ material_ids.append(mat_id)
+ device_ids.append(dev_id)
+ product_ids.append(prod_id)
+
+# 创建数据框,将三个ID列结合起来
+df_ids = pd.DataFrame({
+ '材料id': material_ids,
+ '设备id': device_ids,
+ '产品id': product_ids
+})
+
+# 指定文件路径并保存为CSV文件
+file_path_ids = '测试数据 material_device_product_ids.csv'
+df_ids.to_csv(file_path_ids, index=False) # index=False 表示不保存行索引
+
+# 打印文件路径
+print(f"CSV 文件已生成,路径为: {file_path_ids}")
diff --git a/测试数据 设备id和设备残值.py b/测试数据 设备id和设备残值.py
new file mode 100644
index 0000000..cb313e3
--- /dev/null
+++ b/测试数据 设备id和设备残值.py
@@ -0,0 +1,25 @@
+import pandas as pd
+import numpy as np
+
+# 设置随机种子以确保结果可重复
+np.random.seed(42)
+
+# 定义行数,即生成多少个设备
+num_rows = 10
+
+# 生成设备id(例如100到200之间的设备ID)
+device_ids = np.random.randint(100, 200, size=num_rows)
+
+# 生成设备残值,假设范围在1000到10000之间
+device_salvage_values = np.random.randint(10, 1000, size=num_rows)
+
+# 创建数据框,将设备id和设备残值结合起来
+df_devices = pd.DataFrame({
+ '设备id': device_ids,
+ '设备残值': device_salvage_values
+})
+
+# 保存为CSV文件
+file_path_devices = '测试数据 device_salvage_values.csv'
+df_devices.to_csv(file_path_devices, index=False)
+
diff --git a/测试数据_firm_industry_relation.csv.py b/测试数据_firm_industry_relation.csv.py
new file mode 100644
index 0000000..fd989f7
--- /dev/null
+++ b/测试数据_firm_industry_relation.csv.py
@@ -0,0 +1,17 @@
+import pandas as pd
+
+Firm_Prod = pd.read_csv("input_data/Firm_amended.csv")
+Firm_Prod.fillna(0, inplace=True)
+
+# Stack the firm-product relationships into a DataFrame
+firm_prod = pd.DataFrame({'bool': Firm_Prod.loc[:, '1':].stack()})
+firm_prod = firm_prod[firm_prod['bool'] == 1].reset_index()
+firm_prod.drop('bool', axis=1, inplace=True)
+firm_prod.rename({'level_0': 'Firm_Code', 'level_1': 'Product_Code'}, axis=1, inplace=True)
+firm_prod['Firm_Code'] = firm_prod['Firm_Code'].astype('string')
+
+# 保存为新的 CSV 文件
+output_file_path = 'input_data/firm_industry_relation.csv'
+firm_prod.to_csv(output_file_path, index=False)
+
+print(f"新的 CSV 文件已保存到: {output_file_path}")