Java 最小成本算法&x2B;一般图的最大匹配
我有一个由节点和边组成的数据集。 节点代表人,边代表人与人之间的关系,每个节点都有一个使用欧几里德距离计算的代价 现在,我希望通过它们各自的边将这些节点匹配在一起,其中只有一个约束:Java 最小成本算法&x2B;一般图的最大匹配,java,c#,algorithm,graph,graph-theory,Java,C#,Algorithm,Graph,Graph Theory,我有一个由节点和边组成的数据集。 节点代表人,边代表人与人之间的关系,每个节点都有一个使用欧几里德距离计算的代价 现在,我希望通过它们各自的边将这些节点匹配在一起,其中只有一个约束: 任何节点只能与单个其他节点匹配 现在我们知道我在一个普通的图中工作,理论上每个节点都可以与数据集中的任何节点匹配,只要它们之间有一条边 我想做的是找到最大匹配和总成本最低的解决方案 Node A Node B Node C Node D - Edge 1: Start: End Cost
- 任何节点只能与单个其他节点匹配
Node A
Node B
Node C
Node D
- Edge 1:
Start: End Cost
Node A Node B 0.5
- Edge 2:
Start: End Cost
Node B Node C 1
- Edge 3:
Start: End Cost
Node C Node D 0.5
- Edge 2:
Start: End Cost
Node D Node A 1
该问题的解决方案如下:
- 指定边1和边3,因为这是最大匹配量(在本例中,显然只有2个解决方案,但可能有大量分支边指向其他节点)
- 边1和边3是指定的,因为它是具有最大匹配量和最小总体成本(1)的解决方案
- 构建一个新的图,其中两个顶点之间有一条边,如果您可以通过首先遍历匹配中的边,然后遍历不匹配的边,从u到v
- 在此图中,尝试查找从未匹配顶点到具有未匹配邻居(即原始图中的邻居)的匹配顶点的路径
- 如果行走是一条路径,则您有一条交替的路径,并且已完成
- 如果没有,则行走不止一次地使用某个顶点。您可以删除两次访问该顶点之间的行走部分,然后获得一个新图形(删除部分顶点)。在这个新图形中,您必须再次执行整个搜索,如果您在新图形中找到一条交替路径,则可以“提升”将其转换为原始图形的交替路径
加权版本(欧氏距离),EDMONDS算法可以处理更复杂的权重,提供了C++实现和伴随的文件,这也可以用于未加权的情况,所以使用这个实现可能是个好主意。(即使它不在java中,也应该有某种方式与之交互)
因为你的权重是基于欧几里德距离的,所以这种情况下可能会有一个专门的算法,但是我上面提到的更通用的版本也可以工作,并且可以实现它。你所说的最大匹配是什么意思?答案很好。你知道加权版本是建立在现有最大匹配之上的吗ing,还是必须直接在现有算法中实现?您是否愿意在最适合您的平台上通过IM讨论这一问题?