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 = 6 num_rounds = 3 endowment = c(100) multiplier =2 class Subsession(BaseSubsession): pass class Group(BaseGroup): 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() subgroup_1_payoff_list = models.CurrencyField() # subgroup_2_payoff_list = models.CurrencyField() # subgroup_3_payoff_list = models.CurrencyField() # # subgroup_4_payoff_list = list() # # subgroup_5_payoff_list = list() def set_payoffs(self): #-------随机分组------- random_list = [1,2,3,4,5,6] random.shuffle(random_list) subgroup_1 = random_list[0:2] subgroup_2 = random_list[2:4] subgroup_3 = random_list[4:6] # subgroup_4 = random_list[12:16] # subgroup_5 = random_list[16:20] total_group_1_contribution = 0 total_group_2_contribution = 0 total_group_3_contribution = 0 # total_group_4_contribution = 0 # total_group_5_contribution = 0 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 subgroup_1: total_group_1_contribution += p.contribution if p.id_in_group in subgroup_2: total_group_2_contribution += p.contribution if p.id_in_group in subgroup_3: total_group_3_contribution += p.contribution # if p.id_in_group in subgroup_4: # total_group_4_contribution += p.contribution # if p.id_in_group in subgroup_5: # total_group_5_contribution += p.contribution #----计算每组成员可以获得的组内共享收益---- self.group_1_share = ( total_group_1_contribution * Constants.multiplier / 2 ) self.group_2_share = ( total_group_2_contribution * Constants.multiplier / 2 ) self.group_3_share = ( total_group_3_contribution * Constants.multiplier / 2 ) # self.group_4_share = ( # total_group_4_contribution * Constants.multiplier / 4 # ) # self.group_5_share = ( # total_group_5_contribution * Constants.multiplier / 4 # ) if self.round_number == 1: for p in players: if p.id_in_group in subgroup_1: p.payoff = Constants.endowment - p.contribution + 0.75 * self.group_1_share +0.25 * self.average_population_share p.player_role = 1 # subgroup_1_payoff_list = subgroup_1_payoff_list.append(p.payoff) if p.id_in_group in subgroup_2: p.payoff = Constants.endowment - p.contribution + 0.75 * self.group_2_share +0.25 * self.average_population_share p.player_role = 2 # subgroup_2_payoff_list = subgroup_2_payoff_list.append(p.payoff) if p.id_in_group in subgroup_3: p.payoff = Constants.endowment - p.contribution + 0.75 * self.group_3_share +0.25 * self.average_population_share p.player_role = 3 # subgroup_3_payoff_list = subgroup_3_payoff_list.append(p.payoff) # if p.id_in_group in subgroup_4: # p.payoff = Constants.endowment - p.contribution + 0.75 * self.group_4_share +0.25 * self.average_population_share # p.player_role = 4 # subgroup_4_payoff_list = subgroup_4_payoff_list.append(p.payoff) # # if p.id_in_group in subgroup_5: # p.payoff = Constants.endowment - p.contribution + 0.75 * self.group_5_share +0.25 * self.average_population_share # p.player_role = 5 # subgroup_5_payoff_list = subgroup_5_payoff_list.append(p.payoff) else: for p in players: if p.id_in_group in subgroup_1: p.payoff = p.in_round( self.round_number - 1 ).payoff - p.contribution + 0.75 * self.group_1_share +0.25 * self.average_population_share p.player_role = 1 # subgroup_1_payoff_list = subgroup_1_payoff_list.append(p.payoff) if p.id_in_group in subgroup_2: p.payoff = p.in_round( self.round_number - 1 ).payoff - p.contribution + 0.75 * self.group_2_share +0.25 * self.average_population_share p.player_role = 2 # subgroup_2_payoff_list = subgroup_2_payoff_list.append(p.payoff) if p.id_in_group in subgroup_3: p.payoff = p.in_round( self.round_number - 1 ).payoff - p.contribution + 0.75 * self.group_3_share +0.25 * self.average_population_share p.player_role = 3 # subgroup_3_payoff_list = subgroup_3_payoff_list.append(p.payoff) # if p.id_in_group in subgroup_4: # p.payoff = p.in_round( self.round_number -1 ).payoff - p.contribution + 0.75 * self.group_4_share +0.25 * self.average_population_share # p.player_role = 4 # subgroup_4_payoff_list = subgroup_4_payoff_list.append(p.payoff) # if p.id_in_group in subgroup_5: # p.payoff = p.in_round( self.round_number -1 ).payoff - p.contribution + 0.75 * self.group_5_share +0.25 * self.average_population_share # p.player_role = 5 # subgroup_5_payoff_list = subgroup_5_payoff_list.append(p.payoff) class Player(BasePlayer): contribution = models.CurrencyField( min = 0, max = Constants.endowment, label = "How much will you contribute?" ) #----在结果中显示每个玩家属于哪个组----- player_role = models.IntegerField() # def payoff_last_round(self): # if self.round_number >= 2: # return [self.in_round(self.round_number - 1).payoff] # return self.in_round(self.round_number - 1).payoff()