C語言 分支界限法求解旅行商 TSP 問題

2022-04-09 04:52:26 字數 2429 閱讀 1165

1.**:

#include #include #define noedge           1000

struct minheapnode

;int n; //圖g的頂點數

int **a; //圖g的鄰接矩陣

//int noedge; //圖g的無邊標記

int cc; //當前費用

int bestc; //當前最小費用

minheapnode* head = 0; /*堆頭*/

minheapnode* lq = 0; /*堆第乙個元素*/

minheapnode* fq = 0; /*堆最後乙個元素*/

int deletemin(minheapnode*&e)

int insert(minheapnode* hn)

else

else

tmp = tmp->next;

}} if(tmp == null)

}return 0;

}int bbtsp(int v)

minheapnode *e = 0;

e = (minheapnode*)malloc(sizeof(minheapnode));

e->x = new int[n];

// e.x=new int[n];

for(int i = 0; i < n; i++)

e->x[i] = i + 1;

e->s = 0;

e->cc = 0;

e->rcost = minsum;

e->next = 0; //初始化當前擴充套件節點

int bestc = noedge; /*記錄當前最小值*/

//搜尋排列空間樹

while(e->s < n - 1)

else

free(e->x);//該頁節點不滿足條件捨棄擴充套件結點

}else

}free(e->x);

}//完成結點擴充套件

deletemin(e);//取下一擴充套件結點

if(e == null)

break; //堆已空

} if(bestc == noedge)

return noedge;//無迴路

for(int i = 0; i < n; i++)

v[i + 1] = e->x[i];//將最優解複製到v[1:n]

while(true)

return bestc;

}int main()

//fscanf(in, "%d", &n);

n=5;

a = (int**)malloc(sizeof(int*) * (n + 1));

for(i = 1; i <= n; i++)

// for(i = 1; i <= n; i++)

// for(int j = 1; j <= n; j++)

// //fscanf(in, "%d", &a[i][j]);

// a[i][j]=1;

a[1][1]=0;

a[1][2]=5;

a[1][3]=8;

a[1][4]=5;

a[1][5]=4;

a[2][1]=5;

a[2][2]=0;

a[2][3]=5;

a[2][4]=6;

a[2][5]=3;

a[3][1]=8;

a[3][2]=5;

a[3][3]=0;

a[3][4]=5;

a[3][5]=4;

a[4][1]=5;

a[4][2]=6;

a[4][3]=6;

a[4][4]=0;

a[4][5]=3;

a[5][1]=4;

a[5][2]=3;

a[5][3]=4;

a[5][4]=3;

a[5][5]=0;

// prev = (int*)malloc(sizeof(int)*(n+1)) ;

int*v = (int*)malloc(sizeof(int) * (n + 1));// maxloading(w , c , n) ;

for(i = 1; i <= n; i++)

v[i] = 0;

bestc = bbtsp(v);

printf("\n");

for(i = 1; i <= n; i++)

fprintf(stdout, "%d\t", v[i]);

fprintf(stdout, "\n");

fprintf(stdout, "%d\n", bestc);

return 0;

}

2.輸出結果

1->2->5->3->4->1

距離:22

分支界限演算法 旅行商問題2

假期 2020.01 22見回溯演算法 旅行商問題1 此篇採用分支界限演算法解決該問題,相比較前一篇的回溯演算法 旅行商問題1,此處使用bfs搜尋加優先佇列的方式。注 優先佇列容器與佇列一樣,只能從隊尾插入元素,從隊首刪除元素。但是它有乙個特性,就是佇列中最大的元素總是位於隊首,所以出隊時,並非按照...

回溯法 分支限界法解決旅行商TSP問題

分支限界法解tsp問題 廣度優先 結果分析 旅行商從駐地出發,經過每個需要訪問的城市一次且只有一次,並最終返回出發點。如何安排路線,使旅行總路程最短?即求解最短哈密頓迴路。以深度優先的方式,從根節點開始,依次擴充套件樹節點,直到達到葉節點 搜尋過程中動態產生解空間 最優路徑 int x num 1 ...

旅行商問題 tsp 之分支定界法

做了乙個晚上的題,真是弱爆了.其實就是深搜最短路,不過加了乙個upper bound用來剪枝,因為資料比較小可以過!深搜還是要熟悉啊!1 include 2 3using namespace std 45 double graph 25 25 6 int vis 25 7 double a 25 8...