sample removal + seek connect first

This commit is contained in:
2023-06-10 18:59:38 +08:00
parent 813a3cf2ff
commit 0e40f90559
12 changed files with 142 additions and 58 deletions

View File

@@ -1,7 +1,7 @@
import agentpy as ap
import pandas as pd
import numpy as np
import random
# import random
import networkx as nx
from firm import FirmAgent
from product import ProductAgent
@@ -14,15 +14,15 @@ class Model(ap.Model):
def setup(self):
self.sample = self.p.sample
self.int_stop_times, self.int_stop_t = 0, None
self.random = random.Random(self.p.seed)
# self.random = random.Random(self.p.seed)
self.nprandom = np.random.default_rng(self.p.seed)
self.int_n_iter = int(self.p.n_iter)
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_pref_cust_n = float(self.p.netw_pref_cust_n)
self.flt_netw_pref_cust_size = float(self.p.netw_pref_cust_size)
self.flt_netw_pref_supp_n = float(self.p.netw_pref_supp_n)
self.flt_netw_pref_supp_size = float(self.p.netw_pref_supp_size)
self.flt_cap_limit = int(self.p.cap_limit)
self.flt_diff_remove = float(self.p.diff_remove)
self.proactive_ratio = float(self.p.proactive_ratio)
@@ -69,22 +69,23 @@ class Model(ap.Model):
# add edge to G_firm according to G_bom
for node in nx.nodes(G_Firm):
for product_code in G_Firm.nodes[node]['Product_Code']:
for succ_product_code in list(G_bom.successors(product_code)):
for pred_product_code in \
list(G_bom.predecessors(product_code)):
# for each product of a certain firm
# get each successor (finished product) of this product
# get a list of firm producing this successor
lst_succ_firm = Firm['Code'][Firm[succ_product_code] ==
# 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_succ_firm_size_damp = \
[G_Firm.nodes[succ_firm]['Revenue_Log'] **
self.flt_netw_pref_cust_size
for succ_firm in lst_succ_firm
lst_pred_firm_size_damp = \
[G_Firm.nodes[pred_firm]['Revenue_Log'] **
self.flt_netw_pref_supp_size
for pred_firm in lst_pred_firm
]
lst_prob = \
[size_damp / sum(lst_succ_firm_size_damp)
for size_damp in lst_succ_firm_size_damp
[size_damp / sum(lst_pred_firm_size_damp)
for size_damp in lst_pred_firm_size_damp
]
# select multiple customer
# select multiple supplier
# based on relative size of this firm
lst_same_prod_firm = Firm['Code'][Firm[product_code] ==
1].to_list()
@@ -95,27 +96,31 @@ class Model(ap.Model):
share = G_Firm.nodes[node]['Revenue_Log'] / sum(
lst_same_prod_firm_size)
# damp share
share = share ** self.flt_netw_pref_cust_n
n_succ_firm = round(share * len(lst_succ_firm)) if round(
share * len(lst_succ_firm)) > 0 else 1 # at least one
lst_choose_firm = self.nprandom.choice(lst_succ_firm,
n_succ_firm,
share = share ** self.flt_netw_pref_supp_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, succ_firm, {
lst_add_edge = [(node, pred_firm, {
'Product': product_code
}) for succ_firm in lst_choose_firm]
}) for pred_firm in lst_choose_firm]
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)
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)
# unconnected node
# for node in nx.nodes(G_Firm):
# if node.
self.sample.g_firm = json.dumps(nx.adjacency_data(G_Firm))
self.firm_network = ap.Network(self, G_Firm)
@@ -367,12 +372,17 @@ class Model(ap.Model):
]
std_size = (firm.revenue_log - min(lst_size) +
1) / (max(lst_size) - min(lst_size) + 1)
prod_remove = 1 - std_size * (1 - lost_percent)
prob_remove = 1 - std_size * (1 - lost_percent)
# sample prob
prob_remove = self.nprandom.uniform(
prob_remove - 0.1, prob_remove + 0.1)
prob_remove = 1 if prob_remove > 1 else prob_remove
prob_remove = 0 if prob_remove < 0 else prob_remove
# damp prod
prod_remove = prod_remove ** self.flt_diff_remove
prob_remove = prob_remove ** self.flt_diff_remove
if self.nprandom.choice([True, False],
p=[prod_remove,
1 - prod_remove]):
p=[prob_remove,
1 - prob_remove]):
firm.a_lst_product_removed.append(product)
if firm in self.dct_lst_remove_firm_prod.keys():
self.dct_lst_remove_firm_prod[firm].append(