当前位置: 首页 > article >正文

一种非完全图下的TSP求解算法

旅行商问题(Traveling Salesman Problem,简称TSP)是组合优化中的一个经典问题,就是给定一组城市和城市之间的距离,找到一条最短路径使得每个城市只被访问一次后返回到起点。

一些传统的解法都是基于完全图的,我在网上也很少找到非完全图的解法,非完全图应该在实际应用中会更实用,这里我简单实现一个算法。

算法细节

与完全图的差异

非完全图意味着某些节点之间不相连,这样求解时就需要考虑这样情况,不能直接假设两个节点直连。

图的预处理

最开始要对图进行预处理,这里我们针对于该图使用Kruskal算法构建一颗最小生成树,之后针对该树进行分支删减,以达到最终路线是一个环路。

我这里使用的输入的形式是邻接矩阵,假设路线图是这样的:

对应的邻接矩阵则是

using GraphVec = std::vector<std::vector<int>>;
GraphVec graph_8 = {
        {0, 3, 1, 1, 1, 0, 0, 0},
        {3, 0, 1, 0, 0, 1, 0, 0},
        {1, 1, 0, 1, 0, 0, 2, 0},
        {1, 0, 1, 0, 0, 0, 0, 1},
        {1, 0, 0, 0, 0, 1, 1, 1},
        {0, 1, 0, 0, 1, 0, 0, 1},
        {0, 0, 2, 0, 1, 0, 0, 1},
        {0, 0, 0, 1, 1, 1, 1, 0},
    };

最开始我们先来看下使用到的数据结构:

struct Edge{
    Edge() = default;
    Edge(int s, int e, int w) :
        start(s),
        end(e),
        weight(w) {}

    int start = -1;
    int end = -1;
    int weight = -1;
};

这里很简单,我就是将两个节点的边做了一下抽象

然后简单看一下最小生成树的构建过程:

using TreeDeque = std::deque<Edge>;
TreeDeque makeMSTByKruskal(const GraphVec& graph) {
    std::priority_queue<Edge, std::vector<Edge>, decltype(compare)> queue(compare);
    for (int i = 0; i < graph.size(); ++i) {
        for (int j = 0; j < graph[0].size(); ++j) {
            if (i < j && graph[i][j] > 0) {
                queue.emplace(i, j, graph[i][j]);
            }
        }
    }

    std::set<int> visited;
    TreeDeque tree;
    while (!queue.empty()) {
        auto edge = queue.top();
        queue.pop();

        if (visited.find(edge.start) != visited.end() && visited.find(edge.end) != visited.end()) {
            continue;
        }

        visited.insert(edge.start);
        visited.insert(edge.end);
        tree.push_back(edge);
    }

    return tree;
}

这里使


http://www.kler.cn/a/541922.html

相关文章:

  • 如何通过腾讯 ima.copilot 训练自己的知识库
  • 交叉编译工具链下载和使用
  • RocketMQ、RabbitMQ、Kafka 的底层实现、功能异同、应用场景及技术选型分析
  • 【hive】记一次hiveserver内存溢出排查,线程池未正确关闭导致
  • KITE提示词框架:引导大语言模型的高效新工具
  • 【R】Dijkstra算法求最短路径
  • 记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-效果展示(4)
  • 现代C++多线程基础 -忆苦思甜pthread_mutex
  • 外贸网站源码 助力企业抢占蛇年市场先机!
  • 使用redis实现 令牌桶算法 漏桶算法
  • TCP传输层协议
  • Terraform 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案
  • 【使用 rimraf 闪电删除 node_modules 目录】
  • 嵌入式接单/派单网站
  • Cursor 编辑器详细介绍与使用
  • 负载测试和压力测试的原理分别是什么
  • Redis 集群工作原理? 如何通信?MOVED和ASKED 有什么区别
  • RabbitMQ消息队列 发送和接受
  • CP AUTOSAR标准之IOHardwareAbstraction(AUTOSAR_SWS_IOHardwareAbstraction)(更新中……)
  • 洛必达法则的证明与重要条件
  • DaDianNao:一种无主存储器的多核加速器
  • 机器学习算法的种类(机器学习类型的比较)
  • FPGA开发技能(10)热电偶测温ADS1118方案
  • Docker Desktop 镜像源配置
  • Spring Boot部署到服务器
  • 物联网智能语音控制灯光系统设计与实现