This is similar to this post, but actually more complicated. I have two lists in that question, and I want to get a pair. But in here, I want to get a pair from one list (even points). Given these 20
points:
SeedRandom[1]
pts = RandomInteger[20, {20, 2}]
{{5,0},{7,0},{2,3},{0,0},{16,14},{3,8},{19,5},{18,16},{12,0},{19,4},{7,3},{0,4},{20,3},{5,12},{19,8},{11,2},{3,10},{4,2},{17,11},{15,6}}
I can use FindIndependentEdgeSet
to get one pair like this:
g = CompleteGraph[20];
List @@@ FindIndependentEdgeSet[VertexReplace[g, Thread[VertexList[g] -> pts]]]
{{{5,0},{7,0}},{{2,3},{3,8}},{{0,0},{16,14}},{{19,5},{4,2}},{{18,16},{3,10}},{{12,0},{7,3}},{{19,4},{11,2}},{{0,4},{20,3}},{{5,12},{19,8}},{{17,11},{15,6}}}
The total distance is
Total[EuclideanDistance @@@ pair] // N
113.859
But I'm sure it is not the smallest pair. Actually, I think I need a FindIndependentEdgeSet
of edge weight version, but it seems the FindIndependentEdgeSet
regards weighted graph as unweighted directly. Can anyone give me advice? Of course, I'm happy to know other methods that can do this which aren't based on Graph Theory.
This post related this question.
SeedRandom[1]
to be 30.8036. This takes ~100s to run for the 20 point case and scales badly (Binomial[2 n, n]
)... $\endgroup$