簡體   English   中英

使用動態規划的最小旅行路徑成本

[英]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_idistance_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 --> ec --> d d e a --> d具有非正斜率意味着ac總是更好的選擇,所以我們可以丟棄和我們正在尋找沿成本維度嚴格增加距離的序列,而不是凸包。 從最低成本(更高的距離打破關系)開始,注意從來沒有一個有用的點,即greater-cost-with-equal-or-lower-distance

在每次迭代中,如果我們保持元組按成本排序,我們可以掃描從低到高的成本,從等於或大於d_(i+1)的第一個距離開始(丟棄左邊的任何點),丟棄任何點更大或相等的成本,但更低或相等的距離。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM