106 lines
4.0 KiB
Python
106 lines
4.0 KiB
Python
|
from typing import Union, Any
|
|||
|
|
|||
|
import agentpy as ap
|
|||
|
from random import uniform, randint
|
|||
|
|
|||
|
class FirmAgent(ap.Agent):
|
|||
|
c_incentive: float
|
|||
|
s_IsRH: bool
|
|||
|
s_a_senior_yield: float
|
|||
|
s_a_junior_yield: float
|
|||
|
s_a_yield: float
|
|||
|
s_salary: float
|
|||
|
s_revenue: float
|
|||
|
s_profit: float
|
|||
|
l_senior_workers: list
|
|||
|
l_junior_workers: list
|
|||
|
l_applied_workers: list
|
|||
|
|
|||
|
def setup(self):
|
|||
|
self.c_incentive = uniform(0, 1)
|
|||
|
self.s_profit = randint(10, 20)
|
|||
|
self.l_applied_workers = []
|
|||
|
|
|||
|
def apply(self, the_worker):
|
|||
|
self.l_applied_workers.append(the_worker)
|
|||
|
|
|||
|
def select_worker(self):
|
|||
|
'''
|
|||
|
企业找到最想招聘的员工
|
|||
|
:return:
|
|||
|
'''
|
|||
|
n_a_firms = len(self.l_applied_workers)
|
|||
|
# 对员工产出进行排队和比较
|
|||
|
max_s_yield: float
|
|||
|
max_s_yield, best_worker = 0, None
|
|||
|
for i in self.l_applied_workers:
|
|||
|
y = max_s_yield
|
|||
|
if y > max_s_yield:
|
|||
|
max_s_yield = y
|
|||
|
best_worker = i
|
|||
|
# 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:
|
|||
|
# 计算由于改名员工下一期的薪资总数(根据薪资函数更新)以及企业下一期的利润的差值,并选出最大值
|
|||
|
'''
|
|||
|
|
|||
|
def S_a_Yield(self):
|
|||
|
# 更新总产出
|
|||
|
# s_total_senior_yield = self.s_a_senior_yield * len(self.l_senior_workers)
|
|||
|
# s_total_junior_yield = self.s_a_junior_yield * len(self.l_senior_workers)
|
|||
|
l_s_workers = self.l_senior_workers
|
|||
|
l_j_workers = self.l_junior_workers
|
|||
|
# s_a_yield = s_total_yield / len(self.l_senior_workers + self.l_junior_workers)
|
|||
|
s_total_senior_yield, s_total_junior_yield = 0, 0
|
|||
|
'''for i in range(len(self.l_senior_workers)):
|
|||
|
# 加入工人主体的产出属性
|
|||
|
s_total_senior_yield += '工人的yield'
|
|||
|
for i in range (len(self.l_junior_workers)):
|
|||
|
s_total_junior_yield += '工人的yield'
|
|||
|
s_a_senior_yield = s_total_senior_yield / len(l_s_workers)
|
|||
|
s_a_junior_yield = s_total_junior_yield / len(l_j_workers)
|
|||
|
s_a_yield = 0.8*s_a_senior_yield+0.2*s_a_junior_yield
|
|||
|
return s_a_yield
|
|||
|
'''
|
|||
|
return
|
|||
|
|
|||
|
def LogitShare(self):
|
|||
|
'''
|
|||
|
self.logitshare = exp(S_a_Yield)/ np.sum(exp(S_a_Yield))
|
|||
|
:return:
|
|||
|
'''
|
|||
|
return
|
|||
|
|
|||
|
def Sum_salary(self, l_senior_workers, l_junior_workers):
|
|||
|
'''
|
|||
|
计算某公司整体的薪金水平
|
|||
|
'''
|
|||
|
l_all_workers = l_senior_workers + l_junior_workers
|
|||
|
for i in l_all_workers:
|
|||
|
#self.sum_salary = np.sum()
|
|||
|
return
|
|||
|
|
|||
|
def S_Profit(self):
|
|||
|
# self.s_profit =self.LogitShare() * EnvironmentAgent.s_e_Irevenue - self.Sum_salary()
|
|||
|
return
|
|||
|
|
|||
|
def step(self):
|
|||
|
'''
|
|||
|
更新三个集合:
|
|||
|
首先,判断员工i在企业j第t时期的l_applied_workers列表里;
|
|||
|
第二步,判断企业j 的s_IsRH是0或者是1;
|
|||
|
如果是1,则将应聘员工中s_w_yield最大的员工从l_applied_workers列表转移到l_senior_workers或l_junior_workers列表;
|
|||
|
否则(即如果是0),则计算每名员工如果进入企业,下一期企业利润的提升max的员工,
|
|||
|
从l_applied_workers列表转移到l_senior_workers或l_junior_workers列表。
|
|||
|
'''
|