generate based on supplier

This commit is contained in:
2023-06-10 23:23:44 +08:00
parent 3b9252d93d
commit 0647a9721a
12 changed files with 877 additions and 57 deletions

100
model.py
View File

@@ -19,7 +19,7 @@ class Model(ap.Model):
self.dct_lst_remove_firm_prod = self.p.dct_lst_init_remove_firm_prod
self.int_n_max_trial = int(self.p.n_max_trial)
self.flt_netw_sply_prf_n = float(self.p.netw_sply_prf_n)
self.int_netw_sply_prf_size = int(self.p.netw_sply_prf_n)
self.flt_netw_sply_prf_size = float(self.p.netw_sply_prf_size)
self.str_cap_limit_prob_type = str(self.p.cap_limit_prob_type)
self.flt_cap_limit_level = float(self.p.cap_limit_level)
@@ -67,56 +67,51 @@ class Model(ap.Model):
# add edge to G_firm according to G_bom
for node in nx.nodes(G_Firm):
lst_pred_product_code = []
for product_code in G_Firm.nodes[node]['Product_Code']:
for pred_product_code in \
list(G_bom.predecessors(product_code)):
# for each product of a certain firm
# get each predecessor (component) of this product
# get a list of firm producing this component
lst_pred_firm = Firm['Code'][Firm[pred_product_code] ==
1].to_list()
lst_pred_firm_size_damp = \
[G_Firm.nodes[pred_firm]['Revenue_Log'] **
self.flt_netw_sply_prf_size
for pred_firm in lst_pred_firm
]
lst_prob = \
[size_damp / sum(lst_pred_firm_size_damp)
for size_damp in lst_pred_firm_size_damp
]
# select multiple supplier
# based on relative size of this firm
lst_same_prod_firm = Firm['Code'][Firm[product_code] ==
1].to_list()
lst_same_prod_firm_size = [
G_Firm.nodes[f]['Revenue_Log']
for f in lst_same_prod_firm
]
share = G_Firm.nodes[node]['Revenue_Log'] / sum(
lst_same_prod_firm_size)
# damp share
share = share ** self.flt_netw_sply_prf_n
n_pred_firm = round(share * len(lst_pred_firm)) if round(
share * len(lst_pred_firm)) > 0 else 1 # at least one
lst_choose_firm = self.nprandom.choice(lst_pred_firm,
n_pred_firm,
replace=False,
p=lst_prob)
lst_add_edge = [(node, pred_firm, {
'Product': product_code
}) for pred_firm in lst_choose_firm]
G_Firm.add_edges_from(lst_add_edge)
lst_pred_product_code += list(G_bom.predecessors(product_code))
lst_pred_product_code = list(set(lst_pred_product_code))
for pred_product_code in lst_pred_product_code:
# for each product predecessor (component) the firm need
# get a list of firm producing this component
lst_pred_firm = \
Firm['Code'][Firm[pred_product_code] == 1].to_list()
lst_pred_firm_size_damp = \
[G_Firm.nodes[pred_firm]['Revenue_Log'] **
self.flt_netw_sply_prf_size
for pred_firm in lst_pred_firm]
lst_prob = \
[size_damp / sum(lst_pred_firm_size_damp)
for size_damp in lst_pred_firm_size_damp]
# select multiple supplier (multi-sourcing)
n_pred_firm = self.int_netw_sply_prf_size
lst_choose_firm = self.nprandom.choice(lst_pred_firm,
n_pred_firm,
replace=False,
p=lst_prob)
lst_add_edge = [(pred_firm, node,
{'Product': pred_product_code})
for pred_firm in lst_choose_firm]
G_Firm.add_edges_from(lst_add_edge)
# graph firm prod
# graph firm prod
set_node_prod_code = set(G_Firm.nodes[node]['Product_Code'])
set_pred_succ_code = set(G_bom.successors(pred_product_code))
set_use_pred_prod_code = \
set_node_prod_code & set_pred_succ_code
for pred_firm in lst_choose_firm:
pred_node = [n for n, v in G_FirmProd.nodes(data=True)
if v['Firm_Code'] == node and
v['Product_Code'] == product_code][0]
for pred_firm in lst_choose_firm:
pred_node = [n for n, v in G_FirmProd.nodes(data=True)
if v['Firm_Code'] == pred_firm and
v['Product_Code'] == pred_product_code][0]
G_FirmProd.add_edge(pred_node, pred_node)
if v['Firm_Code'] == pred_firm and
v['Product_Code'] == pred_product_code][0]
for use_pred_prod_code in set_use_pred_prod_code:
current_node = \
[n for n, v in G_FirmProd.nodes(data=True)
if v['Firm_Code'] == node and
v['Product_Code'] == use_pred_prod_code][0]
G_FirmProd.add_edge(pred_node, current_node)
nx.to_pandas_adjacency(G_Firm).to_csv('adj_g_firm')
nx.to_pandas_adjacency(G_FirmProd).to_csv('adj_g_firm_prod')
# unconnected node
# for node in nx.nodes(G_Firm):
# if node.
@@ -124,6 +119,9 @@ class Model(ap.Model):
self.sample.g_firm = json.dumps(nx.adjacency_data(G_Firm))
self.firm_network = ap.Network(self, G_Firm)
self.firm_prod_network = G_FirmProd
# import matplotlib.pyplot as plt
# nx.draw(G_FirmProd)
# plt.show()
# init product
for ag_node, attr in self.product_network.graph.nodes(data=True):
@@ -283,13 +281,15 @@ class Model(ap.Model):
'Product': di_supp_prod.code
})
])
# print(f"proactive add {select_cand.code} to "
# f"{pro_firm.code} "
# f"for {di_supp_code} {di_supp_prod.code}")
print(f"proactive add {select_cand.code} to "
f"{pro_firm.code} "
f"for {di_supp_node['Firm_Code']} "
f"{di_supp_node['Product_Code']}")
# change capacity
select_cand.dct_prod_capacity[di_supp_prod] -= 1
break
nx.to_pandas_adjacency(G_Firm).to_csv('adj_g_firm_proactive')
# draw network
# self.draw_network()