Python3 - 在饥饿的狼之间分配口粮的最佳方法是什么?
Python3 - Whats the best way to allocate rations among hungry wolves?
我有一个问题要我编写一个程序来将 x 条鱼分配给 x 条狼。这是确切的问题。
50只饿狼去钓鱼,钓到50条鱼。现在他们需要将这 50 条相同的鱼分配给它们。他们的民主制度运作如下:
所有的狼都是按资历排名的。首先,最年长的狼(称为 "pack leader")提出一个分配计划,明确说明每只狼会得到多少条鱼。 50 只狼将对该计划进行投票(无阻挠议事),如果超过或等于半数的狼投票赞成,该计划将通过。如果它通过了,狼就会把鱼吃掉。如果失败,提出计划的人(在这种情况下是狼群首领)将被杀死,然后第二高的狼将代替 "pack leader" 提出他的计划。我们按照资历的顺序重复上述相同的过程,直到某人的计划通过。
假设每只狼都根据以下优先级做出决定:
- 他不想死。
- 鉴于他不会死,他宁愿尽可能多地捕鱼。
- 鉴于他将获得相同数量的鱼,他宁愿尽可能多的其他狼死去。
我已经编写了大部分逻辑,但我不确定如何优化分布以使其正确遵循优先级。如果有人能给我指明正确的方向,我会非常乐意找出其余部分,也许有一个我可以使用的基于二项分布的模块 (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,它是领导者)。 leader 提议 0, 2
(拿走一切),并投票给它 - 从而确保通过 50%。
现在看看其中 3 个(#0、#1 和 #3,它是领导者)会发生什么。计划 0, 0, 3
会失败:#1 乐于成为领袖,#0 嗜血。所以#2 必须提出不同的计划,而且显然最好的是 1, 0, 2
。这里 #0 会投票给它,因为如果它投票反对领导者将被杀死,他们处于 2 只狼的情况下,它什么也得不到。
尝试用纸和笔复习 4 只狼和 5 只狼的场景,看看那里的逻辑是如何运作的(计划应该分别是 0, 1, 0, 3
和 1, 0, 1, 0, 3
)。然后你就可以开始编写那个逻辑了。
我有一个问题要我编写一个程序来将 x 条鱼分配给 x 条狼。这是确切的问题。
50只饿狼去钓鱼,钓到50条鱼。现在他们需要将这 50 条相同的鱼分配给它们。他们的民主制度运作如下: 所有的狼都是按资历排名的。首先,最年长的狼(称为 "pack leader")提出一个分配计划,明确说明每只狼会得到多少条鱼。 50 只狼将对该计划进行投票(无阻挠议事),如果超过或等于半数的狼投票赞成,该计划将通过。如果它通过了,狼就会把鱼吃掉。如果失败,提出计划的人(在这种情况下是狼群首领)将被杀死,然后第二高的狼将代替 "pack leader" 提出他的计划。我们按照资历的顺序重复上述相同的过程,直到某人的计划通过。 假设每只狼都根据以下优先级做出决定:
- 他不想死。
- 鉴于他不会死,他宁愿尽可能多地捕鱼。
- 鉴于他将获得相同数量的鱼,他宁愿尽可能多的其他狼死去。
我已经编写了大部分逻辑,但我不确定如何优化分布以使其正确遵循优先级。如果有人能给我指明正确的方向,我会非常乐意找出其余部分,也许有一个我可以使用的基于二项分布的模块 (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,它是领导者)。 leader 提议 0, 2
(拿走一切),并投票给它 - 从而确保通过 50%。
现在看看其中 3 个(#0、#1 和 #3,它是领导者)会发生什么。计划 0, 0, 3
会失败:#1 乐于成为领袖,#0 嗜血。所以#2 必须提出不同的计划,而且显然最好的是 1, 0, 2
。这里 #0 会投票给它,因为如果它投票反对领导者将被杀死,他们处于 2 只狼的情况下,它什么也得不到。
尝试用纸和笔复习 4 只狼和 5 只狼的场景,看看那里的逻辑是如何运作的(计划应该分别是 0, 1, 0, 3
和 1, 0, 1, 0, 3
)。然后你就可以开始编写那个逻辑了。