[英]Minimum cost of travel path using dynamic programming
假設我們要從 A 到 B,在旅行過程中,有一些站點,d_1,...,d_n,其中 d_1=A,d_n=B,我們可以選擇在每個站點添加燃料,成本為 C_i,假設如果我們在 d_i 站加氣,那么我們可以行駛 a_i 多公里。 我想找到一種動態規划算法來找到前往 B 的最低成本(假設存在這樣的序列)。
我嘗試使用 D[i] 作為從 A 到車站 i 的最低旅行成本,但我無法弄清楚遞歸關系。 我想我可能需要跟蹤我們目前可以旅行多長時間。 但這會太復雜...
正如您所說,您可能需要跟蹤我們目前可以旅行多長時間。 您應該使用 D[i][j] 作為從 A 到站 i 並留下 j 公里燃料的最低成本。 在這種情況下,遞歸關系如下。
D[i][j] = min( min{ D[ik][j+(d_i - d_{ik})] | k<i }, D[i][j-a_i] + C_i );
第一項min{ D[ik][j+(d_i - d_{ik})] | k<i }
min{ D[ik][j+(d_i - d_{ik})] | k<i }
表示從 ik 站移動到 i 站,耗油量為(di - d_{ik})
公里。 k 可以取 0 到 i-1 的值。
第二項D[i][j-a_i] + C_i
表示在 d_i 站添加 a_i 公里汽油,成本消耗為 C_i。 此外,如果您允許在同一站點多次添加氣體,則必須小心。
最后, min{ D[n][*] | '*' is any positive value }
min{ D[n][*] | '*' is any positive value }
成為答案。
我們可以根據數據考慮可能修剪搜索空間的潛在優化。 選擇d_1
的可能性會產生一個(cost, distance)
元組。 在d_i
,我們通過將cost_i
和distance_i
與之前的元組組合來生成新的元組,保留所有(cost, distance)
元組,其中距離大於d_(i+1)
並且沒有元組比另一個元組具有更高的成本和更低的距離. 換句話說,我們不想將加油站i
與先前的元組一起使用,其中
prev1.cost + c_i ≥ prev2.cost
prev1.dist + d_i ≤ prev2.dist
for some (prev1, prev2)
我們可以在幾何上將這種關系視為點對之間的零斜率或負斜率。
distance
| b
| f
| c
| e
| a d
|
-----------------cost
c --> e
, c --> d
d
e
a --> d
具有非正斜率意味着a
和c
總是更好的選擇,所以我們可以丟棄和我們正在尋找沿成本維度嚴格增加距離的序列,而不是凸包。 從最低成本(更高的距離打破關系)開始,注意從來沒有一個有用的點,即greater-cost-with-equal-or-lower-distance
。
在每次迭代中,如果我們保持元組按成本排序,我們可以掃描從低到高的成本,從等於或大於d_(i+1)
的第一個距離開始(丟棄左邊的任何點),丟棄任何點更大或相等的成本,但更低或相等的距離。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.