sample removal + seek connect first
This commit is contained in:
72
model.py
72
model.py
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user