generate based on supplier
This commit is contained in:
100
model.py
100
model.py
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user