from otree.api import * doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'my_nested_social_dilemma' players_per_group = 6 # グローバルグループの人数 players_per_subgroup = 3 # サブグループの人数 num_rounds = 2 # 繰り返しの回数 resorce_cpr = cu(300) # 初期資源量(共有財) endowment_cpr = cu(10) # 初期保有額(共有財への投資にかかるコスト) endowment_pg = cu(40) # 初期保有額(公共財への投資にかかるコスト) multiplier_cpr_for_cpr = 30.0 # CPRで非協力したときの係数 multiplier_cpr_for_self = 6.0 # CPRで協力したときの係数 multiplier_cpr = 1.1 # CPRの再生率係数 multiplier_pg_for_global_per_person = 0.5 # グローバル貢献の係数 multiplier_pg_for_sub_per_person = 0.66 # サブ貢献の係数 punishment_endowment = cu(20) # 初期保有額(罰にかかるコスト) multiplier_punishment = 3.0 # 罰の係数 class Subsession(BaseSubsession): def creating_session(self): ps = [] for p in self.get_players(): for o in p.get_others_in_group(): ps.append(Punishment(sender=p, receiver=o, )) Punishment.objects.bulk_create(ps) class Group(BaseGroup): total_cpr_contribution = models.CurrencyField() total_cpr_resorce = models.CurrencyField() total_global_contribution = models.CurrencyField() total_sub_contribution = models.CurrencyField() individual_share_cpr = models.CurrencyField() individual_share_global_pg = models.CurrencyField() individual_share_sub_pg = models.CurrencyField() total_punishment_p1 = models.CurrencyField() total_punishment_p2 = models.CurrencyField() total_punishment_p3 = models.CurrencyField() total_punishment_p4 = models.CurrencyField() total_punishment_p5 = models.CurrencyField() total_punishment_p6 = models.CurrencyField() individual_punishment_p1 = models.CurrencyField() individual_punishment_p2 = models.CurrencyField() individual_punishment_p3 = models.CurrencyField() individual_punishment_p4 = models.CurrencyField() individual_punishment_p5 = models.CurrencyField() individual_punishment_p6 = models.CurrencyField() # group_inspection = models.CurrencyField() def compute(self): contributions_cpr = [p.contribution_cpr for p in self.get_players()] contributions_global_pg = [p.contribution_global_pg for p in self.get_players()] contributions_sub_pg = [p.contribution_sub_pg for p in self.get_players()] self.total_cpr_contribution = sum(contributions_cpr) self.total_global_contribution = sum(contributions_global_pg) self.total_sub_contribution = sum(contributions_sub_pg) self.individual_share_cpr = self.total_cpr_contribution * multiplier_cpr_for_cpr + (self.endowment_cpr - self.total_cpr_contribution) * multiplier_cpr_for_self self.individual_share_global_pg = self.total_global_contribution * multiplier_pg_for_global_per_person self.individual_share_sub_pg = self.total_sub_contribution * multiplier_pg_for_sub_per_person for p in self.get_players(): p.pd_payoff = sum([+ Constants.endowment, - p.contribution, + self.individual_share, ]) p.set_punishment_endowment() # 罰の計算 total_punishment_p1 = [p.punishment_p1 for p in self.get_players()] total_punishment_p2 = [p.punishment_p2 for p in self.get_players()] total_punishment_p3 = [p.punishment_p3 for p in self.get_players()] total_punishment_p4 = [p.punishment_p4 for p in self.get_players()] total_punishment_p5 = [p.punishment_p5 for p in self.get_players()] total_punishment_p6 = [p.punishment_p6 for p in self.get_players()] self.total_punishment_p1 = sum(total_punishment_p1) self.total_punishment_p2 = sum(total_punishment_p2) self.total_punishment_p3 = sum(total_punishment_p3) self.total_punishment_p4 = sum(total_punishment_p4) self.total_punishment_p5 = sum(total_punishment_p5) self.total_punishment_p6 = sum(total_punishment_p6) self.individual_punishment_p1 = self.total_punishment_p1 * multiplier_punishment self.individual_punishment_p2 = self.total_punishment_p2 * multiplier_punishment self.individual_punishment_p3 = self.total_punishment_p3 * multiplier_punishment self.individual_punishment_p4 = self.total_punishment_p4 * multiplier_punishment self.individual_punishment_p5 = self.total_punishment_p5 * multiplier_punishment self.individual_punishment_p6 = self.total_punishment_p6 * multiplier_punishment ##誰かひとりでも監視をすれば貢献しなかった人全員に罰を与えることができるが、誰も監視をしなければ貢献しなかった人を罰せられない if sum(inspections) >= Constants.punishment_endowment: self.group_inspection = Constants.punishment else: self.group_inspection = cu(0) for p in self.get_players(): if p.contribution == cu(0): p.individual_punishment = self.group_inspection else: p.individual_punishment = cu(0) p.payoff = Constants.endowment - p.contribution + self.individual_share - Constants.punishment_endowment - p.individual_punishment p.payoff = self.individual_share_cpr + (Constants.endowment_pg - p.contribution_global_pg - p.contribution_sub_pg) + self.individual_share_global_pg + self.individual_share_sub_pg p.payoff = Constants.endowment - p.contribution + self.individual_share - Constants.punishment_endowment - p.individual_punishment def set_punishments(self): for p in self.get_players(): p.set_punishment() for p in self.get_players(): p.set_payoff() #inspections = [p.inspection for p in self.get_players()] #self.group_inspection = sum(inspections) """##誰かひとりでも監視をすれば貢献しなかった人全員に罰を与えることができるが、誰も監視をしなければ貢献しなかった人を罰せられない if sum(inspections) >= Constants.punishment_endowment: self.group_inspection = Constants.punishment else: self.group_inspection = cu(0) for p in self.get_players(): if p.contribution == cu(0): p.individual_punishment = self.group_inspection else: p.individual_punishment = cu(0) p.payoff = Constants.endowment - p.contribution + self.individual_share - Constants.punishment_endowment - p.individual_punishment p.payoff = Constants.endowment - p.contribution + self.individual_share - Constants.punishment_endowment - p.individual_punishment""" class Player(BasePlayer): contributions_cpr = models.CurrencyField( min=0, max=Constants.endowment_cpr, label="あなたは本業にどれだけ割り振りますか" ) def contributions_cpr_max(player): return Constants.resorce_cpr contributions_global_pg = models.CurrencyField( min=0, max=Constants.endowment_pg, label="あなたは地域活動にどれだけ割り振りますか" ) contributions_sub_pg = models.CurrencyField( min=0, max=Constants.endowment_pg, label="あなたは団体活動にどれだけ割り振りますか" ) """contribution = models.CurrencyField( choices=[ [cu(Constants.endowment),'貢献する'], [cu(0), '貢献しない'] ], label="グループに貢献しますか?", widget = widgets.RadioSelect ) inspection = models.CurrencyField( choices=[ [cu(Constants.punishment_endowment),'監視する'], [cu(0), '監視しない'] ], label="監視しますか?", widget = widgets.RadioSelect ) individual_punishment = models.CurrencyField()""" # PAGES class Page1(Page): timeout_seconds = 60 form_model = 'player' form_fields = ['contribution_cpr', 'contribute_global_pg', 'contribute_sub_pg'] @staticmethod def error_message(player, values): print('values is', values) if values['contribute_global_pg'] + values['contribute_sub_pg'] > 40: return 'The numbers must add up to 40' class Page2(Page): timeout_seconds = 60 form_model = 'player' form_fields = ['punishment_p1', 'punishment_p2', 'punishment_p3', 'punishment_p4', 'punishment_p5', 'punishment_p6'] class Page3(WaitPage): def after_all_players_arrive(self): self.group.compute() class Page4(Page): pass page_sequence = [Page1, Page2, Page3, Page4]