다음 헝가리어 알고리즘 구현을 사용하려고합니다 : http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=hungarianAlgorithm.상호 쌍이있는 헝가리 알고리즘?
이 알고리즘을 수정하여 세트를 자체적으로 페어링 할 수 있기를 바랍니다. 즉, "b"에 "a"가 지정되면 "a"에도 "b"가 할당됩니다. 내가 가진 유일한 아이디어는 다음을 변경하는 것입니다. 다음
for (int cx = x, cy = y, ty; cx != -2; cx = prv[cx], cy = ty)
{
yx[cy] = cx;
xy[cx] = cy;
}
:
for (int cx = x, cy = y, ty; cx != -2; cx = prv[cx], cy = ty)
{
yx[cy] = cx; yx[cx]=cy;
xy[cx] = cy; xy[cy]=cx;
}
알고리즘은 항상 짝 상호있는 경로를 확인하는 그래서. 그러나, 나는 이것이 틀렸다는 것을 오히려 확신합니다. 코드는 대개 segfault입니다.
if (max_match == n)
을 if (max_match >= n-1)
과 같은 더 가혹한 제약 조건으로 변경하여 문제를 해결해 보았습니다. 그래야 알고리즘이 하위 완벽하게 일치하는 콘텐츠가됩니다. 이것은 때로는 효과가 있으며 때가되면 원하는대로 상호 쌍을 생성하지만 일부 꼭지점은 쌍을 이루지 않게됩니다. 여전히 세분화 오류가 있습니다.
이 문제를 해결할 방법이 있습니까? 이에 대한 다른 적합한 알고리즘이 있습니까?
헝가리 알고리즘은 가중치가있는 2 부분 일치를 계산합니다. 당신은 다른 것을하려고 노력하고 있으며 그것이 무엇인지 완전히 모릅니다. – tmyklebu
나는 아직도 그런 매칭을하려고 노력 중이다. 예를 들어, 6 명의 사람들이 a, b, c, d, e, f가 있고 각 가능한 쌍의 "비용"이 주어지면 최소한 여섯 명을 세 쌍으로 나누는 방법을 찾고 싶습니다. 비용. 그것은 두 개의 동등한 집합을 가진 가중치가있는 두 부분 일치와 같습니다. 쌍이 서로 가깝다는 제약 조건이 있습니다. 이것에 대한 다른 알고리즘이 있습니까? –
그건 두 부분이 아닌 일치입니다. 예, 효율적인 알고리즘이 있지만 두 부분 일치가 아닙니다. – tmyklebu