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

У меня проблема, и я хочу, чтобы я написал программу для распределения 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
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Рассмотрим случай двух волков (№ 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 соответственно). Затем вы можете начать программировать эту логику.

Другие вопросы по теме