我正在尝试使用adjacency matrix确定下一跳路由表。每个节点都知道该拓扑的完整邻接矩阵。我发现之前的帖子解释了如何做到这一点,但是,我不明白为什么我的错了。我有几个辅助函数,但它们的名称很直观,所以你可以跳到“开始路由计算”。
我使用邻接矩阵作为成本矩阵,它只有0和1。该算法似乎不会因某种原因而停止。根据节点,队列卡在1,3或5的大小上。
变量rank保存当前节点索引,它在OpenMPI中运行,因此每个进程(rank / node)独立地运行这个代码块。变量矩阵保持邻接矩阵。 这是我正在使用的拓扑:
0
/ \
1 2
/ / | \ / \
3 4 5 6 7 8
/ \ |
9 10 11
邻接矩阵: (如节点3所示,其中一个不会停止);
1 1 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 1 1 0 0 0 0 0
1 0 0 0 0 0 0 1 1 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 1 1 0
0 1 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 1
0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0
到目前为止我的代码:
int isFull(int *d, int size) {
int i;
for(i = 0; i < size; i++) {
if(d[i] == INF) {
return -1;
}
}
return 1;
}
int vecSize(int *d, int size) {
int counter = 0;
int i;
for(i = 0; i < size; i++) {
if(d[i] != INF) {
counter++;
}
}
return counter;
}
bool List_contains(std::list<int > l, int val) {
for (std::list<int>::const_iterator iterator = l.begin(), end = l.end(); iterator != end; ++iterator) {
if (*iterator == val) {
return true;
}
}
return false;
}
int minimum (int a, int b) {
if (a < b) {
return a;
}
return b;
}
/* matrix is the complete adjacency matrix */
/* starting routing calculations
*
*/
std::list <int > visited;
int *dist;
dist = (int*) calloc(size, sizeof(int));
visited.push_back(rank);
//debug
//printf("debug not empty %d\n", isFull(dist, size));
for(i = 0; i < size; i++) {
if(matrix[rank][i] == 1) {
dist[i] = 1;
} else {
dist[i] = INF;
}
}
dist[rank] = 0;
int min;
while(isFull(dist,size) < 0) {
if(rank == 3)
printf("node - %d -debug -- list size %d\n",rank, vecSize(dist, size));
//get the first node that isn't contained
for(i = 0; i < size; i++) {
if (!List_contains(visited, i) && min != rank) {
min = i;
break;
}
}
for(i = 0; i < size; i++) {
if((min >= dist[i]) && (!List_contains(visited, i)) && min != rank) {
min = i;
}
}
if(rank == 3)
printf("min = %d\n", min);
visited.push_back(min);
for(i = 0; i < size; i++) {
if((matrix[min][i] == 1) && (!List_contains(visited, i))) {
dist[i] = minimum (dist[i], dist[min] + matrix[min][i]);
}
}
if(rank == 3)
//printf("rank %d dist = \n", rank);
for(i = 0; i < size; i++) {
if(rank == 3)
printf("%d ", dist[i]);
}
if(rank == 3)
printf("\n");
}
/*
* finished routing calculations.
*/
这是迄今为止的输出:http://pastebin.com/x5wjKkyn
有人能指出我做错了什么吗?谢谢 ! 稍后编辑:从技术上讲,算法提供了正确的距离,它只是不会停止。 (输出完全来自节点0)
稍后编辑:似乎程序没有停止,因为对于某些节点,算法没有完成。