proactive strategy 2 based on graph firm prod
This commit is contained in:
parent
907d6cb179
commit
83eeeb9d14
Binary file not shown.
154
model.py
154
model.py
|
@ -48,6 +48,26 @@ class Model(ap.Model):
|
||||||
firm_labels_dict[code] = Firm_attr.loc[code].to_dict()
|
firm_labels_dict[code] = Firm_attr.loc[code].to_dict()
|
||||||
nx.set_node_attributes(G_Firm, firm_labels_dict)
|
nx.set_node_attributes(G_Firm, firm_labels_dict)
|
||||||
|
|
||||||
|
# init graph firm prod
|
||||||
|
Firm_Prod = pd.read_csv("Firm_amended.csv")
|
||||||
|
# Firm['Code'] = Firm['Code'].astype('string')
|
||||||
|
Firm_Prod.fillna(0, inplace=True)
|
||||||
|
# Firm_attr = Firm.loc[:, ["Code", "Name", "Type_Region", "Revenue_Log"]]
|
||||||
|
# Firm_attr.set_index('Code', inplace=True)
|
||||||
|
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')
|
||||||
|
G_FirmProd = nx.MultiDiGraph()
|
||||||
|
G_FirmProd.add_nodes_from(firm_prod.index)
|
||||||
|
|
||||||
|
firm_prod_labels_dict = {}
|
||||||
|
for code in firm_prod.index:
|
||||||
|
firm_prod_labels_dict[code] = firm_prod.loc[code].to_dict()
|
||||||
|
nx.set_node_attributes(G_FirmProd, firm_prod_labels_dict)
|
||||||
|
|
||||||
# add edge to G_firm according to G_bom
|
# add edge to G_firm according to G_bom
|
||||||
for node in nx.nodes(G_Firm):
|
for node in nx.nodes(G_Firm):
|
||||||
for product_code in G_Firm.nodes[node]['Product_Code']:
|
for product_code in G_Firm.nodes[node]['Product_Code']:
|
||||||
|
@ -82,17 +102,26 @@ class Model(ap.Model):
|
||||||
share * len(lst_succ_firm)) > 0 else 1 # at least one
|
share * len(lst_succ_firm)) > 0 else 1 # at least one
|
||||||
lst_choose_firm = self.nprandom.choice(lst_succ_firm,
|
lst_choose_firm = self.nprandom.choice(lst_succ_firm,
|
||||||
n_succ_firm,
|
n_succ_firm,
|
||||||
|
replace=False,
|
||||||
p=lst_prob)
|
p=lst_prob)
|
||||||
lst_choose_firm = list(
|
|
||||||
set(lst_choose_firm
|
|
||||||
)) # nprandom.choice may have duplicates
|
|
||||||
lst_add_edge = [(node, succ_firm, {
|
lst_add_edge = [(node, succ_firm, {
|
||||||
'Product': product_code
|
'Product': product_code
|
||||||
}) for succ_firm in lst_choose_firm]
|
}) for succ_firm in lst_choose_firm]
|
||||||
G_Firm.add_edges_from(lst_add_edge)
|
G_Firm.add_edges_from(lst_add_edge)
|
||||||
|
|
||||||
|
# graph firm prod
|
||||||
|
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 succ_firm in lst_choose_firm:
|
||||||
|
succ_node = [n for n, v in G_FirmProd.nodes(data=True)
|
||||||
|
if v['Firm_Code'] == succ_firm and
|
||||||
|
v['Product_Code'] == succ_product_code][0]
|
||||||
|
G_FirmProd.add_edge(pred_node, succ_node)
|
||||||
|
|
||||||
self.sample.g_firm = json.dumps(nx.adjacency_data(G_Firm))
|
self.sample.g_firm = json.dumps(nx.adjacency_data(G_Firm))
|
||||||
self.firm_network = ap.Network(self, G_Firm)
|
self.firm_network = ap.Network(self, G_Firm)
|
||||||
|
self.firm_prod_network = G_FirmProd
|
||||||
|
|
||||||
# init product
|
# init product
|
||||||
for ag_node, attr in self.product_network.graph.nodes(data=True):
|
for ag_node, attr in self.product_network.graph.nodes(data=True):
|
||||||
|
@ -145,6 +174,112 @@ class Model(ap.Model):
|
||||||
f"product {product.code} not in firm {firm.code}"
|
f"product {product.code} not in firm {firm.code}"
|
||||||
firm.a_lst_product_removed.append(product)
|
firm.a_lst_product_removed.append(product)
|
||||||
|
|
||||||
|
# proactive strategy
|
||||||
|
proactive_ratio = 1.0
|
||||||
|
# get all the firm prod affected
|
||||||
|
for firm, a_lst_product in self.dct_lst_remove_firm_prod.items():
|
||||||
|
for product in a_lst_product:
|
||||||
|
init_node = \
|
||||||
|
[n for n, v in
|
||||||
|
self.firm_prod_network.nodes(data=True)
|
||||||
|
if v['Firm_Code'] == firm.code and
|
||||||
|
v['Product_Code'] == product.code][0]
|
||||||
|
dct_affected = \
|
||||||
|
nx.dfs_successors(self.firm_prod_network,
|
||||||
|
init_node)
|
||||||
|
lst_affected = set()
|
||||||
|
for i, (u, vs) in enumerate(dct_affected.items()):
|
||||||
|
# at least 2 hops away
|
||||||
|
if i > 0:
|
||||||
|
pred_node = self.firm_prod_network.nodes[u]
|
||||||
|
for v in vs:
|
||||||
|
succ_node = self.firm_prod_network.nodes[v]
|
||||||
|
lst_affected.add((succ_node['Firm_Code'],
|
||||||
|
succ_node['Product_Code']))
|
||||||
|
lst_affected = list(lst_affected)
|
||||||
|
lst_firm_proactive = \
|
||||||
|
[lst_affected[i] for i in
|
||||||
|
self.nprandom.choice(range(len(lst_affected)),
|
||||||
|
round(len(lst_affected) *
|
||||||
|
proactive_ratio))]
|
||||||
|
print(lst_firm_proactive)
|
||||||
|
|
||||||
|
for firm_code, prod_code in lst_firm_proactive:
|
||||||
|
pro_firm_prod_code = \
|
||||||
|
[n for n, v in
|
||||||
|
self.firm_prod_network.nodes(data=True)
|
||||||
|
if v['Firm_Code'] == firm_code and
|
||||||
|
v['Product_Code'] == prod_code][0]
|
||||||
|
pro_firm_prod_node = \
|
||||||
|
self.firm_prod_network.nodes[pro_firm_prod_code]
|
||||||
|
pro_firm = \
|
||||||
|
self.a_lst_total_firms.select(
|
||||||
|
[firm.code == pro_firm_prod_node['Firm_Code']
|
||||||
|
for firm in self.a_lst_total_firms])[0]
|
||||||
|
|
||||||
|
# print(list(self.firm_prod_network.predecessors(firm_prod_node)))
|
||||||
|
|
||||||
|
lst_shortest_path = \
|
||||||
|
list(nx.all_shortest_paths(self.firm_prod_network,
|
||||||
|
source=init_node,
|
||||||
|
target=pro_firm_prod_code))
|
||||||
|
|
||||||
|
dct_drs = {}
|
||||||
|
for di_supp_code in self.firm_prod_network.predecessors(
|
||||||
|
pro_firm_prod_code):
|
||||||
|
di_supp_node = \
|
||||||
|
self.firm_prod_network.nodes[di_supp_code]
|
||||||
|
di_supp_prod = \
|
||||||
|
self.a_lst_total_products.select(
|
||||||
|
[product.code == di_supp_node['Product_Code']
|
||||||
|
for product in self.a_lst_total_products])[0]
|
||||||
|
di_supp_firm = \
|
||||||
|
self.a_lst_total_firms.select(
|
||||||
|
[firm.code == di_supp_node['Firm_Code']
|
||||||
|
for firm in self.a_lst_total_firms])[0]
|
||||||
|
lst_cand = self.model.a_lst_total_firms.select([
|
||||||
|
di_supp_prod in firm.a_lst_product
|
||||||
|
and di_supp_prod not in firm.a_lst_product_removed
|
||||||
|
for firm in self.model.a_lst_total_firms
|
||||||
|
])
|
||||||
|
n2n_betweenness = \
|
||||||
|
sum([True if di_supp_code in path else False
|
||||||
|
for path in lst_shortest_path]) \
|
||||||
|
/ len(lst_shortest_path)
|
||||||
|
# print(lst_shortest_path)
|
||||||
|
# print(sum([True if di_supp_code in path else False
|
||||||
|
# for path in lst_shortest_path]), len(lst_shortest_path))
|
||||||
|
drs = n2n_betweenness / \
|
||||||
|
(len(lst_cand) * di_supp_firm.revenue_log)
|
||||||
|
# print(drs)
|
||||||
|
dct_drs[di_supp_code] = drs
|
||||||
|
dct_drs = dict(sorted(
|
||||||
|
dct_drs.items(), key=lambda kv: kv[1], reverse=True))
|
||||||
|
print(dct_drs)
|
||||||
|
for di_supp_code in dct_drs.keys():
|
||||||
|
di_supp_node = \
|
||||||
|
self.firm_prod_network.nodes[di_supp_code]
|
||||||
|
di_supp_prod = \
|
||||||
|
self.a_lst_total_products.select(
|
||||||
|
[product.code == di_supp_node['Product_Code']
|
||||||
|
for product in self.a_lst_total_products])[0]
|
||||||
|
# find a dfferent firm can produce the same product
|
||||||
|
lst_cand = self.model.a_lst_total_firms.select([
|
||||||
|
di_supp_prod in firm.a_lst_product
|
||||||
|
and di_supp_prod not in firm.a_lst_product_removed
|
||||||
|
and firm.code != di_supp_node['Firm_Code']
|
||||||
|
for firm in self.model.a_lst_total_firms
|
||||||
|
])
|
||||||
|
if len(lst_cand) > 0:
|
||||||
|
select_cand = self.nprandom.choice(lst_cand)
|
||||||
|
self.firm_network.graph.add_edges_from([
|
||||||
|
(self.firm_network.positions[select_cand],
|
||||||
|
self.firm_network.positions[pro_firm], {
|
||||||
|
'Product': di_supp_prod.code
|
||||||
|
})
|
||||||
|
])
|
||||||
|
select_cand.dct_prod_capacity[di_supp_prod] -= 1
|
||||||
|
|
||||||
# draw network
|
# draw network
|
||||||
self.draw_network()
|
self.draw_network()
|
||||||
|
|
||||||
|
@ -165,7 +300,18 @@ class Model(ap.Model):
|
||||||
print(list(self.dfs_edges_prod(self.firm_network.graph,
|
print(list(self.dfs_edges_prod(self.firm_network.graph,
|
||||||
self.a_lst_total_firms[133],
|
self.a_lst_total_firms[133],
|
||||||
self.a_lst_total_firms[133].a_lst_product[0])))
|
self.a_lst_total_firms[133].a_lst_product[0])))
|
||||||
print(self.betweenness_centrality_firm_prod(self.firm_network.graph))
|
# print(self.betweenness_centrality_firm_prod(self.firm_network.graph))
|
||||||
|
|
||||||
|
t = nx.dfs_successors(self.firm_prod_network, [n for n, v in self.firm_prod_network.nodes(data=True)
|
||||||
|
if v['Firm_Code'] == self.a_lst_total_firms[133].code and
|
||||||
|
v['Product_Code'] == self.a_lst_total_firms[133].a_lst_product[0].code][0])
|
||||||
|
print(t)
|
||||||
|
for key, values in t.items():
|
||||||
|
pred_node = self.firm_prod_network.nodes[key]
|
||||||
|
for value in values:
|
||||||
|
succ_node = self.firm_prod_network.nodes[value]
|
||||||
|
print(pred_node['Firm_Code'], pred_node['Product_Code'],
|
||||||
|
succ_node['Firm_Code'], succ_node['Product_Code'])
|
||||||
print()
|
print()
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
|
|
BIN
network.png
BIN
network.png
Binary file not shown.
Before Width: | Height: | Size: 3.5 MiB After Width: | Height: | Size: 2.8 MiB |
Loading…
Reference in New Issue