У меня проблема, и я хочу, чтобы я написал программу для распределения x количества рыбы на x количество волков. Вот точный вопрос.
50 голодных волков пошли на рыбалку и поймали 50 рыб. Теперь им нужно распределить между собой эти 50 одинаковых рыбок. Их демократическая система работает следующим образом: Все волки ранжируются по старшинству. Во-первых, старший волк (называемый «вожаком стаи») предлагает план распределения, в котором точно указано, сколько рыбы получит каждый волк. 50 волков проголосуют за план (без пирата), и он пройдет, если за него проголосовало не менее половины волков. Если он проходит, волки берут свою рыбу и съедают ее. В случае неудачи тот, кто предложил план (в данном случае лидер стаи), будет убит, а затем второй по старшинству волк займет место «лидера стаи» и предложит свой план. Мы повторяем описанный выше процесс в порядке старшинства, пока чей-то план не будет принят. Предположим, что каждый волк принимает решение, основываясь на следующих приоритетах:
Я написал большую часть логики, но я не уверен, как оптимизировать распределение, чтобы оно правильно следовало приоритетам. Если бы кто-нибудь мог указать мне в правильном направлении, я был бы более чем счастлив выяснить остальное, возможно, есть модуль, который я мог бы использовать на основе биномиального распределения (scipy, pandas)
Вот мой код.
import math
import numpy as np
def findDistribution(num_w, num_f):
ranked_wolves = list(range(num_w+1))[1:] # 1-50
distribution = [0]*num_w
for index, pack_leader in enumerate(ranked_wolves):
num_w = len(ranked_wolves[index:])
wolfpack = distribution[index:]
remaining_fish = num_f
# If Wolf is last one then takes all fish
if len(wolfpack) == 1:
distribution[index] = remaining_fish
break
for wolf, value in enumerate(distribution[index:]):
portion = remaining_fish/len(wolfpack)
if wolf == 0:
amount = math.ceil(portion)
distribution[index] = amount # Pack LEader Gets the Most
wolfpack.pop()
remaining_fish-= amount
continue
else:
amount = math.ceil(portion)
distribution[index+wolf] = amount
wolfpack.pop()
remaining_fish -= amount
# Voting
# Count all wolves with same number of fish
mode = stats.mode(distribution[index:])
total_votes = len(distribution[index:])
vote_no = mode.count[0]
vote_yes = total_votes - vote_no
# If more wolves without food than wolves with food
if num_f/len(distribution[index:]) < .5:
distribution[index] = -1
# Going to get same number of fish so vote no
elif vote_yes >= vote_no :
break
else:
distribution[index] = -1
# Return a tuple, with first value being the wolf number whose proposal
# is accepted and the second value being a list of the distribution for
# every wolf (-1 for dead wolves).
return pack_leader, distribution






Я думаю, вы упускаете суть упражнения. Логика гораздо сложнее.
Рассмотрим случай двух волков (№ 0 и № 1, который является лидером). Лидер предлагает 0, 2 (забирая все) и голосует за него - таким образом, обеспечивая прохождение 50%.
Теперь посмотрим, что происходит с 3 из них (№ 0, № 1 и № 3, который является лидером). План 0, 0, 3 провалится: №1 счастлив стать лидером, №0 кровожаден. Итак, №2 должен предложить другой план, и ясно, что лучшим является 1, 0, 2. Здесь # 0 проголосует за него, потому что, если он проголосует против, лидер будет убит, они находятся в случае с двумя волками, и он ничего не получит.
Попробуйте пройти сценарий с четырьмя и пятью волками с бумагой и карандашом и посмотрите, как там работает логика (планы должны быть 0, 1, 0, 3 и 1, 0, 1, 0, 3 соответственно). Затем вы можете начать программировать эту логику.