更新(2020年7月):这个问题已经有9年了,但我仍然深感兴趣。在此期间,机器学习(如RNN、CNN、GAN等)、新方法和廉价的GPU已经涌现出来,使得新方法成为可能。我认为重新探讨这个问题会很有趣,看看是否有新的方法。
我正在学习编程(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,Pears:1,Oranges :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