주유소 문제에 대한 알고리즘 이해


11

에서 주유소 문제를 우리는 주어진 n 도시 {0,,n1} 과 그들 사이의 도로. 각 도로는 길이가 있으며 각 도시는 연료 가격을 정의합니다. 도로 1 개는 연료 1 개가 필요합니다. 우리의 목표는 가능한 가장 저렴한 방법으로 출발지에서 목적지로가는 것입니다. 우리 탱크는 어떤 가치에 의해 제한됩니다.

알고리즘 을 이해하려고 하므로 솔루션을 계산하기 위해 수동으로 단계를 작성했습니다. 불행히도 나는 붙어있어-어떤 시점에서 고려해야 할 가장자리가 없습니다. 아무 이유가 무엇인지 모르겠습니다.

예 :
도로 :
0 ----------- 1 ------------ 2 -------------- 3
(그렇지 않습니다 간단해야합니다. 그래프가 될 수 있습니다. 즉 0-> 2, 0-> 3, 1-> 3 등의 도로가있을 수 있습니다.)

출처 : 0, 대상 : 3, 탱크 : 10 개 단위
연료 가격 : 0 : 10 개 단위, 1 : 10 대, 2 : 20 개 단위, 3 : 12 단위
길이 : 0-> 1 : 9 대, 1> 2 : 1 단위, 2-> 3 : 7 단위
최적 솔루션 : 1에서 0 및 8 단위로 9 단위를 채 웁니다. 총 비용은 170 단위 (9 * 10 + 8 * 10)입니다.

그래서 여기에 표시된대로 계산하려고했습니다 (2.2 항)

GV[u] is defined as:
GV[u] = { TankCapacity - length[w][u] | w in Cities and fuelPrice[w] < fuelPrice[v] and length[w][u] <= TankCapacity } U {0}

so in my case:
GV[0] = {0}
GV[1] = {0}
GV[2] = {0, 3, 9}
GV[3] = {0}

D(u,g) - minimum cost to get from u to t starting with g units of fuel in tank:
D(t,0) = 0, otherwise:
D(u,g) = min (foreach length[u][v] <= TankCapacity)
         { 
           D(v,0) + (length[u][v] - g) * fuelPrice[u]                             : if  fuelPrice[v] <= fuelPrice[u] and g <= length[u][v]
           D(v, TankCapacity - length[u][v]) + (TankCapacity - g) * fuelPrice[u]  : if  fuelPrice[v] > fuelPrice[u]
         }

so in my case:
D(0,0) = min { D(1,0) + 9*10 }  - D(0,0) should contain minimum cost from 0->3
D(1,0) = min { D(2,9) + 10*10 } - in OPT we should tank here only 8 units :(
D(2,9) = min { ??? - no edges which follows the condition from the reccurence 

Nevertheless D(0,0) = 90 + 100 + smth, so it's already too much.

To achieve the optimal solution algorithm should calculate D(2,7) because the optimal route is:   
(0,0) -> (1,0) -> (2, 7) -> (3, 0) [(v, g): v - city, g - fuel in tank]. 
If we look at G[2] there is no "7", so algorithm doesn't even assume to calculate D(2,7), 
so how can it return optimal solutions?

문서의 되풀이가 작동하지 않거나 내가 잘못한 것 같습니다.

아무도 나를 도울 수 있습니까?

답변:


7

문제는 min()p의 식 (4)에서 첫 번째 주장의 조건에있다 . 7. 현재

c(v) <= c(u) and g < d[u][v]

그러나 그것은해야한다

(c(v) <= c(u) or v = t) and g < d[u][v]

가스가 남지 않도록 t에 도달하도록 강제하십시오. (Fill-Row (u, q)의 버그에 대한 아래의 설명과 마찬가지로 t에서의 가스 비용에는 관심 이 없습니다 . 거기에서와 마찬가지로 문제를 해결하는 또 다른 방법은 c (t )를 알고리즘 시작시 0으로 설정합니다.)

아래에 설명 된 것처럼 누락 된 가장자리를 추가하는 것과 함께 (게시 된 알고리즘에서)이 실수를 수정하면 (모든 실수 :-P) 모든 것이 작동하도록 충분해야합니다.


놓친 것 중 하나는 그래프 G가 완전 해야한다는 것 입니다 (섹션 2의 첫 번째 문장, 4 페이지). 이것이 완료되지 않은 경우 최소 경로 길이를 사용하여 찾은 가중치와 함께 누락 된 모서리를 추가해야합니다. 그래프. 따라서 예를 들어 그래프에 가중치가 8 (2를 통한 경로에 해당) 인 1에서 3까지의 가장자리가 있어야하며, 실제로 GV [3] = {0, 2}가됩니다.

그것이 당신을 위해 문제를 완전히 해결할지 확실하지 않지만 도움이 될 것입니다.

별도로, 필의 Fill-Row (u, q) 알고리즘에 버그가 있다고 생각합니다. 6 :이 알고리즘은 케이스 q = 1을 특별히 처리해야하지만 그렇지 않습니다. 나는 그것이 변화함으로써 고칠 수 있다고 믿는다.

if c(v) <= c(u)

3 호선에서

if c(v) <= c(u) or q = 1

최종 다리가 목적지에 도착하도록 강제합니다. (직관적으로, 우리는 항상 최종 목적지에서 가스 가격을 무시해야합니다.)이 문제를 해결하는 또 다른 방법은 처음에 0으로 c (t)를 덮어 쓰는 것입니다.


q=1c(v)>c(u)

2

@j_random_hacker 솔루션을 사용하여 그래프를 완전한 그래프로 변환하고 조건을 식 (4)에서 다음으로 변경해야합니다.

(c(v) <= c(u) or v = t) and g < d[u][v]     

완전한 그래프는 다음과 같아야합니다.

여기에 이미지 설명을 입력하십시오

최종 계산 :

GV[0] = {0}, GV[1] = {0}, GV[2] = {0, 3, 9}, GV[3] = {0, 2}

D(0,0) = min { D(1,0) + 9 * 10 }
D(1,0) = min { D(2,9) + 10 * 10, D(3,0) + 8*10 }
D(3,0) = 0
... etc

so D(0,0) = 170

0-> 1-> 3 [총 비용 170 $]을 통한 경로가 솔루션입니다. 그것이 우리가 기대했던 것입니다 :-). 경로가 필요한 경우 솔루션의 추가 모서리를 처음에 지정된 모서리로 변환 할 수 있어야합니다 (매우 어렵지 않아야 함).

이 재발에서 교착 상태를 피해야하는 방법 만 궁금합니다. 예를 들어, c (0) <= c (1) 및 c (1) <= c (0)이므로 0 <-> 1 사이에 교착 상태가 발생할 수 있습니다.



1

아이디어는 어디서나 가장 저렴한 속도로 연료를 얻는 것입니다 (욕심 많은 알고리즘 패러다임)

몇 가지 예를 들어보십시오. 당신의 예에서

출처 : 0, 목적지 : 3, 탱크 : 10 대 연료 가격 : 0 : 10 대, 1:10 대, 2:20 대, 3:12 대 길이 : 0-> 1 : 9 장치, 1-> 2 : 1 단위, 2-> 3 : 7 단위

나는 처음에 9 유닛을 여행해야하므로, 탱크를 0에서> = 9 유닛 (용량> = 9)으로 채워야합니다. 이제 연료비가 0에서> = 연료비 인 1,2,3에서 볼 수 있습니다. 따라서 필요한 연료를 가장 저렴한 속도로 구매하고 싶습니다. 나는 9 + 1 + 7 = 17 단위를 채우려 고합니다. 도시 0 만. 그러나 탱크의 용량은 <17, 10 일 수 있습니다. 따라서 10까지 채울 것입니다. 그런 다음 1에 연료 1 개가 남아 있고 8 개를 더 통과해야하므로 1에 7을 채 웁니다 단위 더. 요금이 더 높기 때문에 2를 채울 수 없습니다. 나의, 총 비용 = 10 * 10 + 7 * 10 = 170.

Cidijij

i) 전체 = 0

i=0n1liCi>Clll=n1dllk=i+1ldk,k+1mindl도시 에서 전체 용량} 단위 연료 . full = { 전체 용량}. 설정하십시오 .d li = limindli=l


답변 주셔서 감사합니다! 불행히도 나는 스스로를 명확하게 지정하지 않았습니다. 당신은 그래프가 나의 예만큼 단순하다고 가정했지만 어떤 그래프도 가능합니다. 즉 도로 0-> 2, 1-> 3 등도있을 수 있습니다.
Wojciech Kulik

예, 모든 도시가 선형 방식으로 연결되어 있다고 가정하기 전에 (그래프는 간단한 경로입니다) 언급하지 않았습니다.
Sayan Bandyapadhyay 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.