java如何平衡图形中的循环?
考虑此图:
第二个图像(括号中带有权重)是“平衡的”,即每个节点向其他节点发送正确的权重,并且结束节点与开始节点具有相同的权重
现在假设我的图是空的(边知道要发送给其他节点的权重百分比,但图中还没有权重)。如果我将开始节点的权重设置为20,如何使结束图如第二幅图所示保持平衡?在我看来,我应该递归地更新图表,直到每个节点中的权重保持不变,但这是最好的方法吗
编辑:下面是我正在进行的项目中与这个问题相关的Java代码,如果它能帮助别人的话。我知道这段代码中没有关于某些函数的信息,但你应该了解全局
注意:许多变量名是法语的,下面是其中一些变量名的快速翻译:
nb_站点:节点数量
m_ListStations:所有节点的列表
ID_ARRIVEE:开始节点的ID(图中的“开始”)
研究:图表
poids:重量
弧:边缘
// build the distribution matrix
public float[] buildDistribution() {
int nb_stations = m_listeStations.size();
float[] distribution = new float[nb_stations];
Arrays.fill(distribution, 0);
distribution[findIndexStation(findStation(Reseau.ID_ARRIVEE))] = findStation(Reseau.ID_ARRIVEE).getPoids();
return distribution;
}
// build the transition matrix
public float[][] buildTransition() {
int nb_stations = m_listeStations.size();
float[][] transition = new float[nb_stations][nb_stations];
for (float[] ligne : transition) {
Arrays.fill(ligne, 0);
}
for (int i = 0; i < nb_stations; ++i) {
List<Arc> arcsOut = m_listeStations.get(i).getArcsOut();
for (int j = 0; j < arcsOut.size(); ++j) {
transition[i][findIndexStation(arcsOut.get(j).getCible())] = arcsOut.get(j).getPoidsRelatif();
}
}
int indexArrivee = findIndexStation(findStation(Reseau.ID_ARRIVEE));
transition[indexArrivee][indexArrivee] = 1; // arrivée continuelle
return transition;
}
// this function does one iteration of distribution*transition to converge toward the real weights
public float[] convergeDistribution(float[] in_distribution, float[][] in_transition) {
int nb_stations = m_listeStations.size();
float[] converge = new float[nb_stations];
Arrays.fill(converge, 0);
for (int i = 0; i < nb_stations; ++i) {
for (int j = 0; j < nb_stations; ++j) {
converge[i] += in_distribution[j] * in_transition[j][i];
}
}
return converge;
}
# 1 楼答案
你的图形就是所谓的Markov chain。你想要找到的是马尔可夫链的stationary distribution
如果p是你的转移矩阵,平稳分布x是方程x*p=x的解
讨论了收敛速度here
一旦你有了平稳分布,你就可以很容易地解决你描述的问题。根据平稳分布和转移矩阵,只需在一个节点/边上固定权重,然后所有其他节点/边的权重都与之成比例