void Hungarian::Enlarge() { int x, next; do { x = Trace[finish]; next = matchX[x]; matchX[x] = finish; matchY[finish] = x; finish = next; } while (finish != -1); }
时间: 2023-06-16 13:06:13 浏览: 75
这是一个匈牙利算法的扩充操作,用于增广路径。在匈牙利算法中,我们从未匹配的 X 点开始,尝试去匹配它的相邻 Y 点。如果 Y 点没有被匹配,那么我们就找到了一条增广路径。如果 Y 点已经被匹配,那么我们就需要从这个已匹配的 Y 点出发,去寻找另外一个未匹配的 X 点。这个过程中,我们需要记录每个点的匹配情况,以及从起点到当前点的路径,这些信息存储在 matchX 和 matchY 数组中。
当我们找到一条增广路径时,需要执行这个 Enlarge 操作。它的作用是将这条增广路径上所有的 X 点与 Y 点的匹配关系进行调整,使得这条路径上所有的 X 点变成已匹配状态,而原来与这些 X 点匹配的 Y 点变成未匹配状态。具体来说,它的实现过程是从最后一个点开始,沿着路径逆向遍历,将每个 X 点与它的前一个 Y 点交换匹配关系。这样做的效果是,增广路径上的所有 X 点都被匹配,而原来与这些 X 点匹配的 Y 点变成未匹配状态,同时新的 Y 点被匹配,这样就完成了一次增广。
相关问题
void Hungarian::doHungarian() { int x, y; for (x = 0; x < k; x++) { //khởi tạo điểm bắt đầu và kết thúc của 1 đường mở //finish = -1 nghĩa là chưa tìm thấy đường mở start = x; finish = -1; do { FindAugmentingPath(); // tìm đường mở if (finish == -1) // nếu ko tìm được đường mở thì xoay các trọng số cạnh SubX_AddY(); } while (finish == -1); Enlarge();//tăng cặp dựa trên đường mở tìm được } }
这是一个匈牙利算法的实现代码,用于解决二分图最大匹配问题。其大致思路是按顺序遍历二分图的左侧节点,对每个节点进行增广路径查找,如果找到增广路径则进行匹配,否则进行边权重调整,直到所有节点都被匹配为止。其中的函数包括:
- FindAugmentingPath():查找增广路径。
- SubX_AddY():调整边权重。
- Enlarge():根据找到的增广路径进行匹配。
如果您需要更详细的解释,请让我知道。
double Hungarian::Solve(vector<vector<double>>& DistMatrix, vector<int>& Assignment) { Enter(DistMatrix, Assignment); Init(); doHungarian(); //update assignment for (int x = 0; x < m; x++) { Assignment.push_back(matchX[x]); } for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { DistMatrix[x][y] = c[x][y]; if (c[x][y] == maxC) DistMatrix[x][y] = 0.f; } } float cost = 0.f; for (int x = 0; x < m; x++) { int y = matchX[x]; if (c[x][y] < maxC) { cost += c[x][y]; } } return cost; }
这段代码实现的是匈牙利算法,用于解决二分图最大权完美匹配问题。它的输入参数包括一个距离矩阵和一个空的分配数组,输出结果为最小权匹配的权值。
其中,Enter函数用于初始化距离矩阵和分配数组,Init函数用于初始化匈牙利算法中的相关数据结构,doHungarian函数用于执行匈牙利算法,得到最小权匹配。最后,更新分配数组和距离矩阵,计算最小权匹配的权值并返回。
需要注意的是,这段代码中的变量命名可能存在一些问题,如变量m和n没有明确定义,而是需要从距离矩阵中获取行数和列数。
阅读全文