from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ Здесь воспроизводим модель олигополии по Курно. """ class Constants(BaseConstants): name_in_url = 'cournot' players_per_group = 5 num_rounds = 5 instructions_template = 'cournot/Instructions.html' # Total production capacity of all players total_capacity = 1000 marginal_price = 2#D(p) = 500-2*p; v = class Subsession(BaseSubsession): def creating_session(self): playrs = self.get_players() if self.round_number == 1: for p in playrs: p.marginal_cost = 10*random.randint(1, 20) p.maximal_capacity = random.randint(1, 300) p.participant.vars['marginal_cost'] = p.marginal_cost p.participant.vars['maximal_capacity'] = p.maximal_capacity else: for p in playrs: p.marginal_cost = p.participant.vars.get('marginal_cost') p.maximal_capacity = p.participant.vars.get('maximal_capacity') pass class Group(BaseGroup): price = models.CurrencyField( doc="""Обратная функция спроса: P = 500 - \sum U_i/2, где U_i - объем производства игрока i (т.е. цена линейно зависит от совокупного объема производства)""" ) total_units = models.PositiveIntegerField( doc="""Общий объем производства всех участников вашего рынка""" ) def set_payoffs(self): self.total_units = sum([p.units for p in self.get_players()]) self.price = (Constants.total_capacity - self.total_units )/Constants.marginal_price if self.price < 0: self.price = 0 for p in self.get_players(): p.payoff = self.price * p.units - p.marginal_cost*p.units class Player(BasePlayer): units = models.PositiveIntegerField( min=0, max=Constants.total_capacity, doc="""Ваш объем производства""" ) marginal_cost = models.PositiveIntegerField() maximal_capacity = models.PositiveIntegerField() name = models.StringField() phone_number = models.StringField() email = models.StringField() def other_players(self): return self.get_others_in_group()