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

算法 |【实验5.2】1-深度优先搜索暴力求解旅行商问题

文章目录

  • 使用深度优先搜索暴力求解旅行商问题
    • 1.题目描述
    • 2.问题分析与算法设计思路
    • 3.算法实现
    • 4.运行结果
    • 5.算法分析

使用深度优先搜索暴力求解旅行商问题

1.题目描述

商品推销员要去n个城市推销商品,城市从1至n编号,任意两个城市间有一定距离,该推销员从城市1出发,需要经过所有城市并回到城市1,求最短总路径长度。

把旅行商问题看作一种排列问题,不难想出,这道题的蛮力做法即穷举所有路线。选定起点有n种选法,选定起点后的下一个目的地有(n- 1)种选择方法,再下一个是(n-2)……总共有n!种排列方法,算法复杂度达到O(n!)。

一个20城市的TSP问题有大约60,000,000,000,000,000个可能解。如果一台计算机每秒搜索1000个解,需要大约1902587年才能搜索完所有的解。

因此蛮力法只能解决小规模问题。

在这里插入图片描述

2.问题分析与算法设计思路

总体思路: 深度优先搜索,递归

算法过程:

  1. 使用二维数组 dis 存放任意两个城市之间的距离

  2. 从城市 1 开始

  3. 使用一个循环遍历下一个城市的不同选择,且忽略已经走过的城市、不能直接到达的城市

  4. 每次遍历,更新到达当前城市走过的路径长度 len 。

  5. 走过所有城市后,len 再加上当前城市到城市 1 的距离(最后要回到 1 ),保存该条路径的长度。

  6. 在所有路径长度中找出最小值。

小结:

“先规划好思路,然后才开始编写代码”,这句话很早就听到说过了,但是能真正静下心来做到这一点的时候,却是不多。但我感觉,这很有用。

3.算法实现

完整可运行代码,C++实现:

//深度优先搜索求解旅行商问题
#include<iostream>
using namespace std;

const int Max = 10;
int len_min = 999;//最短总路径长度

int road[Max] = {1};//存放路径 
int it_r = 1;

//搜索求解
//参数dis:城市距离,now:所在城市,have:走过城市,
//len:走过路径长度,n:城市总数,num:已走过城市数 
void dfs(int dis[][Max], int now, bool have[], int len, int n, int num){
    //显示路径 
    cout<<"road:";
    for(int i = 0; i < it_r; i++){
        cout<<road[i]<<" ";
    }
    cout<<endl;

    //一条完整路径 
    if(num == n){
        len += dis[now][1];
        if(len < len_min){
            len_min = len;
        }
    }

    //遍历下一个城市 
    for(int i = 2; i <= n; i++){
        //排除已走过、不能到达的城市 
        if(have[i] == true || dis[now][i] == 0){
            continue;
        }
        int len_next = len + dis[now][i];

        have[i] = true;
        road[it_r++] = i;
        dfs(dis, i, have, len_next, n, num+1);
        road[--it_r] = 0;
        have[i] = false;
    }
}

int main(){
    int dis[Max][Max] = {};//任意两城市距离,0表示不能直接到达 
    bool have[Max] = {1};//已走过哪些城市 
    int n = 0;//城市的个数
    int e = 0;//道路的个数

    cin>>n>>e;
    for(int i = 1; i <= e; i++){
        int a = 0, b = 0, x = 0;
        cin>>a>>b>>x;
        dis[a][b] = x;
        dis[b][a] = x;
    } 

    //显示城市距离 
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            cout<<dis[i][j]<<" ";
        }
        cout<<endl;
    }

    dfs(dis, 1, have, 0, n, 1);
    cout<<"最短路径:"<<len_min;
    return 0;
} 

/*
测试数据一 
4 5
1 2 5
1 3 3
1 4 4
2 3 7
2 4 6
*/

4.运行结果

请添加图片描述

5.算法分析

算法的时间复杂度在前面的题目描述中已经讲到了,达到了 o ( n ! ) o(n!) o(n!)

空间复杂度应为 o ( n 2 ) o(n^2) o(n2),因为使用了二维数组来存放城市间距离。


感谢阅读

CSDN话题挑战赛第2期
参赛话题:学习笔记

相关文章:

  • OpenCV-Python学习(2)—— OpenCV 图像的读取和显示
  • Unity技术手册-初识编辑器(上)
  • 基于Java+SpringBoot+vue+elementui图书商城系统设计实现
  • 电子病历结构化之实体识别(附完整项目代码)
  • 手写Spring——bean的扫描、加载和实例化
  • 【Vue】Vue的v-if、v-if-else、v-else-if、v-show的使用
  • 【设计模式】创建型模式:单例模式
  • Sentry、Loki 轻量级日志系统部署及应用
  • Spring Boot 统一功能处理
  • qsort:我很强,了解一下(详解过程)
  • 因为一道题,我把 try-catch-finally 的细节都整理了一遍(1500字)
  • 32、学习 Java 中的注解(参照官方教程)
  • 【第一部分 | HTML】1:揭露HTML的神秘面纱
  • 安装finalshell
  • 怎么找到贵人?
  • 03Go 类型总结
  • fetch 从初识到应用
  • golang中接口赋值与方法集
  • JavaScript 奇技淫巧
  • Js基础——数据类型之Null和Undefined
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PHP的类修饰符与访问修饰符
  • Python 反序列化安全问题(二)
  • python学习笔记-类对象的信息
  • rabbitmq延迟消息示例
  • React组件设计模式(一)
  • 从重复到重用
  • 浮现式设计
  • 聊聊directory traversal attack
  • 前嗅ForeSpider教程:创建模板
  • 我是如何设计 Upload 上传组件的
  • python最赚钱的4个方向,你最心动的是哪个?
  • 选择阿里云数据库HBase版十大理由
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • $ git push -u origin master 推送到远程库出错
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • **PHP分步表单提交思路(分页表单提交)
  • .NET Core 成都线下面基会拉开序幕
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .Net 中Partitioner static与dynamic的性能对比
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /etc/fstab和/etc/mtab的区别
  • @Query中countQuery的介绍
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [ajaxupload] - 上传文件同时附件参数值
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强