After code review. Fig produced.

This commit is contained in:
He Zhou 2023-01-18 22:21:22 +08:00
parent d6dfe2f6c6
commit 9de2115ce8
15 changed files with 126 additions and 187 deletions

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (salary02)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (abm) (3)" project-jdk-type="Python SDK" />
</project> </project>

View File

@ -2,7 +2,7 @@
<project version="4"> <project version="4">
<component name="ProjectModuleManager"> <component name="ProjectModuleManager">
<modules> <modules>
<module fileurl="file://$PROJECT_DIR$/.idea/hire.iml" filepath="$PROJECT_DIR$/.idea/hire.iml" /> <module fileurl="file://$PROJECT_DIR$/.idea/salary02.iml" filepath="$PROJECT_DIR$/.idea/salary02.iml" />
</modules> </modules>
</component> </component>
</project> </project>

View File

@ -4,7 +4,7 @@
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" /> <excludeFolder url="file://$MODULE_DIR$/venv" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.8 (salary02)" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.9 (abm) (3)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

View File

@ -1,10 +1,11 @@
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import matplotlib.pyplot as plt
num_time_step = 200 num_time_step = 200
num_iter = 10 num_iter = 10
env_data = pd.DataFrame(pd.read_excel('env_data.xlsx', engine='openpyxl')) env_data = pd.DataFrame(pd.read_excel('env_data.xlsx', engine='openpyxl', sheet_name=0))
assert env_data.shape[0] == num_iter * (num_time_step + 1) assert env_data.shape[0] == num_iter * (num_time_step + 1)
@ -12,16 +13,16 @@ lst_df = []
for i in range(num_iter): for i in range(num_iter):
df_tmp = env_data.iloc[i * (num_time_step + 1): (i + 1) * (num_time_step + 1), 1:] df_tmp = env_data.iloc[i * (num_time_step + 1): (i + 1) * (num_time_step + 1), 1:]
lst_df.append(df_tmp) lst_df.append(df_tmp)
# df_tmp = env_data.iloc[1: 21]
# lst_df.append(df_tmp)
lst_column = lst_df[0].columns[1:]
x = np.array(env_data[['t']]) for str_col in lst_column:
y = np.array(env_data[['out_w_avg_salary']]) x = np.arange(num_time_step+1)
for df in lst_df:
import matplotlib.pyplot as plt y = np.array(df[str_col]).flatten()
plt.xlabel('t')
plt.xlabel('t') plt.ylabel(str_col)
plt.ylabel('out_w_avg_salary') plt.plot(x, y)
plt.plot(x, y) # plt.show()
plt.show() # plt.close()
plt.savefig(f'{str_col}.pdf', bbox_inches="tight")

89
env.py
View File

@ -3,27 +3,26 @@ import numpy as np
from random import uniform from random import uniform
import math import math
from traits.trait_types import self
from worker import WorkerAgent from worker import WorkerAgent
from firm import FirmAgent from firm import FirmAgent
# plt.ion() # plt.ion()
class Env(ap.Model): class Env(ap.Model):
float_market_size: float float_market_size: float
percent_rh: float # percent_rh: float
percent_search: float percent_search: float
n_worker: int n_worker: int
n_firm: int n_firm: int
e_revenue: float e_revenue: float
a_lst_worker: ap.AgentList a_lst_worker: ap.AgentList[WorkerAgent]
a_lst_firm: ap.AgentList a_lst_firm: ap.AgentList[FirmAgent]
""" """
Worker: Mean(s), Gini(s) Worker: Mean(s), Gini(s)
Firm: Mean(($$\pi_{j,t}$$)), Gini($$\pi_{j,t}$$) Firm: Mean((pi_{j,t})), Gini(pi_{j,t})
Env: Percent(IsHired) Env: Percent(IsHired)
""" """
out_w_avg_salary: float out_w_avg_salary: float
@ -44,7 +43,7 @@ class Env(ap.Model):
# 在工人列表中添加工人 # 在工人列表中添加工人
for i in range(self.n_worker): for i in range(self.n_worker):
# 初始化 workeragent并把alpha属性传过去 # 初始化 worker agent并把alpha属性传过去
w = WorkerAgent(self, self.p.alpha) w = WorkerAgent(self, self.p.alpha)
self.a_lst_worker.append(w) self.a_lst_worker.append(w)
@ -74,13 +73,15 @@ class Env(ap.Model):
self.create_and_destroy_bankrupt_firms() self.create_and_destroy_bankrupt_firms()
self.a_lst_worker.update_wd_by_is_hired()
# self.picture_out() # self.picture_out()
self.update() self.update()
if self.t == 200: if self.t == 200:
self.stop() self.stop()
# self.picture_out() # self.picture_out()
pass # pass
def update(self): def update(self):
lst_salary = [] lst_salary = []
@ -94,11 +95,11 @@ class Env(ap.Model):
self.out_w_gini_salary = self.gini(lst_salary) self.out_w_gini_salary = self.gini(lst_salary)
lst_profit = [] lst_profit = []
n_w_firm = 0 # n_w_firm = 0
for f in self.a_lst_firm: for f in self.a_lst_firm:
lst_profit.append(f.s_profit) lst_profit.append(f.s_profit)
if f.s_profit > 0: # if f.s_profit > 0:
n_w_firm += 1 # n_w_firm += 1
n_firms = len(lst_profit) n_firms = len(lst_profit)
self.out_f_avg_profit = sum(lst_profit) / n_firms self.out_f_avg_profit = sum(lst_profit) / n_firms
self.out_f_gini_profit = self.gini(lst_profit) self.out_f_gini_profit = self.gini(lst_profit)
@ -111,54 +112,37 @@ class Env(ap.Model):
self.record('out_w_percent_hired') self.record('out_w_percent_hired')
def create_and_destroy_bankrupt_firms(self): def create_and_destroy_bankrupt_firms(self):
n_bankrupt_firms = 0
for f in self.a_lst_firm: for f in self.a_lst_firm:
if f.s_value < 0: if f.s_value < 0:
# 直接淘汰企业(此处设定为清空企业员工,清空企业利润值和价值,相当于重新添加了一个新的企业?) # 直接淘汰企业,并新增一个企业
n_bankrupt_firms += 1 for worker in f.l_senior_workers:
for work in f.l_senior_workers: worker.s_is_hired = False
work.s_is_hired = False worker.working_firm = None
for work in f.l_junior_workers: for worker in f.l_junior_workers:
work.s_is_hired = False worker.s_is_hired = False
f.s_profit = 0 worker.working_firm = None
f.s_value = 0 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))
self.a_lst_firm.append(new_f)
else: else:
if f.s_profit < 0: if f.s_profit < 0:
if f.s_IsFH:
# 第一种方式,末位淘汰制,淘汰所有员工中生产价值最低的
f.l_junior_workers.sort(key=lambda x: x['s_yield'], reverse=True)
for work in f.l_junior_workers:
# f.l_junior_workers.sort(key=lambda x: x['s_yield'], reverse=True)
if work == f.l_junior_workers[-1]:
work.s_is_hired = False
else:
# 第二种方式,末位淘汰制,淘汰所有员工中单位产值(产值/工资)价值最低的
f.l_all_w = f.l_junior_workers + f.l_senior_workers f.l_all_w = f.l_junior_workers + f.l_senior_workers
for work in f.l_all_w: min_unit_yield_salary, worst_worker = float('inf'), None
work.unit_yield_salary = work.s_yield * 10000 / work.s_salary for worker in f.l_all_w:
f.l_all_w.sort(key=lambda x: x['unit_yield_salary'], reverse=True) unit_yield_salary = worker.s_yield if f.s_IsFH else worker.s_yield * 10000 / worker.s_salary
if work == f.l_all_w[-1]: if unit_yield_salary < min_unit_yield_salary:
work.s_is_hired = False min_unit_yield_salary = unit_yield_salary
# for f in self.a_lst_firm: worst_worker = worker
# if f.s_profit < 0: # TODO worst_worker.s_is_hired = False
# n_bankrupt_firms += 1 worst_worker.working_firm = None
# for work in f.l_senior_workers:
# work.s_is_hired = False
# for work in f.l_junior_workers:
# work.s_is_hired = False
# self.a_lst_firm.remove(f)
# del f
# if n_bankrupt_firms > 0:
# for _ in range(n_bankrupt_firms):
# f = FirmAgent(self, self.p.is_RH_ratio >= uniform(0, 1))
# self.a_lst_firm.append(f)
assert len(self.a_lst_firm) == self.n_firm, \ assert len(self.a_lst_firm) == self.n_firm, \
f'current num firm {len(self.a_lst_firm)} != expected num firm {self.n_firm}' f'current num firm {len(self.a_lst_firm)} != expected num firm {self.n_firm}'
def provide_lst_random_firms(self, the_worker: WorkerAgent): def provide_lst_random_firms(self, the_worker: WorkerAgent):
'''选择企业数量 = 企业总数*百分比 """
选择企业数量 = 企业总数*百分比
选择企业的列表 = 随机选择的企业的个数 选择企业的列表 = 随机选择的企业的个数
如果员工处于被雇佣的状态 如果员工处于被雇佣的状态
如果员工工作的企业在随机选定的企业列表中 如果员工工作的企业在随机选定的企业列表中
@ -167,7 +151,7 @@ class Env(ap.Model):
返回值移除后再重新选择随机选择企业 返回值移除后再重新选择随机选择企业
否则 否则
返回值选择企业列表 返回值选择企业列表
''' """
n_select_firms = int(self.percent_search * self.n_firm) n_select_firms = int(self.percent_search * self.n_firm)
a_lst_select_firms = self.a_lst_firm.random(n_select_firms) a_lst_select_firms = self.a_lst_firm.random(n_select_firms)
if the_worker.s_is_hired: if the_worker.s_is_hired:
@ -194,6 +178,7 @@ class Env(ap.Model):
@staticmethod @staticmethod
def gini(x): def gini(x):
x = [ele for ele in x if ele > 0]
if len(x) == 0: if len(x) == 0:
return 0 return 0
if sum(x) == 0: if sum(x) == 0:
@ -223,9 +208,8 @@ if __name__ == '__main__':
parameters = { parameters = {
'n_worker': 1000, 'n_worker': 1000,
'n_firm': 100, 'n_firm': 100,
'percent_search': 0.2,
'alpha': 0.5, 'alpha': 0.5,
# 'alpha': ap.Range(0, 1, 0.5), 'percent_search': 0.2,
'is_RH_ratio': 0.5, 'is_RH_ratio': 0.5,
'is_FH_ratio': 0.5, 'is_FH_ratio': 0.5,
} }
@ -235,4 +219,3 @@ if __name__ == '__main__':
exp = ap.Experiment(Env, sample, iterations=10, record=True) exp = ap.Experiment(Env, sample, iterations=10, record=True)
results = exp.run() results = exp.run()
results['variables']['Env'].to_excel('env_data.xlsx', engine='openpyxl') results['variables']['Env'].to_excel('env_data.xlsx', engine='openpyxl')

Binary file not shown.

86
firm.py
View File

@ -1,46 +1,42 @@
import math import math
from typing import Union, Any # from typing import Union, Any
import agentpy as ap import agentpy as ap
from random import uniform, randint from random import uniform, randint
from typing import TYPE_CHECKING # from typing import TYPE_CHECKING
import numpy as np # import numpy as np
if TYPE_CHECKING: # if TYPE_CHECKING:
from worker import WorkerAgent # from worker import WorkerAgent
class FirmAgent(ap.Agent): class FirmAgent(ap.Agent):
c_incentive: float c_incentive: float
s_IsRH: bool s_IsRH: bool
s_IsFH: bool s_IsFH: bool
s_avg_senior_yield: float s_avg_senior_yield: float # updated in self.update_yields
s_avg_junior_yield: float s_avg_junior_yield: float # updated in self.update_yields
s_a_yield: float s_a_yield: float # updated in self.update_yields
# s_salary: float # s_salary: float
initial_f_salary: float initial_f_salary: float
s_revenue: float s_revenue: float # updated in env.provide_logit_share
s_profit: float s_profit: float # updated in self.update_s_profit
s_value: float s_value: float # updated in self.update_s_profit
firing_worker: 'WorkerAgent' # firing_worker: 'WorkerAgent'
l_senior_workers: list l_senior_workers: list # updated in self.update_two_worker_list
l_junior_workers: list l_junior_workers: list # updated in self.update_two_worker_list
l_applied_workers: list l_applied_workers: list # updated in self.apply, self.empty_apply
# def __init__(self, model, *args, **kwargs): def setup(self, is_rh, is_fh):
# super().__init__(model, args, kwargs)
# self.l_all_workers = None
def setup(self, is_RH, is_FH):
self.c_incentive = uniform(0, 1) self.c_incentive = uniform(0, 1)
# self.s_profit = randint(10, 20) # self.s_profit = randint(10, 20)
self.l_senior_workers, self.l_junior_workers = [], [] self.l_senior_workers, self.l_junior_workers = [], []
self.l_all_workers = [] # self.l_all_workers = []
self.l_applied_workers = [] self.l_applied_workers = []
self.s_IsRH = is_RH self.s_IsRH = is_rh
self.s_IsFH = is_FH self.s_IsFH = is_fh
self.initial_f_salary = randint(8000, 10000) self.initial_f_salary = randint(8000, 10000)
self.s_profit = 0 self.s_profit = 0
self.s_value = 0 self.s_value = 0
@ -52,13 +48,13 @@ class FirmAgent(ap.Agent):
self.l_applied_workers = [] self.l_applied_workers = []
def select_worker(self): def select_worker(self):
''' """
企业找到最想招聘的员工 企业找到最想招聘的员工
:return: :return:
''' """
n_workers = len(self.l_applied_workers) n_workers = len(self.l_applied_workers)
if n_workers > 0: if n_workers > 0:
selected_worker = None # selected_worker = None
if n_workers > 1: if n_workers > 1:
# 对员工产出进行排队和比较 # 对员工产出进行排队和比较
# 先判断是什么选择方式 # 先判断是什么选择方式
@ -70,35 +66,21 @@ class FirmAgent(ap.Agent):
best_worker = the_worker best_worker = the_worker
selected_worker = best_worker selected_worker = best_worker
else: else:
# selected_worker = self.l_applied_workers[0] # TODO # selected_worker = self.l_applied_workers[0]
# 加入worker进入到某个企业企业更新了自己的利润利润差值作为该名员工能带来的单位利润排序利润 # 加入worker进入到某个企业企业更新了自己的利润利润差值作为该名员工能带来的单位利润排序利润
# 但是代码中对于员工产出是01需要先更新员工所在列表然后更新企业产出、利润、工资总额再用假设利润-上期利润 # 但是代码中对于员工产出是01需要先更新员工所在列表然后更新企业产出、利润、工资总额再用假设利润-上期利润
# 问题是当期的估算不能考虑到有员工会在下一期离指的问题或许考虑换成max_单位产出成本 # 问题是当期的估算不能考虑到有员工会在下一期离指的问题或许考虑换成max_单位产出成本
max_unit_yield_salary, p_salary, best_worker= 0.0,0.0, None max_unit_yield_salary, p_salary, best_worker = 0.0, 0.0, None
for the_worker in self.l_applied_workers: for the_worker in self.l_applied_workers:
if the_worker.s_salary == 0: if the_worker.s_salary == 0:
the_worker.p_salary = self.initial_f_salary p_salary = self.initial_f_salary
else: else:
the_worker.p_salary = the_worker.s_salary*(1+self.c_incentive) p_salary = the_worker.s_salary * (1 + self.c_incentive)
the_worker.unit_yield_salary = the_worker.s_yield * 10000 / the_worker.p_salary unit_yield_salary = the_worker.s_yield * 10000 / p_salary
if the_worker.unit_yield_salary > max_unit_yield_salary: if unit_yield_salary > max_unit_yield_salary:
max_unit_yield_salary = the_worker.unit_yield_salary max_unit_yield_salary = unit_yield_salary
best_worker = the_worker best_worker = the_worker
selected_worker = best_worker selected_worker = best_worker
# print(f'{self}: my best firm is {best_firm} from {n_firms} firms with utility {max_utility}')
# return best_worker
# 当企业是想要利用产出最高的员工时,从申请的员工中选出产出最高的员工
# if self.s_IsRH :
# # 计算该名员工的工资水平: 原有工资水平* 1+incentive
# # bw_salary = self.best_worker.salary()
#
# # 将该名员工的产出与公司原有员工的产出进行对比如果高于senior列表中的最后一名的产出就进入senior_list, 否则进入junior_list
# self.l_senior_workers.append(best_worker)
# else:
# self.l_junior_workers.append(best_worker)
# # best_worker.apply(self)
# else:
# # 计算由于改名员工下一期的薪资总数(根据薪资函数更新)以及企业下一期的利润的差值,并选出最大值
else: else:
selected_worker = self.l_applied_workers[0] selected_worker = self.l_applied_workers[0]
selected_worker.update_working_firm_is_hired(self) selected_worker.update_working_firm_is_hired(self)
@ -106,7 +88,7 @@ class FirmAgent(ap.Agent):
def update_two_worker_list(self, new_worker): def update_two_worker_list(self, new_worker):
lst_all_worker = self.l_senior_workers + self.l_junior_workers + [new_worker] lst_all_worker = self.l_senior_workers + self.l_junior_workers + [new_worker]
lst_all_worker.sort(key=lambda x: x['s_yield'], reverse=True) # from highest yield to lowest lst_all_worker.sort(key=lambda x: x['s_yield'], reverse=True) # from the highest yield to lowest
n_all_worker = len(lst_all_worker) n_all_worker = len(lst_all_worker)
# 向上取整数值 # 向上取整数值
n_senior_worker = math.ceil(n_all_worker * 0.2) n_senior_worker = math.ceil(n_all_worker * 0.2)
@ -142,9 +124,9 @@ class FirmAgent(ap.Agent):
self.s_a_yield = 0.8 * self.s_avg_senior_yield + 0.2 * self.s_avg_junior_yield self.s_a_yield = 0.8 * self.s_avg_senior_yield + 0.2 * self.s_avg_junior_yield
def get_sum_salary(self): def get_sum_salary(self):
''' """
计算某公司整体的薪金水平 计算某公司整体的薪金水平
''' """
l_all_workers = self.l_senior_workers + self.l_junior_workers l_all_workers = self.l_senior_workers + self.l_junior_workers
sum_salary = 0.0 sum_salary = 0.0
for the_worker in l_all_workers: for the_worker in l_all_workers:
@ -155,5 +137,5 @@ class FirmAgent(ap.Agent):
self.s_profit = self.s_revenue - self.get_sum_salary() self.s_profit = self.s_revenue - self.get_sum_salary()
self.s_value += self.s_profit self.s_value += self.s_profit
def step(self): # def step(self):
pass # pass

16
main.py
View File

@ -1,16 +0,0 @@
# This is a sample Python script.
# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
def print_hi(name):
# Use a breakpoint in the code line below to debug your script.
print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint.
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
print_hi('PyCharm')
# See PyCharm help at https://www.jetbrains.com/help/pycharm/

25
oa25.txt Normal file
View File

@ -0,0 +1,25 @@
000000
011234
022341
033412
044123
101111
112403
124032
130324
143240
202222
214310
223104
231043
240431
303333
310142
321420
334201
342014
404444
413021
420213
432130
441302

BIN
out_f_avg_profit.pdf Normal file

Binary file not shown.

BIN
out_f_gini_profit.pdf Normal file

Binary file not shown.

BIN
out_w_avg_salary.pdf Normal file

Binary file not shown.

BIN
out_w_gini_salary.pdf Normal file

Binary file not shown.

BIN
out_w_percent_hired.pdf Normal file

Binary file not shown.

View File

@ -12,43 +12,33 @@ if TYPE_CHECKING:
class WorkerAgent(ap.Agent): class WorkerAgent(ap.Agent):
select_firm: object # select_firm: object
c_effort: float c_effort: float # used in self.update_yield
s_is_hired: bool s_is_hired: bool # updated in self.update_working_firm_is_hired, env.create_and_destroy_bankrupt_firms
# c_work_months: int # c_work_months: int
s_work_duration: int s_work_duration: int # updated in self.update_wd_by_is_hired
working_firm: 'FirmAgent' working_firm: 'FirmAgent' # updated in self.update_working_firm_is_hired, env.create_and_destroy_bankrupt_firms
s_salary: float s_salary: float # updated in self.update_salary
s_yield: float s_yield: float # updated in self.update_yield
# s_w_applied: bool # s_w_applied: bool
c_alpha: float c_alpha: float
def setup(self, alpha): def setup(self, alpha):
# super().__init__(unique_id, model)
# self.num_workers = 10000
self.c_effort = uniform(0, 1) self.c_effort = uniform(0, 1)
# self.c_work_months = randint(0, 60)
self.s_is_hired = False self.s_is_hired = False
self.s_work_duration = randint(0, 60) self.s_work_duration = randint(30, 60)
self.c_alpha = alpha self.c_alpha = alpha
self.update_yield() self.update_yield()
self.s_salary = 0 self.s_salary = 0
# return
# def A_Utility(self, c_w_weight=0.5):
# a = np.exp(FirmAgent.c_f_incentive, c_w_weight)
# b = np.exp(FirmAgent.s_f_profit/max(FirmAgent.s_f_profit), 1-c_w_weight)
# self.select_firm = a * b
def select_firm(self): def select_firm(self):
''' """
挑选出来的企业列表 挑选出来的企业列表
数量列表的长度 数量列表的长度
''' """
lst_firms = self.model.provide_lst_random_firms(self) lst_firms = self.model.provide_lst_random_firms(self)
n_firms = len(lst_firms) # n_firms = len(lst_firms)
# find the max incentive and profit among all firms # find the max incentive and profit among all firms
max_incentive, max_value = 0, 0 max_incentive, max_value = 0, 0
for f in lst_firms: for f in lst_firms:
@ -61,22 +51,14 @@ class WorkerAgent(ap.Agent):
return random.choice(lst_firms) return random.choice(lst_firms)
max_utility, best_firm = 0, None max_utility, best_firm = 0, None
for f in lst_firms: for f in lst_firms:
if self.s_salary < f.s_profit * 1 / 10: if self.s_salary < f.s_profit / 10:
u = math.pow(f.c_incentive / max_incentive, self.c_alpha) * math.pow(f.s_value / max_value, u = math.pow(f.c_incentive / max_incentive, self.c_alpha) * math.pow(f.s_value / max_value,
1 - self.c_alpha) 1 - self.c_alpha)
if u > max_utility: if u > max_utility:
max_utility = u max_utility = u
best_firm = f best_firm = f
# if self.s_salary < best_firm.s_profit * 5 / 100:
best_firm.apply(self) best_firm.apply(self)
# print(f'{self}: my best firm is {best_firm} from {n_firms} firms with utility {max_utility}')
# 选出能够给自己带来最好的效用的企业,并输出/返回
# best_firm.apply(self)
# return best_firm
# self.update_wd_by_is_hired()
def update_wd_by_is_hired(self): def update_wd_by_is_hired(self):
if self.s_is_hired: if self.s_is_hired:
self.s_work_duration += 1 self.s_work_duration += 1
@ -84,22 +66,10 @@ class WorkerAgent(ap.Agent):
self.update_salary(self.working_firm) self.update_salary(self.working_firm)
def update_salary(self, the_firm: 'FirmAgent'): def update_salary(self, the_firm: 'FirmAgent'):
if self.s_salary == 0: if self.s_salary == 0:
self.s_salary = the_firm.initial_f_salary self.s_salary = the_firm.initial_f_salary
pass
else: else:
if self.s_salary <= the_firm.s_profit*1/10: self.s_salary = max(min(self.s_salary * (1 + the_firm.c_incentive), the_firm.s_profit / 10), self.s_salary)
if self.s_salary * (1 + the_firm.c_incentive) <= the_firm.s_profit*1/10:
self.s_salary = self.s_salary * (1 + the_firm.c_incentive)
pass
else:
self.s_salary = the_firm.s_profit*1/10
pass
pass
else:
self.s_salary = the_firm.s_profit*1/10
def update_yield(self): def update_yield(self):
self.s_yield = 2 / (1 + math.exp(-0.01 * self.s_work_duration * self.c_effort)) - 1 self.s_yield = 2 / (1 + math.exp(-0.01 * self.s_work_duration * self.c_effort)) - 1
@ -108,9 +78,3 @@ class WorkerAgent(ap.Agent):
self.s_is_hired = True self.s_is_hired = True
self.working_firm = f self.working_firm = f
self.update_wd_by_is_hired() self.update_wd_by_is_hired()
def step(self):
self.update_wd_by_is_hired()
'''
是否更换公司成功的状态转换
'''