Я изучаю программирование (python и algos) и пытался работать над проектом, который мне интересен. Я создал несколько базовых скриптов python, но я не уверен, как подойти к решению игры, которую я пытаюсь создать.
Вот как игра будет работать:
пользователям будут предоставлены элементы со значением. Например
Apple = 1
Pears = 2
Oranges = 3
Затем они получат возможность выбрать любую комбинацию из них, которая им нравится (например, 100 яблок, 20 груш и 1 апельсина). Единственный результат, который получает компьютер, - это общее значение (в этом примере его $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, Pears: 0, Orange: 0}) до самого {apple: 0, Pears: 1, Orange: 47} Я делаю это каждый раз, когда получаю новый номер, поэтому у меня есть список всех возможностей.
Вот, где я застрял. Является ли использование правил выше, как я могу найти наилучшее решение? Я думаю, что мне нужна функция фитнеса, которая автоматически сравнивает данные за два дня и удаляет любые возможности, которые имеют более чем 5% -ную дисперсию данных предыдущих дней.
Вопросы:
Итак, мой вопрос, когда пользователь меняет общее число, и у меня есть список всех вероятностей, как мне подойти к этому? Что мне нужно узнать? Существуют ли какие-либо алгоритмы или теории, которые я могу использовать, которые применимы? Или, чтобы помочь мне понять мою ошибку, можете ли вы предложить, какие правила я могу добавить, чтобы сделать эту цель выполнимой (если она не в ее нынешнем состоянии. Я думал добавить больше фруктов и сказать, что они должны выбрать не менее 3 и т.д.).? Кроме того, у меня только смутное понимание генетических алгоритмов, но я думал, что могу использовать их здесь, если есть что-то, что я могу использовать?
Я очень очень хочу учиться, поэтому любые советы или советы будут очень благодарны (просто, пожалуйста, не говорите мне, что эта игра невозможна).
Спасибо заранее.
UPDATE: получение обратной связи, которую трудно решить. Поэтому я думал, что добавлю еще одно условие в игру, которое не будет мешать тому, что делает игрок (игра остается для них одинаковой), но каждый день ценность фруктов меняет цену (случайным образом). Помогло бы это решить? Потому что в пределах 5% движения и некоторых изменений стоимости фруктов, только несколько комбо являются вероятными с течением времени. День 1, все возможно, и получить достаточно близкий диапазон практически невозможно, но поскольку цены на фрукты меняются, и пользователь может выбрать только 5% -ное изменение, тогда не следует (со временем) диапазон быть узким и узким. В приведенном выше примере, если цены достаточно волатильны, я думаю, что я мог бы наложить грубую силу на решение, которое дало мне возможность догадаться, но я пытаюсь выяснить, есть ли более элегантное решение или другие решения, чтобы сузить этот диапазон время.
UPDATE2: после прочтения и опроса, я считаю, что это скрытая проблема markov/Viterbi, которая отслеживает изменения цен на фрукты, а также общую сумму (взвешивая последние данные, самые тяжелые). Я не уверен, как применять отношения. Я думаю, что это так и может быть неправильным, но, по крайней мере, я начинаю подозревать, что это какая-то проблема машинного обучения.
Update3: Я создал тестовый пример (с меньшими числами) и генератор, чтобы помочь автоматизировать созданные пользователем данные, и я пытаюсь создать график из него, чтобы узнать, что более вероятно. Здесь код вместе с полными значениями и комментариями о том, что представляют собой фактические количества фруктов пользователей.
#!/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