from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random author = 'Yinhai' doc = """ Classical PGG with four players in a group, multiplier is 2. """ class Constants(BaseConstants): name_in_url = 'my_public_goods_2' players_per_group = 20 num_rounds = 3 endowment = c(100) multiplier =2 class Subsession(BaseSubsession): pass class Group(BaseGroup): # total_contribution = models.CurrencyField() # individual_share = models.CurrencyField() # def set_payoffs(self): # players = self.get_players() # contributions = [p.contribution for p in players] # self.total_contribution = sum(contributions) # self.individual_share = ( # self.total_contribution * Constants.multiplier / Constants.players_per_group # ) # if self.round_number ==1: # for p in players: # p.payoff = Constants.endowment - p.contribution + self.individual_share # # p.payoff_last_round = p.payoff # else: # for p in players: # p.payoff = p.in_round( self.round_number -1 ).payoff - p.contribution + self.individual_share # def total_contribution_history(self): # return [g.total_contribution for g in self.in_previous_rounds()] # random_list = models.IntegerField() total_population_contribution = models.CurrencyField() average_population_share = models.CurrencyField() group_1_share = models.CurrencyField() group_2_share = models.CurrencyField() group_3_share = models.CurrencyField() group_4_share = models.CurrencyField() group_5_share = models.CurrencyField() total_group_1_contribution = models.CurrencyField() total_group_2_contribution = models.CurrencyField() total_group_3_contribution = models.CurrencyField() total_group_4_contribution = models.CurrencyField() total_group_5_contribution = models.CurrencyField() # subgroup_1 = models.IntegerField() # subgroup_2 = models.IntegerField() # subgroup_3 = models.IntegerField() # subgroup_4 = models.IntegerField() # subgroup_5 = models.IntegerField() # 获取随机序列,进行随机组队:每组4人,共5组 # def random_payer_list(self): # # return [random.shuffle(Constants.list)] # random_list=random.shuffle([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]) def random_list(self): self.total_group_1_contribution = 0 self.total_group_2_contribution = 0 self.total_group_3_contribution = 0 self.total_group_4_contribution = 0 self.total_group_5_contribution = 0 random_list_p = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] return random.shuffle(random_list_p) subgroup_1 = random_list[0:4] subgroup_2 = random_list[4:8] self.subgroup_3 = random_list[8:12] self.subgroup_4 = random_list[12:16] self.subgroup_5 = random_list[16:20] def set_payoffs(self): players = self.get_players() contributions = [p.contribution for p in players] self.total_population_contribution = sum(contributions) self.average_population_share = ( self.total_population_contribution * Constants.multiplier / Constants.players_per_group ) for p in players: if p.id_in_group in self.random_list().subgroup_1: # self.total_group_1_contribution += p.contribution self.total_group_1_contribution += p.contribution # self.total_group_1_contribution = self.total_group_1_contribution + p.contribution if p.id_in_group in self.subgroup_2: # self.total_group_2_contribution += p.contribution self.total_group_2_contribution += p.contribution if p.id_in_group in self.subgroup_3: # self.total_group_3_contribution += p.contribution self.total_group_3_contribution += p.contribution if p.id_in_group in self.subgroup_4: # self.total_group_4_contribution += p.contribution self.total_group_4_contribution += p.contribution if p.id_in_group in self.subgroup_5: # self.total_group_5_contribution += p.contribution self.total_group_5_contribution += p.contribution self.group_1_share = ( self.total_group_1_contribution * Constants.multiplier / 4 ) self.group_2_share = ( self.total_group_2_contribution * Constants.multiplier / 4 ) self.group_3_share = ( self.total_group_3_contribution * Constants.multiplier / 4 ) self.group_4_share = ( self.total_group_4_contribution * Constants.multiplier / 4 ) self.group_5_share = ( self.total_group_5_contribution * Constants.multiplier / 4 ) for p in players: if p.id_in_group in self.subgroup_1: p.payoff = Constants.endowment - p.contribution + 0.75 * self.group_1_share +0.25 * self.average_population_share if p.id_in_group in self.subgroup_2: p.payoff = Constants.endowment - p.contribution + 0.75 * self.group_2_share +0.25 * self.average_population_share if p.id_in_group in self.subgroup_3: p.payoff = Constants.endowment - p.contribution + 0.75 * self.group_3_share +0.25 * self.average_population_share if p.id_in_group in self.subgroup_4: p.payoff = Constants.endowment - p.contribution + 0.75 * self.group_4_share +0.25 * self.average_population_share if p.id_in_group in self.subgroup_5: p.payoff = Constants.endowment - p.contribution + 0.75 * self.group_5_share +0.25 * self.average_population_share class Player(BasePlayer): contribution = models.CurrencyField( min = 0, max = Constants.endowment, label = "How much will you contribute?" ) # def payoff_last_round(self): # # if self.round_number == 1: # # return [p.payoff for p in self.group.get_players()] # if self.round_number >= 2: # return [self.in_round(self.round_number - 1).payoff]