Python3 - Как лучше распределить рацион среди голодных волков? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть проблема, которая требует, чтобы я написал программу для распределения x количества рыбы по x количеству волков.Вот точный вопрос.

50 голодных волков отправились на рыбалку и поймали 50 рыб.Теперь им нужно выделить среди них 50 одинаковых рыб.Их демократическая система работает следующим образом: все волки ранжируются по старшинству.Во-первых, самый старший волк (называемый «вожак стаи») предлагает план распределения, в котором точно указано, сколько рыбы будет добывать каждый волк.50 волков проголосовали бы за план (без обмана), и он прошел бы, если бы за него проголосовало больше или равное половине волков.Если это пройдет, волки забирают свою рыбу и едят ее.Если это не удастся, тот, кто предложил план (в данном случае, лидер стаи), будет убит, а затем второй самый старший волк займет место «лидера стаи» и предложит свой план.Мы повторяем тот же процесс выше в порядке старшинства, пока чей-то план не будет принят.Предположим, что каждый волк принимает свое решение исходя из следующих приоритетов:

  1. Он не хочет умирать.
  2. Учитывая, что он не умрет, он предпочел бы добыть как можно больше рыбы.
  3. Учитывая, что он получит такое же количество рыб, он предпочел бы умереть как можно большему числу других волков.

Я написал большую часть логики, но я не уверен, какоптимизировать распределение, чтобы оно правильно соответствовало приоритетам.Если бы кто-нибудь мог указать мне правильное направление, я был бы более чем рад выяснить остальное, возможно, есть модуль, который я мог бы использовать на основе биномиального распределения (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

1 Ответ

0 голосов
/ 28 сентября 2018

Я думаю, что вы упускаете смысл упражнения.Логика гораздо сложнее.

Рассмотрим случай 2 волков (# 0 и # 1, который является лидером).Лидер предлагает 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 соответственно).Затем вы можете начать программировать эту логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...