remove crit_supplier

This commit is contained in:
2023-07-28 15:14:59 +08:00
parent 921f03fc44
commit a321df0582
13 changed files with 121 additions and 95 deletions

View File

@@ -228,7 +228,7 @@ class Model(ap.Model):
assert product in firm.dct_prod_up_prod_stat.keys(), \
f"product {product.code} not in firm {firm.code}"
firm.dct_prod_up_prod_stat[
product]['status'].append(('D', self.t))
product]['p_stat'].append(('D', self.t))
# print(f"initial disruption {firm.name} {product.code}")
# proactive strategy
@@ -349,7 +349,7 @@ class Model(ap.Model):
# reduce the size of disrupted firm
for firm in self.a_lst_total_firms:
for prod in firm.dct_prod_up_prod_stat.keys():
status, ts = firm.dct_prod_up_prod_stat[prod]['status'][-1]
status, ts = firm.dct_prod_up_prod_stat[prod]['p_stat'][-1]
if status == 'D':
size = firm.size_stat[-1][0] - \
firm.size_stat[0][0] \
@@ -360,19 +360,19 @@ class Model(ap.Model):
# f'to {firm.size_stat[-1][0]} due to {prod.code}')
lst_is_disrupt = \
[stat == 'D' for stat, _ in
firm.dct_prod_up_prod_stat[prod]['status']
firm.dct_prod_up_prod_stat[prod]['p_stat']
[-1 * self.remove_t:]]
if all(lst_is_disrupt):
# turn disrupted firm into removed firm
# when last self.remove_t times status is all disrupted
firm.dct_prod_up_prod_stat[
prod]['status'].append(('R', self.t))
prod]['p_stat'].append(('R', self.t))
# stop simulation if any firm still in disrupted except inital removal
if self.t > 0:
for firm in self.a_lst_total_firms:
for prod in firm.dct_prod_up_prod_stat.keys():
status, _ = firm.dct_prod_up_prod_stat[prod]['status'][-1]
status, _ = firm.dct_prod_up_prod_stat[prod]['p_stat'][-1]
is_init = \
firm in self.dct_lst_init_disrupt_firm_prod.keys() \
and prod in self.dct_lst_init_disrupt_firm_prod[firm]
@@ -397,9 +397,17 @@ class Model(ap.Model):
for prod in firm.dct_prod_up_prod_stat.keys():
# repetition of disrupted firm that last for multiple ts is ok,
# as their edge has already been removed
status, ts = firm.dct_prod_up_prod_stat[prod]['status'][-1]
status, ts = firm.dct_prod_up_prod_stat[prod]['p_stat'][-1]
if status == 'D' and ts == self.t-1:
firm.remove_edge_to_cus_disrupt_cus_up_prod(prod)
firm.remove_edge_to_cus(prod)
for firm in self.a_lst_total_firms:
for prod in firm.dct_prod_up_prod_stat.keys():
for up_prod in firm.dct_prod_up_prod_stat[prod][
's_stat'].keys():
if firm.dct_prod_up_prod_stat[prod][
's_stat'][up_prod]['lst_disrupt_firm']:
firm.disrupt_cus_prod(prod, up_prod)
for n_trial in range(self.int_n_max_trial):
# print('=' * 10, 'trial', n_trial, '=' * 10)
@@ -410,7 +418,7 @@ class Model(ap.Model):
for firm in self.a_lst_total_firms:
lst_seek_prod = []
for prod in firm.dct_prod_up_prod_stat.keys():
status = firm.dct_prod_up_prod_stat[prod]['status'][-1][0]
status = firm.dct_prod_up_prod_stat[prod]['p_stat'][-1][0]
if status == 'D':
for supply in firm.dct_prod_up_prod_stat[
prod]['supply'].keys():
@@ -448,11 +456,11 @@ class Model(ap.Model):
for prod, dct_status_supply in \
firm.dct_prod_up_prod_stat.items():
lst_is_normal = [stat == 'N' for stat, _
in dct_status_supply['status']]
in dct_status_supply['p_stat']]
if not all(lst_is_normal):
# print(f"{firm.name} {prod.code}:")
# print(dct_status_supply['status'])
for status, ts in dct_status_supply['status']:
# print(dct_status_supply['p_stat'])
for status, ts in dct_status_supply['p_stat']:
db_r = Result(s_id=self.sample.id,
id_firm=firm.code,
id_product=prod.code,