我有一个问题,想让我写一个程序,把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
最佳答案
我想你错过了练习的重点。逻辑要复杂得多。
以2只狼为例(0和1是领导者)领导人提议(采取一切行动)并投赞成票,从而确保通过50%。
现在看看他们中的3个(0,1,3,这是一个领导者)这个计划将会失败:1很高兴成为领导者,0嗜血成性。所以2必须提出不同的计划,很明显最好的是0, 2
。这里#0会投赞成票,因为如果它投反对票,领袖将被杀死,他们是在一个2狼的情况下,它将一无所获。
试着用纸和铅笔浏览一个4狼和5狼的场景,看看逻辑是如何工作的(计划应该分别是0, 0, 3
和1, 0, 2
)然后你就可以开始编程了。
关于python - Python3-在饥饿的狼群之间分配口粮的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52546617/