diff --git a/env.py b/env.py index d4102a2..a0707b0 100644 --- a/env.py +++ b/env.py @@ -6,7 +6,6 @@ import math from worker import WorkerAgent from firm import FirmAgent - # plt.ion() @@ -14,14 +13,16 @@ class Env(ap.Model): float_market_size: float # percent_rh: float percent_search: float + + is_RH_ratio: float + is_FH_ratio: float + n_worker: int n_firm: int e_revenue: float - # a_lst_worker: ap.AgentList[WorkerAgent] - # a_lst_firm: ap.AgentList[FirmAgent] - a_lst_worker: ap.AgentList - a_lst_firm: ap.AgentList + a_lst_worker: ap.AgentList[WorkerAgent] + a_lst_firm: ap.AgentList[FirmAgent] """ Worker: Mean(s), Gini(s) @@ -32,15 +33,17 @@ class Env(ap.Model): out_w_gini_salary: float out_f_avg_profit: float out_f_gini_profit: float - # out_w_percent_hired: float - out_f_avg_yield: float + out_w_percent_hired: float + def __init__(self, dct_all): + super().__init__() - def setup(self): # 工作人员、企业数量、搜寻企业数量赋值 - self.n_worker = self.p.n_worker - self.n_firm = self.p.n_firm - self.percent_search = self.p.percent_search + self.n_worker = int(dct_all['n_worker']) + self.n_firm = int(dct_all['n_firm']) + self.percent_search = float(dct_all['percent_search']) + self.is_RH_ratio = float(dct_all['is_RH_ratio']) + self.is_FH_ratio = float(dct_all['is_FH_ratio']) # 工人、企业列表 self.a_lst_worker = ap.AgentList(self) self.a_lst_firm = ap.AgentList(self) @@ -49,15 +52,18 @@ class Env(ap.Model): # 在工人列表中添加工人 for i in range(self.n_worker): # 初始化 worker agent,并把alpha属性传过去 - w = WorkerAgent(self, self.p.alpha) + w = WorkerAgent(self, float(dct_all['alpha'])) self.a_lst_worker.append(w) # 在企业列表中添加企业,放入一个is_RH_ratio, 即有多大比例的企业是属于RH类型的 for i in range(self.n_firm): # 对于企业属性true or false 的判断, 影响到firm 板块下, self.s_IsRH = is_RH 语句的判断 - f = FirmAgent(self, self.p.is_RH_ratio >= uniform(0, 1), self.p.is_FH_ratio >= uniform(0, 1)) + f = FirmAgent(self, self.is_RH_ratio >= uniform(0, 1), self.is_FH_ratio >= uniform(0, 1)) self.a_lst_firm.append(f) + self.running = True + self.t = 0 + def update_e_revenue(self): self.e_revenue += 0.01 * self.e_revenue @@ -84,9 +90,9 @@ class Env(ap.Model): self.update() if self.t == 200: - self.stop() - # self.picture_out() - # pass + self.running = False + else: + self.t += 1 def update(self): lst_salary = [] @@ -100,25 +106,21 @@ class Env(ap.Model): self.out_w_gini_salary = self.gini(lst_salary) lst_profit = [] - lst_a_yield = [] # n_w_firm = 0 for f in self.a_lst_firm: lst_profit.append(f.s_profit) - lst_a_yield.append(f.s_a_yield) # if f.s_profit > 0: # n_w_firm += 1 n_firms = len(lst_profit) self.out_f_avg_profit = sum(lst_profit) / n_firms self.out_f_gini_profit = self.gini(lst_profit) - # self.out_w_percent_hired = n_hired / n_workers - self.out_f_avg_yield = sum(lst_a_yield) / n_firms + self.out_w_percent_hired = n_hired / n_workers self.record('out_w_avg_salary') - self.record('out_f_avg_yield') self.record('out_w_gini_salary') self.record('out_f_avg_profit') self.record('out_f_gini_profit') - # self.record('out_w_percent_hired') + self.record('out_w_percent_hired') def create_and_destroy_bankrupt_firms(self): for f in self.a_lst_firm: @@ -132,7 +134,7 @@ class Env(ap.Model): worker.working_firm = None self.a_lst_firm.remove(f) del f - new_f = FirmAgent(self, self.p.is_RH_ratio >= uniform(0, 1), self.p.is_FH_ratio >= uniform(0, 1)) + new_f = FirmAgent(self, self.is_RH_ratio >= uniform(0, 1), self.is_FH_ratio >= uniform(0, 1)) self.a_lst_firm.append(new_f) else: if f.s_profit < 0: @@ -221,10 +223,10 @@ if __name__ == '__main__': 'percent_search': 0.2, 'is_RH_ratio': 0.5, 'is_FH_ratio': 0.5, - } + } sample = ap.Sample(parameters) # sample = ap.Sample(parameters, n=3) # exp = ap.Experiment(Env, sample, iterations=10, record=True) results = exp.run() - results['variables']['Env'].to_excel('env_data.xlsx', engine='openpyxl') + results['variables']['Env'].to_excel('env_data.xlsx', engine='openpyxl') \ No newline at end of file