Skip to content

Instantly share code, notes, and snippets.

@xalelax
Created October 26, 2020 11:46
Show Gist options
  • Select an option

  • Save xalelax/13ce7e395a56b16ac4bbe30c40936681 to your computer and use it in GitHub Desktop.

Select an option

Save xalelax/13ce7e395a56b16ac4bbe30c40936681 to your computer and use it in GitHub Desktop.
Model company for PRG model; selected methods
class Company(Model):
"""
Model of a company; pyramidal structure with n different levels;
workers at different levels weigh differently on the efficiency of the
company as a whole.
"""
def pick_for_promotion_from(self, source_level):
if self.promotion_strategy == 'best':
return max(source_level, key=lambda e: e.competency)
elif self.promotion_strategy == 'worst':
return min(source_level, key=lambda e: e.competency)
elif self.promotion_strategy == 'random':
return self.random.choice(source_level)
def recalculate_competency(self, employee):
# Peter hypothesis: competency in new role not dependent on competency
# in previous role
if self.competency_mechanism == 'peter':
employee.competency = self.competency_distribution.rvs()
# Common-sense: competency mostly transferable from previous role
elif self.competency_mechanism == 'common_sense':
# TODO: abstract parameters used here
random_variation = self.random.uniform(-1, 1)
employee.competency += random_variation
employee.competency = min(max(0, employee.competency), 10) # Clip
def promote_employees(self):
for upper_level, lower_level, target_size in zip(self.levels,
self.levels[1:],
self.level_sizes):
while len(upper_level) < target_size:
chosen_employee = self.pick_for_promotion_from(lower_level)
lower_level.remove(chosen_employee)
self.recalculate_competency(chosen_employee)
upper_level.append(chosen_employee)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment