一个分支限界的旅行商求解

  图论作业,分支限界的旅行商算法。印象和以前写的旅行商分支限界有点不一样,记录下。

 1:对边的权值排序。

 2:边入栈(如果满足限界等条件)。

 3:边退栈(不能再入栈时)。

#include <iostream>

#include <algorithm>

using namespace std;

 

const int maxNumber=1000000;

 

class Edge

{

public:

int weight;

int v1,v2;

};

 

bool cmp(Edge e1,Edge e2)

{

return e1.weight<e2.weight;

}

 

int Graph[30][30];

Edge edgeArr[900];

int countVertex[900];

int bestEdgeIndex[900];

int edgeNum;

int n;

 

void TravelMan(int k,int currCost,int &bestCost,int chosenEdgeNum,int* edgeIndex)//第k条边

{

if(k>=edgeNum)return;

if((edgeNum-k)<(n-chosenEdgeNum))return;

if(edgeArr[k].weight+currCost>bestCost)return;

 

while( (countVertex[edgeArr[k].v1]>1||countVertex[edgeArr[k].v2]>1) )

{

k++;

if( k==edgeNum || (edgeArr[k].weight+currCost>bestCost) )return;

}

 

TravelMan(k+1,currCost,bestCost,chosenEdgeNum,edgeIndex);

 

currCost+=edgeArr[k].weight;

countVertex[edgeArr[k].v1]++;

countVertex[edgeArr[k].v2]++;

edgeIndex[chosenEdgeNum]=k;

chosenEdgeNum++;

if(chosenEdgeNum==n)

{

if(currCost<bestCost)

{

bestCost=currCost;

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

bestEdgeIndex[i]=edgeIndex[i];

}

countVertex[edgeArr[k].v1]--;

   countVertex[edgeArr[k].v2]--;

return;

}

 

TravelMan(k+1,currCost,bestCost,chosenEdgeNum,edgeIndex);

 

countVertex[edgeArr[k].v1]--;

countVertex[edgeArr[k].v2]--;

 

return ;

}

 

 

int main()

{

cin>>n;

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

{

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

cin>>Graph[i][j];

}

 

edgeNum=0;

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

{

countVertex[i]=0;

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

{

edgeArr[edgeNum].v1=i;

edgeArr[edgeNum].v2=j;

edgeArr[edgeNum].weight=Graph[i][j];

bestEdgeIndex[edgeNum]=-1;//入选哈夫谩回路的边的序号

edgeNum++;

}

}

 

sort(edgeArr,edgeArr+edgeNum,cmp);

 

int bestCost=maxNumber;

int edgeIndex[1000];

TravelMan(0,0,bestCost,0,edgeIndex);

 

cout<<"The min cost is:"<<bestCost<<endl;

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

{

cout<<edgeArr[bestEdgeIndex[i]].v1<<" "<<edgeArr[bestEdgeIndex[i]].v2<<endl;

}

return 0;

}

 

测试数据

5

0 42 33 52 29

42 0 26 38 49

33 26 0 34 27

52 38 34 0 35

29 49 27 35 0

 

答案是161

分支限界法是一种用于解决组合优化问题的搜索算法,常用于求解旅行问题(Traveling Salesman Problem,TSP)。在这个问题中,目标是最短路径,即找到访问每个城市一次并返回起点的最短路线。以下是使用C语言实现的一个简化版本的分支限界求解TSP的基本步骤: ```c #include <stdio.h> #include <stdlib.h> // 假设城市数组长度为n typedef struct { int city; int distance_to_last_city; // 到前一个城市的距离 } Node; // 比较节点的距离 int compare_nodes(Node a, Node b) { return a.distance_to_last_city < b.distance_to_last_city; } // 初始化节点数组 void init_tsp(int cities[], int n, Node nodes[]) { for (int i = 0; i < n; i++) { nodes[i].city = cities[i]; nodes[i].distance_to_last_city = INT_MAX; // 初始距离设置为最大值 } nodes[0].distance_to_last_city = 0; // 起点到自身的距离为0 } // 求解TSP递归函数 void tsp_brute_force(Node* start, Node cities[], int n, int* best_path, int* best_distance) { if (n == 1) { // 基线条件:只剩下一个城市,直接返回 *best_distance = cities[start->city].distance_to_last_city; *best_path = start->city; return; } int min_distance = INT_MAX; int min_index; for (int i = 1; i < n; i++) { // 遍历所有后续城市 Node current = cities[start->city]; current.distance_to_last_city = cities[i].distance_to_last_city + cities[i].distance_to_start; if (current.distance_to_last_city < min_distance) { min_distance = current.distance_to_last_city; min_index = i; } } Node temp = cities[start->city]; // 保存当前最优解 cities[start->city] = cities[min_index]; // 更新起点城市 tsp_brute_force(&cities[min_index], cities, n, best_path, best_distance); cities[start->city] = temp; // 回溯,恢复原始顺序 // 更新全局最优解 if (*best_distance > min_distance) { *best_distance = min_distance; *best_path = start->city; } } // 主函数入口 int main() { // 输入城市列表和距离矩阵等信息... int cities[] = {1, 2, 3, 4}; int n = sizeof(cities)/sizeof(cities[0]); Node nodes[n]; // 初始化并调用算法 init_tsp(cities, n, nodes); int best_path[100], best_distance = INT_MAX; tsp_brute_force(&nodes[0], nodes, n, &best_path[0], &best_distance); printf("Best path: "); for (int i = 0; i < n; i++) { printf("%d -> ", best_path[i]); } printf("back to %d\n", best_path[0]); // 回到起点 printf("Minimum distance: %d\n", best_distance); return 0; } ``` 请注意,这只是一个非常基础的实现,实际应用中可能需要处理更复杂的情况,如动态规划、剪枝策略以及更有效的数据结构。此外,TSP是一个NP完全问题,对于大规模数据可能会有性能瓶颈。在实际项目中,可以考虑使用启发式算法如遗传算法、蚁群算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值