7

나는 배달 회사에서 일하고 있습니다. 현재 50 개 이상의 위치 경로를 '손'으로 해결합니다.루비에서 여행 세일즈맨 문제 해결 (50 개 이상의 위치)

나는이 문제를 해결하기 위해 Google지도 API를 사용하려고 생각했지만 24 점 제한이 있음을 읽었습니다.

현재 우리 서버에서 레일을 사용하고 있으므로 50 개 이상의 좌표를 가져 와서 합리적인 해결책을 제시하는 루비 스크립트를 사용하려고합니다.

이 문제에 접근하기 위해 어떤 알고리즘을 사용합니까?

Ruby는 이러한 유형의 문제를 해결하는 좋은 프로그래밍 언어입니까?

기존 루비 스크립트를 알고 있습니까?

+1

... 물론 이것이 가장 어려운 문제 중 하나라는 것을 알지? 정말 좋은 답변이 없습니까? 아직 합리적인 해결책이 있지만 단지 위대한 *이 될 수 없다는 것을 확실히 알고 있습니다. – Matchu

+0

Yeap ... 나는 "최적의"솔루션을 찾고 있지 않다. 합리적인 방법이있을 것이다. – jfanals

+1

"traveling-salesman"태그를 추가했다. 그 태그에 다른 질문을 해봤습니까? –

답변

6

이 당신을 위해 무엇을 찾고있는 수 있습니다 :

경고 :이 사이트가 공격 사이트로 파이어 폭스에 의해 신고되어

-하지만 난 것으로 나타나지 않습니다. 사실 나는 문제없이 그것을 전에 사용

rubyquiz는 여전히에의 시간 여행 기계와 archive.org을 체크 아웃 할 수 있지만 (조금 아래로하고있다) 아래로 보인다 [URL에 대한 수정 내역을 확인]
1 : 여기에 트릭의 부부 http://web.archive.org/web/20100105132957/http://rubyquiz.com/quiz142.html

+0

아주 좋은 출발점처럼 보입니다. 감사! – jfanals

+0

당신이 제안 할 수있는 URL은 다운로드 할 수있는 여러 솔루션을 가리 킵니다. 저는 요세프 시톤 (Joseph Seaton)의 솔루션 중 하나의 코드를 필요에 맞게 조정할 수있었습니다. 그 사이트를 가리켜 주셔서 다시 한번 감사드립니다 :) 나는 10 초 이내에 합리적인 해결책을 얻을 수 있었다. ... – jfanals

+0

당신은 환영 받는다.btw - 내가 탐험을하고 그 중 일부 문제를 해결하려고하는 것이 좋습니다 - 당신이 더 나은 루비 프로그래머가 될 수 있도록 도와 줄 것입니다. 나는 시간이있을 때 일주일에 한 가지 문제를 시도합니다. – konung

1

최적화 된 솔루션 중 하나는 동적 프로그래밍을 사용하지만 매우 비용이 많이 드는 O (2 ** n)입니다. 클러스터링을 사용하지 않고 컴퓨팅, 루비 또는 단일 서버를 사용하면 매우 유용하지 않습니다. 너를 위해서.

구현하기 쉽도록 DP 또는 무차별 대항력을 사용하는 대신 욕심스러운 기준을 제시하는 것이 좋습니다.

일단 프로그램이 끝나면 몇 가지 메모를하고 결과를 어딘가에 저장하여 나중에 조회 할 수 있으므로주기를 절약 할 수 있습니다.

코드 측면에서, 가중치가있는 꼭지점을 구현해야합니다.

즉, 가중치가있는 가장자리가있는 정점 클래스. 재귀 적입니다. 데이터를 채울 그래프 클래스보다

+1

무차별 방식은 20 점 이상에서는 실용적이지 않습니다. 50 세에 대해 팩토리얼 (50!) 순열을 시도해야합니다. 각 판매원별로 대략 = 30414093201713378043612608166064768844377641568960512000000000000입니다. – konung

2

: 해당 페이지를 참조 덩어리 위치 비교적 가까운 하나의 그래프에, 그리고 주 그래프에서 단일 노드로 그 위치를 설정합니다. 이것은 너무 많은 일을하지 않고도 욕심을 가질 수있게 해줍니다.
2 : 근사 알고리즘을 사용하십시오.
2a : 내가 좋아하는 곳은 강렬한 투어입니다. 그들은 해킹하기 매우 쉽습니다.
참조 업데이트

Here's a py lib with a bitonic tourhere's another
나를 루비 하나를 찾아 가자. 효율성 문제가있는 RGL 이상을 찾는 데 문제가 있습니다 ....

귀하의 경우에는
업데이트
, 최소 스패닝 트리 공격은 효과적이어야한다. 당신의 도시가 삼각형 불평등을 충족시키지 못하는 경우는 생각할 수 없습니다. 이것은 상대적으로 일종의 거의 빠른 다소 괜찮은 근사가 있어야한다는 것을 의미합니다. 특히 거리가 유클리드다고 생각하면 다시 그렇습니다.

4

다른 해결책에 언급 된 DP 솔루션을 사용하더라도 O (10^15) 연산이 필요합니다. 그래서 여러분은 현재 대략적인 솔루션을 살펴보아야 할 것입니다. Look by http://en.wikipedia.org/wiki/Travelling_salesman_problem#Heuristic_and_approximation_algorithms

+0

+1! 특히 유클리드 TSP 하위 섹션이나 http://www.cs.princeton.edu/~arora/pubs/tsp.ps에 링크 된 PTAS를 살펴보십시오 (http : //corelab.ntua에서 제공되는 설명을 따르는 것이 더 쉽습니다). gr/courses/approx-alg/material/유클리드 % 20TSP.pdf). 그것은 당신이 공상하는 모든 엡실론에 대해 폴리 시간 O (1 + 1/엡실론) 근사 알고리즘을 제공합니다 (물론 지수가 1/ε으로 커지는 것을 경계하십시오)! –

0

알고리즘에 의해 생성 된 솔루션의 비용이 최적의 3/2 이내가되도록하려면 Christofides 알고리즘이 필요합니다. ACO와 GA에는 보장 된 비용이 없습니다.

1

Bays29 (29-city) 문제에 대한 TSP 문제를 해결하기 위해 Ant Colony Optimazation과 같은 메타 - heurestic 알고리즘을 사용하여 매우 짧은 시간에 최적의 솔루션에 가까워졌습니다. 잠재적으로 같은 것을 사용할 수 있습니다. 자바 : https://github.com/mohammedri/ant_colony_java_TSP 루비 : https://github.com/mohammedri/aco-ruby (불완전) 이 그것을 위해 해결 데이터 세트는 다음과 같습니다

는 내가 현재 포트에서 일하고 있기 때문에 내가 루비, 어쨌든 여기에 연결됩니다,하지만 자바에 쓴 https://github.com/jorik041/osmsharp/blob/master/Core/OsmSharp.Tools/Benchmark/TSPLIB/Problems/TSP/bays29.tsp

각 도시 사이의 유클리드 거리 즉, 직선 거리를 사용하고 있다는 것을 명심하십시오. 도로 및 도시지도 등을 고려하면 실제 상황에서는 이상적이라고 생각하지 않습니다. 그러나 좋은 시작일 수 있습니다. point :

관련 문제