Я изучаю программирование (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 в третий день. Вот пример:
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, Pears: 0, Oranges: 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