from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Daniel Davidsen' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'resource_management_2' players_per_group = None num_rounds = 20 resource_distribution_groups = 2 information_template = 'resource_management_2/InformationTable.html' summary_information_template = 'resource_management_2/SummaryInformationTable.html' class Subsession(BaseSubsession): projectGroup1Percentage = models.FloatField() projectGroup2Percentage = models.FloatField() projectGroup3Percentage = models.FloatField() projectGroup4Percentage = models.FloatField() def creating_session(self): if self.round_number == 1: self.projectGroup1Percentage = self.session.config['percentageForG1'] self.projectGroup2Percentage = self.session.config['percentageForG2'] self.projectGroup3Percentage = self.session.config['percentageForG3'] self.projectGroup4Percentage = self.session.config['percentageForG4'] else: if self.session.config['shuffle'] and self.session.config['shuffle_likelihood'] > random.random(): self.randPerc() 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 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] class Group(BaseGroup): pass class Player(BasePlayer): # Add additional variables to this sequence if you want more players # to unit 1 (and so on..) remove("distributed_by_manager") 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) # remove "resources" payout_from_Unit_1 = models.IntegerField(min=0, initial=0) payout_from_Unit_2 = models.IntegerField(min=0, initial=0) payout_from_Unit_3 = models.IntegerField(min=0, initial=0) payout_from_Unit_4 = models.IntegerField(min=0, initial=0) total_payout_from_Groups = models.IntegerField(initial=0) middle_manager_1 = models.IntegerField(widget=widgets.RadioSelect, label='A', initial=0) middle_manager_2 = models.IntegerField(widget=widgets.RadioSelect, label='B', initial=0) payout_middle_manager_1 = models.IntegerField() payout_middle_manager_2 = models.IntegerField() resources_allocated_sum_unit_1 = models.IntegerField(initial=0) resources_allocated_sum_unit_2 = models.IntegerField(initial=0) resources_allocated_sum_unit_3 = models.IntegerField(initial=0) resources_allocated_sum_unit_4 = models.IntegerField(initial=0) successful_projects_sum_unit_1 = models.IntegerField(initial=0) successful_projects_sum_unit_2 = models.IntegerField(initial=0) successful_projects_sum_unit_3 = models.IntegerField(initial=0) successful_projects_sum_unit_4 = models.IntegerField(initial=0) success_ratio_unit_1 = models.FloatField(initial=0.0) success_ratio_unit_2 = models.FloatField(initial=0.0) success_ratio_unit_3 = models.FloatField(initial=0.0) success_ratio_unit_4 = models.FloatField(initial=0.0) def calculate_unit_stats(self): for player in self.in_rounds(1, self.round_number+1): self.resources_allocated_sum_unit_1 += player.resources_to_unit_1 self.resources_allocated_sum_unit_2 += player.resources_to_unit_2 self.resources_allocated_sum_unit_3 += player.resources_to_unit_3 self.resources_allocated_sum_unit_4 += player.resources_to_unit_4 self.successful_projects_sum_unit_1 += player.payout_from_Unit_1 self.successful_projects_sum_unit_2 += player.payout_from_Unit_2 self.successful_projects_sum_unit_3 += player.payout_from_Unit_3 self.successful_projects_sum_unit_4 += player.payout_from_Unit_4 if self.successful_projects_sum_unit_1 != 0: self.success_ratio_unit_1 = self.resources_allocated_sum_unit_1 / self.successful_projects_sum_unit_1 if self.successful_projects_sum_unit_2 != 0: self.success_ratio_unit_2 = self.resources_allocated_sum_unit_2 / self.successful_projects_sum_unit_2 if self.successful_projects_sum_unit_3 != 0: self.success_ratio_unit_3 = self.resources_allocated_sum_unit_3 / self.successful_projects_sum_unit_3 if self.successful_projects_sum_unit_4 != 0: self.success_ratio_unit_4 = self.resources_allocated_sum_unit_4 / self.successful_projects_sum_unit_4 print('!:', self.resources_allocated_sum_unit_1) print('!:', self.resources_allocated_sum_unit_2) print('!:', self.resources_allocated_sum_unit_3) print('!:', self.resources_allocated_sum_unit_4) print('@:', self.successful_projects_sum_unit_1) print('@:', self.successful_projects_sum_unit_2) print('@:', self.successful_projects_sum_unit_3) print('@:', self.successful_projects_sum_unit_4) print('#:', self.success_ratio_unit_1) print('#:', self.success_ratio_unit_2) print('#:', self.success_ratio_unit_3) print('#:', self.success_ratio_unit_4) print("RN:", self.round_number) def distribute_resources(self): for x in range(0, self.middle_manager_1): if random.random() <= 0.5: self.resources_to_unit_1 += 1 else: self.resources_to_unit_2 += 1 for x in range(0, self.middle_manager_2): if random.random() <= 0.5: self.resources_to_unit_3 += 1 else: self.resources_to_unit_4 += 1 def distribute_resources_epsilon_greedily(self): p_exploration_manager_1 = random.random() p_exploration_manager_2 = random.random() for x in range(0, self.middle_manager_1): if p_exploration_manager_1 >= self.session.config['epsilon_value_for_epsilon_greedy']: # if no exploration print("MM 1 to winning unit (E), p1", p_exploration_manager_1, "p2", p_exploration_manager_2) if self.success_ratio_unit_1 > self.success_ratio_unit_2: # choose winning unit self.resources_to_unit_1 += 1 else: self.resources_to_unit_2 += 1 else: # if exploration print("MM 1 exploration (E), p1", p_exploration_manager_1, "p2", p_exploration_manager_2) if random.random() <= 0.5: # randomly assign to units self.resources_to_unit_1 += 1 else: self.resources_to_unit_2 += 1 for x in range(0, self.middle_manager_2): if p_exploration_manager_2 >= self.session.config['epsilon_value_for_epsilon_greedy']: # if no exploration print("MM 2 to winning unit (E), p1", p_exploration_manager_1, "p2", p_exploration_manager_2) if self.success_ratio_unit_3 > self.success_ratio_unit_4: # choose winning unit self.resources_to_unit_3 += 1 else: self.resources_to_unit_4 += 1 else: print("MM 2 exploration (E), p1", p_exploration_manager_1, "p2", p_exploration_manager_2) if random.random() <= 0.5: self.resources_to_unit_3 += 1 else: self.resources_to_unit_4 += 1 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) self.payout_middle_manager_1 = self.payout_from_Unit_1 + self.payout_from_Unit_2 self.payout_middle_manager_2 = self.payout_from_Unit_3 + self.payout_from_Unit_4 def payout_from_group(self, resources, percentage): payout = 0 resourcesInt = resources if resourcesInt > 0: for x in range(0, resourcesInt): randomNumber = random.random() if randomNumber < percentage: payout += 1 else: pass self.total_payout_from_Groups += payout self.payoff += payout return payout else: return payout