У меня есть игра со следующими правилами:
-
Пользователь получает цены на фрукты и имеет возможность покупать или продавать предметы в корзине с фруктами каждый раз.
-
Пользователь не может сделать более 10% общего изменения в своей корзине за один ход.
- Цены на фрукты меняются каждый день, и когда их умножают на количество предметов в корзине фруктов, общая стоимость корзины меняется также и по отношению к изменениям цен на фрукты каждый день.
- Программе предоставляется только текущая цена всех фруктов и текущая стоимость корзины (текущая цена количества фруктов * для всех предметов в корзине).
- Основываясь на этих двух входах (все цены на фрукты и общая стоимость корзины), программа пытается угадать, какие предметы находятся в корзине.
- Корзина не может содержать более 100 предметов, но слоты могут быть пустыми
- Игрок может сыграть несколько оборотов.
Моя цель состоит в том, чтобы точно догадаться, насколько это возможно вычислительно недорого (читай: нет грубой силы) и масштаб, если есть тысячи новых плодов.
Я изо всех сил пытаюсь найти ответ, но на мой взгляд, это не сложно. Если у меня есть таблица ниже. Я мог бы изучить 1-й день и получить следующие данные:
Apple 1
Pears 2
Oranges 3
Basket Value = 217
Я могу сделать подсчет салфеток и предположить, что веса в корзине: 0 яблоко, 83 груши и 17 апельсинов, равное значению корзины 217.
На следующий день меняются значения фруктов и корзин. To (яблоко = 2, груша 3, апельсины 5) со значением корзины 348. Когда я принимаю мои предполагаемые веса выше (0,83,17), я получаю общее значение 334 - неверно! Запустив это по моему сценарию, я вижу, что самое близкое совпадение - 0 яблок, 76 груш, 24 апельсина, которые хотя и равны 348, когда% изменено в его изменении на 38%, поэтому его невозможно!
Я знаю, что могу полностью переборщить, но если у меня будет 1000 плодов, это не будет масштаб. Не прыгать на какой-либо подножку, но может ли что-то вроде нейронной сети быстро исключить маловероятное, поэтому я вычисляю большие объемы данных? Я думаю, что они должны быть более масштабируемыми/быстрее, чем чистая грубая сила? Или есть ли другие решения, которые могли бы получить результат?
Вот исходные данные (помните, что программа может видеть только цены и общую стоимость корзины):
Вот какой код грубой силы (Спасибо @paul Hankin за более чистый пример, чем у меня):
def possibilities(value, prices):
for i in range(0, value+1, prices[0]):
for j in range(0, value+1-i, prices[1]):
k = value - i - j
if k % prices[2] == 0:
yield i//prices[0], j//prices[1], k//prices[2]
def merge_totals(last, this, r):
ok = []
for t in this:
for l in last:
f = int(sum(l) * r)
if all(l[i] -f <= t[i] <= l[i] + f for i in range(len(l))):
ok.append(t)
break
return ok
days = [
(217, (1, 2, 3)),
(348, (2, 3, 5)),
(251, (1, 2, 4)),
]
ps = None
for i, d in enumerate(days):
new_ps = list(possibilities(*d))
if ps is None:
ps = new_ps
ps = merge_totals(ps, new_ps, 0.10)
print('Day %d' % (i+1))
for p in ps:
print('Day %d,' % (i+1), 'apples: %s, pears: %s, oranges: %s' % p)
print
Обновление - информация до сих пор потрясающая. Имеет ли смысл разбить проблему на две проблемы? Один из них генерирует возможности, в то время как другой находит связь между возможностями (не более 10% дневного изменения). Исключив возможности, не могли ли они также использоваться, чтобы помочь только создать возможности, которые возможны, для начала? Я не уверен, что подход все же, но я чувствую, что обе проблемы разные, но тесно связаны. Твои мысли?
Обновление 2 - есть много вопросов об изменении%. Это общий объем предметов в корзине, которые могут измениться. Чтобы использовать пример игры, представьте, что в магазине говорится: вы можете продавать/возвращать/покупать фрукты, но они не могут превышать 10% от вашего последнего счета. Поэтому, хотя изменение цен на фрукты может привести к изменению стоимости корзины, пользователь не может предпринять никаких действий, которые повлияли бы на него более чем на 10%. Поэтому, если значение равно 100, они могут вносить изменения, которые создают его до 110, но не более.