Как подойти к алгоритму игры в угадывание чисел (с изюминкой)?

Я изучаю программирование (Python и алгоритмы) и пытался работать над проектом, который мне показался интересным. Я создал несколько базовых скриптов Python, но не знаю, как подойти к решению игры, которую я пытаюсь создать.

Вот как будет работать игра:

Пользователям будут выдаваться предметы с ценностями. Например,

Apple = 1
Pears = 2
Oranges  = 3

Затем они получат возможность выбрать любую комбинацию из них, которая им нравится (например, 100 яблок, 20 груш и один апельсин). Единственный вывод, который получает компьютер, - это общая стоимость (в этом примере в настоящее время она составляет 143 доллара США). Компьютер попытается угадать, что у них есть. Что, очевидно, не сможет пройти правильно с первого хода.

         Value    quantity(day1)    value(day1)
Apple      1        100                100
Pears      2         20                 40
Orange     3          1                  3
Total               121                143

На следующем ходу пользователь может изменить свои числа, но не более 5% от общего количества (или какой-то другой процент, который мы можем выбрать. Я использую 5%, например). Цены на фрукты могут изменяться (случайным образом), поэтому общая стоимость может также изменяться в зависимости от этого (для простоты я не меняю цены на фрукты в этом примере). Используя приведенный выше пример, во второй день игры пользователь возвращает значение 152 доллара США и 164 доллара США в день 3. Вот пример:

Quantity (day2)   %change (day2)    Value (day2)   Quantity (day3)   %change (day3)   Value(day3)
 104                                 104            106                                106
  21                                  42             23                                 46
   2                                   6              4                                 12
 127               4.96%             152            133               4.72%            164

* (я надеюсь, что таблицы отображаются правильно, мне пришлось вручную разместить их, так что надеюсь он не просто делает это на моем экране, если это не сработает, дайте мне знать, и я попытаюсь загрузить снимок экрана.)

Я пытаюсь понять, смогу ли я выяснить, какие количества будут с течением времени (при условии, что у пользователя хватит терпения продолжать вводить числа). Я знаю, что сейчас мое единственное ограничение - общее значение не может превышать 5%, поэтому я не могу быть в пределах 5% точности прямо сейчас, поэтому пользователь будет вводить его навсегда.

Что я сделал до сих пор

Вот мое пока что решение (небольшое). По сути, я беру все значения и выясняю все их возможные комбинации (с этой частью я уже закончил).Затем я беру все возможные комбинации и помещаю их в базу данных в качестве словаря (так, например, для 143 долларов может быть словарная запись {apple: 143, Груши: 0, Апельсины: 0} .. вплоть до {apple : 0, Груши: 1, Апельсины: 47}. Я делаю это каждый раз, когда получаю новый номер, поэтому у меня есть список всех возможных вариантов.

Вот где я застрял. Как я могу использовать приведенные выше правила найти наилучшее возможное решение? Думаю, мне понадобится фитнес-функция, которая автоматически сравнивает данные за два дня и удаляет все возможности, которые имеют отклонение более 5% от данных за предыдущие дни.

Вопросы:

Итак, мой вопрос с пользователем, изменяющим общую сумму, и у меня есть список всех вероятностей, как мне подойти к этому? Что мне нужно узнать? Существуют ли какие-либо алгоритмы или теории, которые я могу использовать, которые применимы? Или, чтобы помочь мне поймите мою ошибку, можете ли вы предложить, какие правила я могу добавить, чтобы сделать эту цель достижимой (если она не в текущем состоянии. Я думал добавить больше фруктов и они должны выбрать минимум 3 и т.д ..)? Кроме того, у меня есть лишь смутное представление о генетических алгоритмах, но я подумал, что могу использовать их здесь, если есть что-то, что я могу использовать?

Я очень хочу узнать, так что любые советы будут очень признательны ( только, пожалуйста, не говорите мне, что эта игра невозможна).

ОБНОВЛЕНИЕ: получение отзывов о том, что эту проблему сложно решить. Поэтому я подумал, что добавлю в игру еще одно условие, которое не будет мешать тому, что делает игрок (игра остается для них такой же), но каждый день стоимость фруктов меняет цену (случайным образом).Это облегчило бы решение? Поскольку в пределах 5% движения и определенных изменений ценности фруктов со временем возможны только несколько комбинаций.

День 1: все возможно, и получить достаточно близкий диапазон почти невозможно, но поскольку цены на фрукты меняются, и пользователь может выбрать изменение только на 5%, то не должен (со временем)диапазон будет узким и узким. В приведенном выше примере, если цены достаточно волатильны, я думаю, что я мог бы грубо перебрать решение, которое дало мне диапазон для предположений, но я пытаюсь выяснить, есть ли более элегантное решение или другие решения, чтобы сужать этот диапазон время.

ОБНОВЛЕНИЕ 2: После прочтения и расспросов я считаю, что это скрытая проблема Маркова / Витерби, которая отслеживает изменения цен на фрукты, а также общую сумму (самое большое взвешивание последней точки данных). Однако я не знаю, как применить эти отношения. Я думаю, что это так, и я могу ошибаться, но, по крайней мере, я начинаю подозревать, что это какая-то проблема с машинным обучением.

Обновление 3: я создал тестовый пример (с меньшими числами) и генератор, чтобы помочь автоматизировать данные, созданные пользователем, и я пытаюсь создать на его основе график, чтобы увидеть, что более вероятно.

Вот код, а также общие значения и комментарии о том, какое количество фруктов на самом деле используется пользователями.

#!/usr/bin/env python
import itertools

# Fruit price data
fruitPriceDay1 = {'Apple':1, 'Pears':2, 'Oranges':3}
fruitPriceDay2 = {'Apple':2, 'Pears':3, 'Oranges':4}
fruitPriceDay3 = {'Apple':2, 'Pears':4, 'Oranges':5}

# Generate possibilities for testing (warning...will not scale with large numbers)
def possibilityGenerator(target_sum, apple, pears, oranges):
    allDayPossible = {}
    counter = 1
    apple_range = range(0, target_sum + 1, apple)
    pears_range = range(0, target_sum + 1, pears)
    oranges_range = range(0, target_sum + 1, oranges)
    for i, j, k in itertools.product(apple_range, pears_range, oranges_range):
        if i + j + k == target_sum:
            currentPossible = {}

            #print counter
            #print 'Apple', ':', i/apple, ',', 'Pears', ':', j/pears, ',', 'Oranges', ':', k/oranges
            currentPossible['apple'] = i/apple
            currentPossible['pears'] = j/pears
            currentPossible['oranges'] = k/oranges

            #print currentPossible
            allDayPossible[counter] = currentPossible
            counter = counter +1
    return allDayPossible

# Total sum being returned by user for value of fruits
totalSumDay1=26 # Computer does not know this but users quantities are apple: 20, pears 3, oranges 0 at the current prices of the day
totalSumDay2=51 # Computer does not know this but users quantities are apple: 21, pears 3, oranges 0 at the current prices of the day
totalSumDay3=61 # Computer does not know this but users quantities are apple: 20, pears 4, oranges 1 at the current prices of the day
graph = {}
graph['day1'] = possibilityGenerator(totalSumDay1, fruitPriceDay1['Apple'], fruitPriceDay1['Pears'], fruitPriceDay1['Oranges'] )
graph['day2'] = possibilityGenerator(totalSumDay2, fruitPriceDay2['Apple'], fruitPriceDay2['Pears'], fruitPriceDay2['Oranges'] )
graph['day3'] = possibilityGenerator(totalSumDay3, fruitPriceDay3['Apple'], fruitPriceDay3['Pears'], fruitPriceDay3['Oranges'] )

# Sample of dict = 1 : {'oranges': 0, 'apple': 0, 'pears': 0}..70 : {'oranges': 8, 'apple': 26, 'pears': 13}
print graph
52
задан Peter Mortensen 29 April 2018 в 07:24
поделиться