from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = ['Daniel Davidsen', 'Barney Garda'] doc = """ Resource management with immediate allocation """ class Constants(BaseConstants): name_in_url = 'resource_management' players_per_group = None num_rounds = 20 # resource_distribution_groups = 4 resource_distribution_groups = 2 information_template = 'resource_management/InformationTable.html' dynamic_information_template = 'resource_management/DynamicInformationTable.html' summary_information_template = 'resource_management/SummaryInformationTable.html' class Subsession(BaseSubsession): projectGroup1Percentage = models.FloatField() projectGroup2Percentage = models.FloatField() # projectGroup3Percentage = models.FloatField() # projectGroup4Percentage = models.FloatField() randomized_winning_probabilities = models.BooleanField() randomized_shuffle_happened = models.BooleanField() shuffle_probability = models.FloatField() same_probability_shuffle = models.BooleanField() new_probabilities_shuffle = models.BooleanField() # resource_distribution_groups = models.IntegerField() def creating_session(self): if self.round_number == 1: self.shuffle_probability = self.session.config['shuffle_likelihood'] # self.resource_distribution_groups = self.session.config['resource_distribution_groups'] if self.session.config['randomized_winning_probabilities']: self.projectGroup1Percentage = random.uniform(0, 1) self.projectGroup2Percentage = random.uniform(0, 1) # self.projectGroup3Percentage = random.uniform(0, 1) # self.projectGroup4Percentage = random.uniform(0, 1) else: self.projectGroup1Percentage = self.session.config['percentageForG1'] self.projectGroup2Percentage = self.session.config['percentageForG2'] # self.projectGroup3Percentage = self.session.config['percentageForG3'] # self.projectGroup4Percentage = self.session.config['percentageForG4'] self.randomized_shuffle_happened = False # saving to DB else: self.shuffle_probability = self.in_round(self.round_number - 1).shuffle_probability print(self.shuffle_probability) if self.session.config['same_probability_shuffle'] and self.shuffle_probability > random.random(): self.randPerc() self.randomized_shuffle_happened = True # saving to DB elif self.session.config['new_probabilities_shuffle'] and self.shuffle_probability > random.random(): self.randNewPerc() self.randomized_shuffle_happened = True # saving to DB else: self.projectGroup1Percentage = self.in_round(self.round_number - 1).projectGroup1Percentage self.projectGroup2Percentage = self.in_round(self.round_number - 1).projectGroup2Percentage # self.projectGroup3Percentage = self.in_round(self.round_number - 1).projectGroup3Percentage # self.projectGroup4Percentage = self.in_round(self.round_number - 1).projectGroup4Percentage self.randomized_shuffle_happened = False # saving to DB # saving to DB self.randomized_winning_probabilities = self.session.config['randomized_winning_probabilities'] self.same_probability_shuffle = self.session.config['same_probability_shuffle'] self.new_probabilities_shuffle = self.session.config['new_probabilities_shuffle'] def randPerc(self): perc = [ self.in_round(self.round_number - 1).projectGroup1Percentage, self.in_round(self.round_number - 1).projectGroup2Percentage #, # self.in_round(self.round_number - 1).projectGroup3Percentage, # self.in_round(self.round_number - 1).projectGroup4Percentage, ] random.shuffle(perc) self.projectGroup1Percentage = perc[0] self.projectGroup2Percentage = perc[1] # self.projectGroup3Percentage = perc[2] # self.projectGroup4Percentage = perc[3] def randNewPerc(self): self.projectGroup1Percentage = random.uniform(0, 1) self.projectGroup2Percentage = random.uniform(0, 1) # self.projectGroup3Percentage = random.uniform(0, 1) # self.projectGroup4Percentage = random.uniform(0, 1) class Group(BaseGroup): pass class Player(BasePlayer): # Add additional variables to this sequence if you want more players resources_to_unit_1 = models.IntegerField(widget=widgets.RadioSelect, label='U1', initial=0) resources_to_unit_2 = models.IntegerField(widget=widgets.RadioSelect, label='U2', initial=0) # resources_to_unit_3 = models.IntegerField(widget=widgets.RadioSelect, label='U3', initial=0) # resources_to_unit_4 = models.IntegerField(widget=widgets.RadioSelect, label='U4', initial=0) payout_from_Unit_1 = models.IntegerField(min=0) payout_from_Unit_2 = models.IntegerField(min=0) # payout_from_Unit_3 = models.IntegerField(min=0) # payout_from_Unit_4 = models.IntegerField(min=0) summed_resources_to_unit_1 = models.IntegerField(initial=0) summed_resources_to_unit_2 = models.IntegerField(initial=0) summed_payout_from_Unit_1 = models.IntegerField(initial=0) summed_payout_from_Unit_2 = models.IntegerField(initial=0) success_ratio_unit_1 = models.FloatField(initial=0) success_ratio_unit_2 = models.FloatField(initial=0) total_payout_from_Groups = models.IntegerField(initial=0) def calculate_outcome(self): self.payout_from_Unit_1 = self.payout_from_group(self.resources_to_unit_1, self.subsession.projectGroup1Percentage) self.payout_from_Unit_2 = self.payout_from_group(self.resources_to_unit_2, self.subsession.projectGroup2Percentage) # self.payout_from_Unit_3 = self.payout_from_group(self.resources_to_unit_3, self.subsession.projectGroup3Percentage) # self.payout_from_Unit_4 = self.payout_from_group(self.resources_to_unit_4, self.subsession.projectGroup4Percentage) for r in range(1, self.round_number+1): self.summed_resources_to_unit_1 += self.in_round(r).resources_to_unit_1 self.summed_resources_to_unit_2 += self.in_round(r).resources_to_unit_2 self.summed_payout_from_Unit_1 += self.in_round(r).payout_from_Unit_1 self.summed_payout_from_Unit_2 += self.in_round(r).payout_from_Unit_2 if self.summed_resources_to_unit_1 > 0: self.success_ratio_unit_1 = self.summed_payout_from_Unit_1 / self.summed_resources_to_unit_1 self.success_ratio_unit_1 = round(self.success_ratio_unit_1, 2) if self.summed_resources_to_unit_2 > 0: self.success_ratio_unit_2 = self.summed_payout_from_Unit_2 / self.summed_resources_to_unit_2 self.success_ratio_unit_2 = round(self.success_ratio_unit_2, 2) def payout_from_group(self, resources, percentage): payout = 0 resourcesInt = resources if resourcesInt > 0: print(resourcesInt) for x in range(0, resourcesInt): randomNumber = random.random() if randomNumber < percentage: payout += 1 else: pass # print(percentage) # print(randomNumber) # print(payout) # print() self.total_payout_from_Groups += payout self.payoff += payout return payout else: return payout def get_payout_values(values, group_count): payouts = [] for i in range(1, group_count + 1): payouts.append(values['resources_to_unit_{}'.format(i)]) return payouts