2014-12-19 60 views
0

我正在構建一個程序,允許用戶優化他們的雜貨店購物,以便他們可以使用最少的原料製作大多數食譜。什麼是下一個最佳配料?

該程序的功能之一是我稱之爲「下一個最佳原料」或NBI的功能。例如,如果您已經有鹽,油和迷迭香,那麼NBI會解開最多的食譜?

假設答案是牛肉。如果你購買牛肉,你將能夠創造更多的新食譜,如果你買了其他任何成分。

購買牛肉後,下一個應添加的下一個最佳原料是什麼?等等。

該功能將允許用戶輸入任意數量的起始成分(包括零)。所以有人可以從0,3,甚至50個成分開始。接下來應該添加什麼?

我正在使用一個食譜數據庫(全部約500K食譜)來編譯結果。

我可以繪製出寫出特定算法的個人步驟。但是我需要幫助編寫更通用的算法。

這裏的一個特定的算法:

用戶在3種成分A,B,和C

  1. 隔離使用利用A + B + C + BLANK所有4成分配方進入。請注意頻率最高的空白。使用A + B + BLANK ... A + C + BLANK ... B + C + BLANK分離所有三種成分的食譜。請注意頻率最高的空白。

  2. 分離所有使用A + BLANK ... .B + BLANK ... C + BLANK的2成分食譜。請注意頻率最高的空白。

  3. 分離所有簡單使用BLANK的單料配方。請注意頻率最高的空白。

  4. 用最高的TOTAL頻率計算BLANK。這是下一個最佳原料。

但我需要一種方式來編寫一個更通用的算法,當用戶輸入N個成分(任何從0成分到100)。

我可以用簡單的英語寫出規則 - 但我的程序員需要一種使用編碼邏輯編寫通用規則的方法。

這裏是簡單的英語。

當用戶搜索N個成分(包括零)時,立即忽略任何需要N + 2成分或更多成分的食譜。然後分離所有剩餘食譜,使用全部,部分或不含這些成分,以便有1個(且只有1個)「未檢測」成分的空缺槽。
記錄所有「未檢出」成分的頻率。無論哪種「未檢測」成分的頻率最高,都成爲下一個最佳原料。

目標是使此搜索功能準確(或與我的數據庫一樣準確)並且快速。一些成分很容易。但是當看着10種以上的食材時,它可能會減慢一點。

有什麼想法?

+0

這是一個編程問題(我懷疑這個問題已經得到很好的研究)。它屬於stackoverflow.se。我想,存儲數據庫的一些索引將使它變得簡單。 –

+0

請注意,下一個最佳配料加上下一個最佳配料不一定會像一對不同的配料一樣好,因爲這兩個配料在連續推薦時都不會同時推薦。爲了將這個問題轉化爲數學,假設成分是整數,並且想要最大化它們產生的子集產品的數量,但同時最小化整數的大小。 – Waffle

+0

謝謝你們。我在數據庫部分發布了我的問題。乾杯。 – George

回答

0

你有一個的成分,每個配方有一個的成分。循環使用設置差異,並查看哪些差異恰好包含一種成分。

一些僞代碼:

initialize counts 

for each recipe 
    ingredients = set_difference(recipe_ingredients, my_ingredients) 
    if length(ingredients) == 1 
    increment counts[ingredient] 

maximum(counts) == next_best_ingredient 

獲取next_best_ingredients(複數)是棘手的,因爲有可能是從上方的#2和#3成分例如產生比#1和#2的總和匹配。我不知道如何解決這個問題,但是你可以重複前面的循環,並將其稱爲好的。

0

我不知道,這是否導致了最有效的實施,但我會嘗試以下方法:
- 對於剩餘的每個配方(最多N + 1個配料,該配料已經煮熟),建立你的N配料和配方的配料。
- 如果結果集中有超過N + 1種成分,請丟棄配方。否則,採取新的成分,並增加其計數器變量或爲該成分添加新的計數器變量。

如果可以,您應該確保每種配方的成分列表都存儲在數據庫中。這樣,集合生成/檢測多個不匹配應該非常快。

相關問題