generate network based on size or not

This commit is contained in:
2023-06-11 13:33:39 +08:00
parent 6d43865f79
commit 48077189f0
7 changed files with 42 additions and 30 deletions

View File

@@ -20,9 +20,9 @@ class Model(ap.Model):
self.int_n_max_trial = int(self.p.n_max_trial)
self.int_netw_sply_prf_n = int(self.p.netw_sply_prf_n)
self.flt_netw_sply_prf_size = float(self.p.netw_sply_prf_size)
self.is_netw_sply_prf_size = bool(self.p.netw_sply_prf_size)
self.int_netw_cust_prf_n = int(self.p.netw_cust_prf_n)
self.flt_netw_cust_prf_size = float(self.p.netw_cust_prf_size)
self.is_netw_cust_prf_size = bool(self.p.netw_cust_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)
self.flt_diff_remove = float(self.p.diff_remove)
@@ -80,21 +80,26 @@ class Model(ap.Model):
# 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_n
if n_pred_firm > len(lst_pred_firm):
n_pred_firm = len(lst_pred_firm)
lst_choose_firm = self.nprandom.choice(lst_pred_firm,
n_pred_firm,
replace=False,
p=lst_prob)
# based on size or not
if self.is_netw_sply_prf_size:
lst_pred_firm_size = \
[G_Firm.nodes[pred_firm]['Revenue_Log']
for pred_firm in lst_pred_firm]
lst_prob = \
[size / sum(lst_pred_firm_size)
for size in lst_pred_firm_size]
lst_choose_firm = self.nprandom.choice(lst_pred_firm,
n_pred_firm,
replace=False,
p=lst_prob)
else:
lst_choose_firm = self.nprandom.choice(lst_pred_firm,
n_pred_firm,
replace=False)
lst_add_edge = [(pred_firm, node,
{'Product': pred_product_code})
for pred_firm in lst_choose_firm]
@@ -141,21 +146,28 @@ class Model(ap.Model):
# get a list of firm producing this finished product
lst_succ_firm = Firm['Code'][
Firm[succ_product_code] == 1].to_list()
lst_succ_firm_size_damp = \
[G_Firm.nodes[succ_firm]['Revenue_Log'] **
self.flt_netw_cust_prf_size
for succ_firm in lst_succ_firm]
lst_prob = \
[size_damp / sum(lst_succ_firm_size_damp)
for size_damp in lst_succ_firm_size_damp]
# select multiple customer (multi-selling)
n_succ_firm = self.int_netw_cust_prf_n
if n_succ_firm > len(lst_succ_firm):
n_succ_firm = len(lst_succ_firm)
lst_choose_firm = self.nprandom.choice(lst_succ_firm,
n_succ_firm,
replace=False,
p=lst_prob)
# based on size or not
if self.is_netw_cust_prf_size:
lst_succ_firm_size = \
[G_Firm.nodes[succ_firm]['Revenue_Log']
for succ_firm in lst_succ_firm]
lst_prob = \
[size / sum(lst_succ_firm_size)
for size in lst_succ_firm_size]
lst_choose_firm = \
self.nprandom.choice(lst_succ_firm,
n_succ_firm,
replace=False,
p=lst_prob)
else:
lst_choose_firm = \
self.nprandom.choice(lst_succ_firm,
n_succ_firm,
replace=False)
lst_add_edge = [(node, succ_firm,
{'Product': product_code})
for succ_firm in lst_choose_firm]