我有一个问题,想让我写一个程序,把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, 31, 0, 2)然后你就可以开始编程了。

关于python - Python3-在饥饿的狼群之间分配口粮的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52546617/

10-13 06:28