이 문제를 해결하는 방법에는 여러 가지가 있습니다. 모두 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로서
같은 메모리에 캐시하지만 거리 매트릭스가 너무 크기 때문에, 디스크에 저장한다. 최근에 요청하지 않은 경우 캐싱을 사용하여 디스크에서 값을 가져옵니다.
[이 질문에 의해] 중복 (http://stackoverflow.com/questions/21455751/using-real-distances-between-points-in-optaplanner) –