experiments in model and firm py
This commit is contained in:
43
model.py
43
model.py
@@ -17,9 +17,15 @@ class Model(ap.Model):
|
||||
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.int_n_max_trial = int(self.p.n_max_trial)
|
||||
|
||||
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_cap_limit = int(self.p.cap_limit)
|
||||
self.flt_diff_remove = float(self.p.diff_remove)
|
||||
|
||||
# init graph bom
|
||||
G_bom = nx.adjacency_graph(json.loads(self.p.g_bom))
|
||||
self.product_network = ap.Network(self, G_bom)
|
||||
@@ -51,15 +57,16 @@ class Model(ap.Model):
|
||||
# get a list of firm producing this successor
|
||||
lst_succ_firm = Firm['Code'][Firm[succ_product_code] ==
|
||||
1].to_list()
|
||||
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
|
||||
]
|
||||
# select multiple successors
|
||||
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_prob = \
|
||||
[size_damp / sum(lst_succ_firm_size_damp)
|
||||
for size_damp in lst_succ_firm_size_damp
|
||||
]
|
||||
# select multiple customer
|
||||
# based on relative size of this firm
|
||||
lst_same_prod_firm = Firm['Code'][Firm[product_code] ==
|
||||
1].to_list()
|
||||
@@ -69,6 +76,8 @@ 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,
|
||||
@@ -106,8 +115,10 @@ class Model(ap.Model):
|
||||
]))
|
||||
# init extra capacity based on discrete uniform distribution
|
||||
for product in firm_agent.a_lst_product:
|
||||
firm_agent.dct_prod_capacity[product] = self.nprandom.integers(
|
||||
firm_agent.revenue_log / 5, firm_agent.revenue_log / 5 + 2)
|
||||
firm_agent.dct_prod_capacity[product] = \
|
||||
self.nprandom.integers(firm_agent.revenue_log / 5,
|
||||
firm_agent.revenue_log / 5 +
|
||||
self.flt_cap_limit)
|
||||
|
||||
self.firm_network.add_agents([firm_agent], [ag_node])
|
||||
self.a_lst_total_firms = ap.AgentList(self, self.firm_network.agents)
|
||||
@@ -220,13 +231,17 @@ class Model(ap.Model):
|
||||
lost_percent = n_up_product_removed / len(
|
||||
product.a_predecessors())
|
||||
lst_size = self.a_lst_total_firms.revenue_log
|
||||
lst_size = [firm.revenue_log for firm in self.a_lst_total_firms
|
||||
lst_size = [firm.revenue_log for firm
|
||||
in self.a_lst_total_firms
|
||||
if product in firm.a_lst_product
|
||||
and product not in firm.a_lst_product_removed
|
||||
and product
|
||||
not in firm.a_lst_product_removed
|
||||
]
|
||||
std_size = (firm.revenue_log - min(lst_size) +
|
||||
1) / (max(lst_size) - min(lst_size) + 1)
|
||||
prod_remove = 1 - std_size * (1 - lost_percent)
|
||||
# damp prod
|
||||
prod_remove = prod_remove ** self.flt_diff_remove
|
||||
if self.nprandom.choice([True, False],
|
||||
p=[prod_remove,
|
||||
1 - prod_remove]):
|
||||
|
||||
Reference in New Issue
Block a user