問題:
您將得到的數組米大小Ñ,其中的米每個值由重量瓦特的,和百分比p。優化這個動態編程溶液
m = [m0, m1, m2, ... , mn] = [[m0w, m0p], [m1w, m1p], [m2w, m2p], ..., [mnw, mnp] ]
因此,我們將在Python作爲一個列表的列表表示此。
我們則試圖找到這個函數的最小值:
def minimize_me(m):
t = 0
w = 1
for i in range(len(m)):
current = m[i]
t += w * current[0]
w *= current[1]
return t
,唯一的事情,我們可以改變關於米是它的排序。 (即,以任何方式重新排列元素m)此外,這需要比O(n!)更好地完成。
蠻力解決方法:
import itertools
import sys
min_t = sys.maxint
min_permutation = None
for permutation in itertools.permutations(m):
t = minimize_me(list(permutation), 0, 1)
if t < min_t:
min_t = t
min_permutation = list(permutation)
想法如何優化:
的想法:
而不是尋找最好的順序,請參見如果我們能找到一種方法來比較當我們知道問題的狀態時,兩個給定的值在m。 (代碼可能更清楚地解釋這一點)。如果我可以用自下而上的方法來建立這個模型(所以,從最後開始,假設我沒有最佳解決方案),我可以創建一個方程,它可以比較和中的兩個值,並說明一個明顯優於另一個,那麼我可以通過使用這個新值來構造一個最優解,並比較下一組m值。
代碼:
import itertools
def compare_m(a, b, v):
a_first = b[0] + b[1] * (a[0] + a[1] * v)
b_first = a[0] + a[1] * (b[0] + b[1] * v)
if a_first > b_first:
return a, a_first
else:
return b, b_first
best_ordering = []
v = 0
while len(m) > 1:
best_pair_t = sys.maxint
best_m = None
for pair in itertools.combinations(m, 2):
m, pair_t = compare_m(pair[0], pair[1], v)
if pair_t < best_pair_t:
best_pair_t = pair_t
best_m = m
best_ordering.append(best_m)
m.remove(best_m)
v = best_m[0] + best_m[1] * v
first = m[0]
best_ordering.append(first)
然而,這並不像預期工作。第一個值總是正確的,大約60-75%的時間,整個解決方案是最佳的。然而,在某些情況下,它看起來像我改變價值v,然後被傳回到我的比較評估遠高於它應該。下面是我使用要測試的腳本:
import random
m = []
for i in range(0, 5):
w = random.randint(1, 1023)
p = random.uniform(0.01, 0.99)
m.append([w, p])
這裏有一個特定的測試情況表明該錯誤:
m = [[493, 0.7181996086105675], [971, 0.19915848527349228], [736, 0.5184210526315789], [591, 0.5904761904761905], [467, 0.6161290322580645]]
最優解(只是指數)= [1,4,3,2 ,0] 我的解決方案(只是指數)= [4,3,1,2,0]
它感覺非常接近,但我不能爲我的生活找出什麼是錯的。我看着這個錯誤的方式嗎?這看起來像是在正確的軌道上?任何幫助或反饋將不勝感激!
」但是,這不符合預期。「請解釋。 –
請解釋您的預期結果和當前結果的差異。這對其他人會有幫助。 –