我正在學習編程(python和algo's),並試圖在一個我感興趣的項目上工作。我已經創建了幾個基本的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%)。水果的價格可以隨機變化,所以總價值也可能會因此而改變(爲簡單起見,本例中我不改變水果價格)。使用上面的例子,在遊戲的第2天,用戶在第3天返回價值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%的運動和某些水果價值的變化中,隨着時間的推移,只有少數組合是可能的。第一天,任何事情都是可能的,並且獲得足夠接近的範圍幾乎是不可能的,但是隨着水果價格變化並且用戶只能選擇5%的變化,那麼不應該(隨着時間的推移)範圍狹窄和狹窄。在上面的例子中,如果價格足夠波動,我想我可以蠻橫逼迫一個解決方案,讓我有一個猜測的範圍,但我試圖找出是否有更優雅的解決方案或其他解決方案來繼續縮小這個範圍時間。
UPDATE2:經過閱讀和詢問,我認爲這是一個隱藏的markov /維特比問題,跟蹤水果價格變化以及總額(加權最後一個數據點最重)。我不知道如何應用這種關係。我認爲是這樣,可能是錯誤的,但至少我開始懷疑這是一種機器學習問題。
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
1爲一個很好的問題是清楚和格式化。 – SpeedBirdNine
非常感謝SpeedBirdNine。第一次有人在這裏對我說。通常我會得到完全相反的結果:-) – Lostsoul
您可能想試試http://math.stackexchange.com/ –