forked from omelyanchikd/ace
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patholigopoly_firm.py
37 lines (30 loc) · 1.36 KB
/
oligopoly_firm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from firm import Firm
from firm_action import FirmAction
from firm_goodmarket_action import FirmGoodMarketAction
from firm_labormarket_action import FirmLaborMarketAction
import random
import math
import numpy
def rls(a, p, x, y):
K = numpy.dot(p, x.T)/(numpy.dot(numpy.dot(x, p),x.T) + 1)
a = a - K * (numpy.dot(x, a) - y)
p = p - numpy.dot(K,numpy.dot(x, p))
return a[0], a[1], p
class OligopolyFirm(Firm):
def __init__(self, id):
super().__init__(id)
self.salary = 200
self.a = 10000
self.b = -50
self.p1 = numpy.eye(2) * 10000
def decide_price(self, stats):
return FirmGoodMarketAction(self.stock, self.price, 0)
def decide_salary(self, stats):
self.a, self.b, self.p1 = rls(numpy.array([self.a, self.b]), self.p1, numpy.array([1, self.sold]), self.price)
self.offer_count = math.floor(stats.f * (self.a - self.salary / self.efficiency_coefficient/((stats.f + 1) * (-self.b * self.efficiency_coefficient))))- len(self.workers)
while self.offer_count < 0:
self.fire_worker(random.choice(list(self.workers)))
self.offer_count += 1
self.price = (self.a + stats.f * self.salary/self.efficiency_coefficient)/ (stats.f + 1)
self.price = self.price if self.price > 0 else 0
return FirmLaborMarketAction(self.offer_count, self.salary, [])