2013-10-16 6 views
1

optaplanner를 처음 사용했습니다. 나는 CVRP 또는 VRPTW 중 어느 것이 노드 간의 경계 가중치 (Euclidean distance) 이상을 지원 하는지를 vrp 예제를 수정하려고하고있다. 나는 최신 릴리스의 optaplanner 6.0.0.CR5를 사용하고 있습니다. 노드 간의 에지 가중치를 어떻게 바꿀 수 있는지에 대한 조언을 많이 주시면 감사하겠습니다.OptaPlanner VRP 에지 가중치는 유클리드 거리 대신 실제 GPS 데이터를 사용해야합니다.

감사합니다.

+0

[이 질문에 의해] 중복 (http://stackoverflow.com/questions/21455751/using-real-distances-between-points-in-optaplanner) –

답변

1

이 문제를 해결하는 방법에는 여러 가지가 있습니다. 모두 2 점 A와 B 사이의 거리를 쉽게 반환 할 수있는 GPS 시스템 (예 : Google지도)이 있다고 가정합니다.

실제 도로를 A에서 B로 가져갈 것인지 결정하는 것은 GPS 시스템 책임입니다. NP 완전 문제는 아니며 GPS 시스템은 이미 최적화되어 있습니다.) OptaPlanner는 A, B, C, D, ... (NP 완성) 순서를 결정하는 것입니다.

(

이 그냥 GPS 시스템의 호출로 얻을 Location.get...Distance(Location) 방법을 대체) 권장하지

A) 임시의 거리를 계산합니다.

단점 : 일반적으로이 방법은 초당 수천 회의 시간이라고하며 GPS 시스템은 빠른 응답을 반환하지 않으므로 평균 점수 계산 속도가 크게 느려집니다.

B)과의 거리를 미리 계산해 클래스 Location 메모리

에 저장은 Map<Location, int> dinstanceMap에 다른 모든 Location까지의 거리를 보유하고 추가한다. Map을 기입 한 후 solve()으로 전화를 걸어 get...Distance()을 구현하여 return distanceMap.get(otherLocation)을 구현하십시오.

단점 : 메모리 확장 : 고객이 너무 많으면 OutOfMemory 예외가 발생합니다.

해결 방법 : 각 Location에 대해 해당지도에서 1000 개의 가장 가까운 위치 만 추가하십시오. 이동 선택기를 필터링하여 서로의지도에없는 2 개의 위치를 ​​절대로 연결하려고 시도하지 마십시오. 이 결과의 품질에 영향을 미칠 수도 있지만.

C) 미리 계산 거리 및 디스크에 저장) B로서

같은 메모리에 캐시하지만 거리 매트릭스가 너무 크기 때문에, 디스크에 저장한다. 최근에 요청하지 않은 경우 캐싱을 사용하여 디스크에서 값을 가져옵니다.