문제

도움이 필요한지를 선택하거나 만들어 클러스터링 알고리즘을 사용하여 특정 기준에 따라.

상상을 관리하는 신문을 배달습니다.

  • 당신은 주소,각각의 지오.
  • 당신이 원하는 클러스터의 주소는 각 클러스터에 할당 배달 사람입니다.
  • 숫자의 배달 사람,또는 클러스터가 고정되지 않습니다.필요한 경우,내가 할 수 있는 대세 배달 사람들입니다.
  • 각 클러스터에 있어야에 대해 동일한 수의 주소가 있습니다.그러나 클러스터에 있는 더 적은 주소는 경우에는 클러스터의 주소는 더 많은 분산되어 있습니다.(말로 또 다른 길:최소의 클러스터를 각 클러스터가 포함 최대의 주소,그리고 모든 주소에서 클러스터로 구분되어야 합 최대 거리입니다.)
  • 보너스 포인트,데이터 설정 변경(주소를 제거하거나 추가)및 알고리즘을 다시 실행하는 것으면 클러스터에 남아 있었으로 변경되지 않은 가능한(ie.이 규칙은 간단한 k-means clustering 는 임의의 자연에서).그렇지 않으면 전달 사람은 미친 갈 것입니다.

그래서...아이디어가?

업데이트

트 네트워크,그래프에서 설명한 대로 거미의 대답이 제공되지 않습니다.

도움이 되었습니까?

해결책

나는 당신이 원한다고 생각합니다 계층 적 응집 K- 평균보다는 기술. 알고리즘을 올바르게 받으면 적절한 수의 클러스터가있을 때 중지 할 수 있습니다. 다른 사람이 언급했듯이 이전 솔루션으로 후속 클러스터링을 시드 할 수있어 성능이 우수하게 개선 될 수 있습니다.

특히 문제의 차원이 높은 경우 사용하는 거리 함수를 자세히 살펴볼 수 있습니다. 유클리드 거리는 이해하기 가장 쉽지만 최고는 아닐 수도 있습니다. Mahalanobis와 같은 대안을 살펴보십시오.

나는 당신의 실제 문제가 신문 전달과 관련이 없다고 가정합니다 ...

다른 팁

나는 Java에서 비효율적이지만 간단한 알고리즘을 작성하여 질문에 설명 된대로 포인트 세트에서 기본 클러스터링을 얼마나 가까이에 올릴 수 있는지 확인했습니다.

알고리즘은 (x, y) coords라면 목록에서 작동합니다. ps 그것은 다음과 같이 지정됩니다 int에스. 세 가지 다른 매개 변수도 필요합니다.

  1. 반경 (r) : 포인트가 주어지면 근처 지점을 스캔하기위한 반경은 얼마입니까?
  2. 최대 주소 (maxA) : 클러스터 당 최대 주소 (포인트)는 얼마입니까?
  3. 민주 주소 (minA) : 클러스터 당 최소 주소

세트 limitA=maxA. 주요 반복 :빈 목록을 초기화하십시오 possibleSolutions. 외부 반복 : 모든 지점에 대해 p 안에 ps. 빈 목록을 초기화하십시오 pclusters. 포인트 워크리스트 wps=copy(ps) 정의됩니다. 작업 점 wp=p. 내부 반복 : 동안 wps 비어 있지 않습니다. 포인트를 제거하십시오 wp 안에 wps. 모든 점을 결정하십시오 wpsInRadius 안에 wps 거리에 있습니다 r ~에서 wp. 종류 wpsInRadius 거리에 따라 오름차순 wp. 첫 번째를 유지하십시오 min(limitA, sizeOf(wpsInRadius)) 포인트 wpsInRadius. 이 지점은 새 클러스터를 형성합니다 (포인트 목록) pcluster. 추가하다 pcluster 에게 pclusters. 포인트를 제거하십시오 pcluster ~에서 wps. 만약에 wps 비어 있지 않아 wp=wps[0] 내부 반복을 계속하십시오.내부 반복.클러스터 목록 pclusters 얻어진다. 이것을 추가하십시오 possibleSolutions. 끝 외부 반복.

우리는 각각에 대해 가지고 있습니다 p 안에 ps 클러스터 목록 pclusters 안에 possibleSolutions. 모든 pclusters 그런 다음 가중치를 부여합니다. 만약에 avgPC 클러스터 당 평균 지점 수입니다 possibleSolutions (글로벌) 및 avgCSize 평균 클러스터 수입니다 pclusters (글로벌), 이것은이 두 변수를 사용하여 중량을 결정하는 기능입니다.

  private static WeightedPClusters weigh(List<Cluster> pclusters, double avgPC, double avgCSize)
  {
    double weight = 0;
    for (Cluster cluster : pclusters)
    {
      int ps = cluster.getPoints().size();
      double psAvgPC = ps - avgPC;
      weight += psAvgPC * psAvgPC / avgCSize;
      weight += cluster.getSurface() / ps;
    }
    return new WeightedPClusters(pclusters, weight);
  }

최상의 솔루션은 이제입니다 pclusters 무게가 가장 적습니다. 우리는 이전 최고의 솔루션보다 더 나은 솔루션 (무게)을 찾을 수있는 한 주 반복을 반복합니다. limitA=max(minA,(int)avgPC). 메인 반복을 끝내십시오.

동일한 입력 데이터의 경우이 알고리즘은 항상 동일한 결과를 생성합니다. 목록은 순서를 보존하는 데 사용됩니다 무작위가 없습니다 관련된.

이 알고리즘의 동작 방식을 보려면 32 포인트의 테스트 패턴에 대한 결과 이미지입니다. 만약에 maxA=minA=16, 그런 다음 16 개의 주소의 2 개의 클러스터를 찾습니다.

alt text

다음으로 설정하여 클러스터 당 최소 주소 수를 줄이면 minA=12, 우리는 12/12/8 포인트의 3 개의 클러스터를 발견합니다.

alt text

그리고 알고리즘이 완벽하다는 것을 보여주기 위해서는 다음과 같은 출력이 있습니다. maxA=7, 그러나 우리는 6 개의 클러스터를 얻고 일부는 작습니다. 따라서 매개 변수를 결정할 때는 여전히 너무 많이 추측해야합니다. 주목하십시오 r 여기 5 개만 있습니다.

alt text

호기심으로 인해 무작위로 선택된 포인트 세트에서 알고리즘을 시도했습니다. 아래 이미지를 추가했습니다.

결론? 이것은 반나절이 걸렸고, 비효율적이며, 코드가 못 생겼으며, 비교적 느립니다. 그러나 그것은 생산할 수 있음을 보여줍니다 약간 짧은 시간이 발생합니다. 물론 이것은 단지 재미를위한 것이 었습니다. 이것을 실제로 유용한 것으로 바꾸는 것은 어려운 부분입니다.

alt text

alt text

당신이 묘사하는 것은 (다중)-차량 경로-rouplem (VRP)입니다. 다양한 기술 (휴리스틱, 상용 솔버 등)을 사용 하여이 문제의 다양한 변형에 대한 학술 문헌이 상당히 많이 있습니다. 일반적으로 저자는 구체적인 인스턴스에 대한 우수하거나 최적의 솔루션을 찾으려고 노력하며, 이는 또한 사이트의 클러스터링 (한 차량 경로의 모든 사이트)을 의미합니다.

그러나 클러스터는 약간 다른 인스턴스만으로 주요 변화를 겪을 수 있습니다. 이는 피하고 싶은 것입니다. 그래도 VRP 페이퍼의 무언가가 당신에게 영감을 줄 수 있습니다 ...

명시 적 클러스터링 단계를 고수하기로 결정한 경우 각 경로의 일부이므로 모든 클러스터에 분포를 포함시키는 것을 잊지 마십시오.

스트리트 그리드의 그래프 표현을 사용하여 클러스터를 평가할 때는 흰색지도에서 점을 연결하는 것보다 더 현실적인 결과를 얻을 수 있습니다 (둘 다 TSP- 변수 임). 그래프 모델을 사용할 수없는 경우 택시 메트릭 (| x_1 -x_2 | + | y_1 -y_2 |)을 거리의 근사치로 사용할 수 있습니다.

경제/시장 기반 솔루션 사용에 대해 생각해 보셨습니까? 설정을 임의로 (임의성 효과를 피하기 위해 일정)로 나누어 짝수 서브 세트 (배달 인원 수에 의해 결정됨)로 나뉩니다.

그래프에 추가하는 금액으로 각 지점에 비용 함수를 할당하고 각 추가 지점에 경제적 가치를 부여하십시오.

반복적으로 각 사람이 최악의 지점을 경매하도록 허용하고 각 사람에게 최대 예산을 부여하십시오.

이것은 아마도 사람들이 스왑을 찾거나 "내가 이것을 한두 가지하지 않으면 내 인생이 훨씬 쉬울 것입니다. 또한 매우 유연합니다 ( 예를 들어, 다른 사람들과 1 마일 떨어진 곳에는 상당히 쉽게 프리미엄을 주어질 수 있습니다).

나는 다르게 접근 할 것입니다 : 거리 네트워크를 각 거리의 각 측면에 가장자리로 그래프로 고려하면 각 종이 보이가 단일 하나를 탈 수 있도록 각각의 거리의 각 측면에 가장자리가있는 n 세그먼트로 그래프를 파티션하는 것을 찾으십시오. 경로의 시작부터 끝까지 연속 경로. 이런 식으로, 당신은 사람들에게 같은 세그먼트를 반복적으로 타도록 요구하는 노선을주지 않습니다 (예 : 주변 거리를 덮지 않고 거리의 양면을 덮도록 요청할 때).

이것은 매우 빠르고 더러운 방법을 발견하는"클러스터의"거짓말입니다.이것에서 영감을했다"게임기를 잠금 해제합니다."

나누어 전달 공간으로의 그리드 사각형입니다.참고-그것은 걸릴 것입니다 일부 조정의 크기 그리드의 전에 이 멋지게 작동합니다.내 직감은 나는 광장 크기와 비슷한 크기의 물리적 지역을 차단하는 것은 좋은 출발점입니다.

루프를 통해 각 광장 및 상점의 번호를 전달 위치(집)이내에 각 블록입니다.사용 두 번째는 루프(또는 영리하는 방법에는 먼저)를 저장하는 배달의 수에 대한 포인트 각각 인근니다.

지금 당신은 운영할 수 있습니다 이 그리드에서 유사한 방식으로 사진작 소프트웨어입니다.검색할 수 있습니다 가장자리의 클러스터에 의해 발견 블록 어떤 주변 블록이 없는 전달에서 포인트니다.

마지막으로 필요하신 시스템을 결합의 수를 배달어뿐만 아니라 총 여행 거리를 만들고 할당 노선이 있습니다.도 있을 수 있습 고립 된 클러스터와 몇 가지 배달을 만들 수 있고,하나 또는 두 개의 슈퍼 클러스터는 많은 가정에 매우 가까이 각각 다른 요구하는 다수 납품에 사람들이 동일한 클러스터입니다.모든 가정 방문해야하는,그래서 당신의 첫 번째 제약 조건이 있습니다.

유도 허용되는 최대 거리에 의해 여행 중 하나 배달 사람에 단일 실행됩니다.다음에 대해 동일한 작업을 수행하수의 배달했습니다.

최초의 라우팅 알고리즘을 지정합니다 배달 사람들에게 보내는 모든 임의의 클러스터와 함께하지 않는 모든 배송이 완료되면,그들에게 전달할 때까지 그들은 자신의 전달을 제한하거나 그들이 배달되는 모든 가정에서 클러스터입니다.이 있는 경우 히트 배달이 제한,끝부로 다시 들여 보내려 두십시오.그들이 할 수 있는 경우 안전하게 여행하는 가장 가까운 클러스터 및 그런 가정을 타격하지 않고 그들의 최대행거리,그렇게 반복합니다.

한 번이 경로 완료를 위해 현재 전달,사람이 있다면 확인 가정이 있는지 못하는 배달합니다.그렇다면,할당을 다른 사람이 전달,그리고 반복 위의 알고리즘이 있습니다.

이 생성됩니다 초기 노선이 있습니다.내가 저장한 모든 정보의 위치 및 크기의 각각의 수를 가정 내 스퀘어와 해당하는 모든 직접적인 이웃사람,클러스터에 있는 각각 그리고 배달 사람들과 그들의 노선-나는 저의 모든에서 이러한 데이터베이스입니다.

고 다시 계산 절차까지 당신은-하지만 모두 현재 경로,클러스터 등에서 데이터베이스는 상태로 유지할 수 있도록 모든 역사적인 경로,그리고 다양한 시나리오를 참조는 최상의 방법에 적응하는 변화를 만드는 최소한 변경합니다.

이것은 가치가있는 문제의 전형적인 예입니다. 최적화 된 솔루션 "최적"을 해결하려고하는 대신. 어떤면에서는 비슷합니다.여행 세일즈맨 문제"하지만 최적화 중에 위치를 분류해야합니다.

나는 다음과 같은 문제에 좋은 영향을 미치기 위해 세 가지 최적화 알고리즘을 사용했습니다.

  1. 시뮬레이션 어닐링
  2. 훌륭한 대홍수 알고리즘
  3. 유전자 알고리즘

최적화 알고리즘을 사용하여 다음 "목표"를 설명했다고 생각합니다.

  1. 각 종이 소년의 지리적 영역은 최소화되어야합니다.
  2. 각각의 가입자 수는 거의 동일해야합니다.
  3. 각각으로 이동하는 거리는 거의 같아야합니다.
  4. (그리고 당신이 진술하지 않았지만 중요 할 수도 있습니다) 경로는 시작된 곳에서 끝나야합니다.

이것이 당신이 시작되기를 바랍니다!

* 편집하다 *

경로 자체에 관심이 없다면 위의 목표 3과 4를 제거하고 아마도 문제가 보너스 요구 사항에 더 맞춤화 될 수 있습니다.

인구 통계 정보 (예 : 인구 밀도, 구독 채택률 및 가입 취소율)를 고려한 경우 위의 최적화 기술을 사용하여 가입자가 서비스를 채택하거나 삭제했을 때 알고리즘을 전혀 재확인 할 필요가 없을 것입니다. 클러스터가 최적화되면 개별 클러스터에 대한 각각의 비율이 다른 클러스터의 속도와 일치하기 때문에 균형을 유지합니다.

알고리즘을 다시 실행 해야하는 유일한 시간은 시대 였고 외부 요인 (예 : 경기 침체/우울증)이 인구 통계 그룹의 행동에 변화를 일으켰습니다.

클러스터링 모델이 아니라 각 시설에서 다루는 주소 수를 포괄 할 수있는 추가 제약 조건으로 세트 커버 위치 모델의 변형을 원한다고 생각합니다. 온라인에서 좋은 설명을 찾을 수는 없습니다. 당신은 볼 수 있습니다 이 페이지, 그러나 그들은 면적 장치를 사용하여 그것을 해결하고 있으며 아마도 유클리드 또는 네트워크 공간에서 그것을 해결하고 싶을 것입니다. Dead Tree 형식으로 무언가를 파고 싶다면 Daskin의 네트워크 4 장 및 개별 위치를 확인하십시오.

간단한 클러스터링 조류에 대한 좋은 조사. 그래도 더 많은 것이 있습니다.http://home.dei.polimi.it/matteucc/clustering/tutorial_html/index.html

아마도 고객의 최소 스패닝 트리 일 것입니다. 프리즈 또는 크루 스칼 무게를 위해 주택 사이의 거리를 가진 MST를 얻기 위해.

나는 생물 정보학에 적용되는이 문제에 대한 꽤 새로운 접근법을 알고 있지만, 어떤 종류의 클러스터링 문제에도 유효합니다. 확실히 가장 간단한 솔루션은 아니지만 제가 생각하는 솔루션은 매우 흥미 롭습니다. 기본 전제는 클러스터링에는 여러 목표가 포함된다는 것입니다. 클러스터 수를 최소화하려는 사람의 경우, 삼판 솔루션은 모든 데이터와 함께 단일 클러스터입니다. 두 번째 표준 목표는 클러스터 내의 분산량을 최소화하는 것입니다. 사소한 솔루션은 각각 단일 데이터 포인트 만있는 많은 클러스터입니다. 이 두 가지 목표를 모두 포함시키고 트레이드 오프를 최적화하려고 할 때 흥미로운 솔루션이 나옵니다.

제안 된 접근법의 핵심은 memetic 알고리즘 이는 Steve가 언급 한 유전자 알고리즘과 비슷하지만 솔루션 공간을 잘 탐색 할뿐만 아니라 흥미로운 영역, 즉 솔루션에 집중할 수있는 능력도 있습니다. 최소한이 주제에 관한 논문 중 일부를 memetic 알고리즘이 경고의 단어이지만 경고의 단어이기 때문에이 주제에 대한 일부 논문을 읽는 것이 좋습니다. 그것은 당신이 이기적인 유전자를 읽게 할 수 있고 나는 그것이 좋은 일인지 여부를 여전히 결정하지 않았을 수도 있습니다 ... 알고리즘이 당신에게 관심이 없다면, 당신은 형식이 요구되는대로 문제를 시도하고 소스를 사용할 수 있습니다. 제공된 코드. 관련 논문과 코드는 여기에서 찾을 수 있습니다. 다중 목표 클러스터링

이것은 문제와 직접 관련이있는 것이 아니라, 내가 들었던 것과 이것이 당신이 가지고있는 경로 계획 문제라면 고려해야 할 것입니다. 이는 각 드라이버에 할당 된 세트 내에서 주소의 순서에 영향을 미칩니다.

UPS에는 배달 사람들이 따라야 할 최적의 경로를 생성하는 소프트웨어가 있습니다. 소프트웨어는 경로에서 취한 우회전 수를 최대화하려고합니다. 이것은 배송에 많은 시간을 절약합니다.

미국에 살지 않는 사람들에게는이 작업을 수행하는 이유가 즉시 분명하지 않을 수 있습니다. 미국에서는 사람들이 도로의 오른쪽으로 운전하므로 우회전을 할 때 빛이 녹색이라면 다가오는 교통을 기다릴 필요가 없습니다. 또한 미국에서는 붉은 빛으로 우회전 할 때 (보통) 가기 전에 녹색을 기다릴 필요가 없습니다. 항상 우회전하면 조명을 기다릴 필요가 없습니다.

여기에 대한 기사가 있습니다.http://abcnews.go.com/wnt/story?id=3005890

이전 클러스터를 클러스터링 기능으로 사용하여 K 수단 또는 예상 최대화가 가능한 한 변경되지 않도록 할 수 있습니다. 각 클러스터가 같은 양의 항목을 갖도록하는 것은 약간 까다로워 보입니다. 나는 K를 수행하여 포스트 클러스터링 단계로 수행하는 방법을 생각하고 일이 균형을 잡을 때까지 몇 가지 점을 뒤섞 으면서 매우 효율적으로 보이지는 않습니다.

보너스 포인트를 얻지 못하는 사소한 답변 :

각 주소에 대해 1 명의 배달원.

  • 당신은 거리 주소 세트가 있으며, 각 주소는 지오 코딩되어 있습니다.
    • 각 클러스터가 배달 담당자에게 할당되도록 주소를 클러스터링하려고합니다.
    • 배달원 또는 클러스터의 수는 고정되어 있지 않습니다. 필요한 경우 항상 더 많은 배달원을 고용하거나 해고 할 수 있습니다.
    • 각 클러스터에는 거의 같은 수의 주소가 있어야합니다. 그러나 클러스터의 주소가 더 많이 퍼지면 클러스터의 주소가 적을 수 있습니다. (다른 방법으로 Worded : 각 클러스터가 최대 주소 수가 포함 된 최소 클러스터 수와 클러스터 내의 주소는 최대 거리로 분리되어야합니다.)
    • 보너스 포인트의 경우 데이터 세트가 변경되거나 (주소가 추가 또는 제거 됨) 알고리즘이 다시 실행되면 클러스터가 가능한 한 변경되지 않은 상태로 유지되면 좋을 것입니다 (예 : 간단한 K- 평균 클러스터링을 배제합니다. 본질적으로 무작위). 그렇지 않으면 배달자가 미쳐 질 것입니다.

언급 된 바와 같이 차량 라우팅 문제는 아마도 더 적합 할 것입니다 ... 클러스터링을 염두에두고 엄격하게 설계되지는 않지만 가장 가까운 주소를 기반으로 할당하도록 최적화합니다. 따라서 클러스터는 실제로 권장 경로가됩니다.

최대의 배달자를 제공하고 최적의 솔루션에 도달하려고 시도하면 필요한 최소를 알려주십시오. 이것은 지점 2를 다룹니다.

방문 할 주소 수에 제한을 제공하여 동일한 수의 주소를 얻을 수 있으며, 기본적으로 주식 값 (현재는 캡처 된 차량 라우팅 문제)을 할당합니다.

배달원이 작동하는 시간 창 또는 시간을 추가하면 주소가 더 많이 퍼지면 부하를 줄입니다 (이제 시간 창에 대한 캡처 된 차량 라우팅 문제).

가장 가까운 이웃 알고리즘을 사용하는 경우 매번 동일한 결과를 얻을 수 있으므로 단일 주소를 제거하면 최종 결과에 너무 큰 영향을 미치지 않으므로 마지막 지점을 처리해야합니다.

나는 실제로 C# 클래스 라이브러리에서 이와 같은 것을 달성하기 위해 노력하고 있으며, 아마도 어리석은 방어력이 없지만 내려갈 수있는 가장 좋은 경로라고 생각합니다.

나는 이것이 반드시 대략 같은 크기의 클러스터를 제공 할 필요는 없다는 것을 인정합니다.

데이터 클러스터링에서 최신 기술 중 하나는 증거 축적입니다. (Fred and Jain, 2005) 당신이하는 일은 :

N 패턴의 데이터 세트가 주어졌습니다.

  1. K-Means와 같은 알고리즘을 K 범위에서 사용하십시오. 또는 다른 알고리즘 세트를 사용하면 목표는 파티션 앙상블을 생성하는 것입니다.

  2. 크기 nx n의 공동 연관 행렬 C를 만듭니다.

  3. 앙상블의 각 파티션 P에 대해 :
    3.1 공동 연관 행렬 업데이트 : p의 동일한 클러스터에 속하는 각 패턴 쌍 (i, j)에 대해 c (i, j) = c (i, j) + 1/n.

  4. 단일 링크와 같은 클러스터링 조류를 사용하고 Matrix C를 근접 측정으로 적용하십시오. 단일 링크는 가장 긴 수명으로 클러스터링을 선택하는 결과로 덴드로 그램을 제공합니다.

관심이 있으시면 SL 및 K- 평균에 대한 설명을 제공하겠습니다.

기본 알고리즘을 사용하여 사는 위치에 따라 첫 번째 종이 보이 경로 세트와 구독자의 현재 위치를 만듭니다.

PaperBoys가있는 경우 :

  • 추가 : 그들은 새로운 사람이 사는 곳과 같은 일반 지역에서 일하는 하나 이상의 종이 보이에서 위치를 가져옵니다.
  • 제거 : 그의 위치는 다른 종이 보이에게 주어지며, 경로에 가장 가까운 위치를 사용합니다.

위치는 다음과 같습니다.

  • 추가 : 동일하게 위치가 가장 가까운 경로에 추가됩니다.
  • 제거 : 그 소년의 길에서 방금 제거되었습니다.

4 분의 1이되면 모든 것을 다시 계산하고 모든 경로를 변경할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top