分支限界法求解旅行商问题

#include 
#include 
#include 
#include 
#include 
#define NoEdge -1
#define NN 50 // 可执行的最大的顶点个数
using namespace std;
int n;                 // 图的顶点个数
int adjMatrix[NN][NN]; // 图的邻接矩阵
int v[50];             // 最优解
int bestC;             // 最优值
int num = 0;           // 节点序号

/*****************************************************************
* 函数描述: 
数据输入以及内存的初始化
*****void input()
{
    cin >> n; // 输入顶点个数
    int k;
    memset(adjMatrix, NoEdge, sizeof(adjMatrix)); // 邻接矩阵的内存初始化
    cin >> k;                                     // 输入边的个数;
    int p, q, len;
    // 初始化邻接矩阵
    for (int i = 1; i <= k; ++i)
    {
        cin >> p >> q >> len;
        adjMatrix[p][q] = len;
        adjMatrix[q][p] = len;
    }
}

/*****************************************************************
* 函数描述: 格式化打印结果
* 参数描述: res,最优值
*****************************************************************/
void printTravel(int res)
{
    if (res == NoEdge)
        cout << "======= 无法形成回路 =======" << endl;
    else
    {
        cout << "\n======================================\n最短路径为:" << res << endl;
        for (int i = 1; i <= n; i++)
            cout << v[i] << " ---> ";
        cout << v[1];
    }
}

/****************************************************

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分支限界法求解旅行商问题的步骤如下: 1. 确定问题的目标函数和约束条件,即TSP问题的目标是找到一条通过所有城市的最短路径。 2. 采用邻接矩阵表示城市之间的距离。 3. 定义结点的数据结构。每个结点表示一个旅行商的旅行路径,包括已访问的城市、未访问的城市、当前路径长度等信息。 4. 定义结点的比较函数,用于根据当前路径长度进行结点的排序。 5. 使用优先队列维护结点的集合,每次取出当前路径长度最小的结点。 6. 对于每个结点,枚举下一个要访问的城市,计算扩展后的路径长度,并生成新的结点加入优先队列。 7. 不断重复以上步骤,直到找到一条符合要求的最短路径或者优先队列为空。 以下是一个基于C语言的分支限界法求解TSP问题的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #define N 5 int map[N][N] = { {0, 2, 9, 10, 5}, {2, 0, 6, 4, 8}, {9, 6, 0, 7, 6}, {10, 4, 7, 0, 8}, {5, 8, 6, 8, 0} }; typedef struct Node { int path[N]; int len; int visited[N]; } Node; int cmp(const void *a, const void *b) { Node *nodeA = *(Node **)a; Node *nodeB = *(Node **)b; return nodeA->len - nodeB->len; } void printPath(Node *node) { printf("Path: "); for (int i = 0; i < N; i++) { printf("%d ", node->path[i]); } printf("%d\n", node->path[0]); printf("Length: %d\n", node->len); } void solveTSP() { Node start; memset(&start, 0, sizeof(start)); start.path[0] = 0; start.visited[0] = 1; start.len = 0; Node *current = &start; Node *queue[N*N]; int front = 0, rear = 0; queue[rear++] = current; while (front < rear) { current = queue[front++]; if (front >= N*N) { break; } if (current->len >= queue[rear-1]->len) { continue; } for (int i = 1; i < N; i++) { if (current->visited[i] == 0) { Node *node = (Node *)malloc(sizeof(Node)); memcpy(node, current, sizeof(Node)); node->visited[i] = 1; node->path[node->len+1] = i; node->len += map[current->path[node->len]][i]; if (node->len >= queue[rear-1]->len) { free(node); continue; } if (node->len < INT_MAX) { queue[rear++] = node; } if (node->len < queue[0]->len) { qsort(queue, rear, sizeof(Node *), cmp); } } } } printPath(queue[0]); for (int i = 0; i < rear; i++) { free(queue[i]); } } int main() { solveTSP(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值