【算法设计与分析】实验8:分支限界—TSP问题

目录

一、实验目的

二、实验环境

三、实验内容

四、核心代码

五、记录与处理

六、思考与总结

七、完整报告和成果文件提取链接

一、实验目的

        掌握分支界限求解问题的思想;针对不同的问题,能够利用分支界限法进行问题拆分和求解以及时间复杂度分析,并利用JAVA/C/C++等编程语言将算法转换为对应的程序上机运行(语言不限)。

二、实验环境

        1、机房电脑  Window11

        2、Eclipse/devc++

三、实验内容

实验要求:

①分支限界求解问题的策略及思路;(BFS广度优先搜索)

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

【求解过程】

在分支限界法中,每一个活结点只有一次机会成为扩展结点。

1.活结点一旦成为扩展结点,就一次性产生其所有儿子结点。当前点从活动节点队列中删去;

2.儿子结点中,不可行解或非最优解结点删去,其余儿子结点被加入活结点列表中;

3.从活结点表中取下一结点成为当前扩展结点;

4.重复上述结点扩展过程。直至活动结点列表为空;

活结点扩展顺序:先进入活结点列表,优先变为扩展节点

   活结点存储结构是队列Queue

②分析与回溯法求解问题的异同;

分支限界法与回溯法的不同之处:

(1)求解目标:

 回溯法:一般是找出解空间树中满足约束条件的所有解,也可找最优解的树;

分支限界法:找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。

(2)搜索方式的不同:

回溯法:以深度优先的方式搜索解空间树;

分支限界法:以广度优先或以最小耗费优先的方式搜索解空间树。

③掌握基于分支限界的TSP旅行商问题的设计求解;

针对如下问题,给出基于优先队列分支限界的算法设计策略。

如下4个城市,城市间的耗费如图。从城市1出发进行遍历。寻找最短遍历路径。

首先分析该问题的解空间树,它是一棵排列树:

它的特点如下:

(1)指定一个城市作为出发城市

(2)把第n-1层结点看做叶子结点

1.算法开始时创建一个最小堆,用于表示活结点优先队列

2.堆中每个结点的优先级为:cc+lcostcc为出发城市到当前城市的路程,lcost是当前顶点最小出边+剩余顶点最小出边和

3.每次从优先队列中取出一个活结点成为扩展结点

4. s=n-2,扩展出的结点是排列树中某个叶子结点的父结点。如该叶结点相应一条可行回路且费用小于当前最优解bestc,则将该结点插入到优先队列中,否则舍去该结点

5. s<n-2,产生当前扩展结点的所有儿子结点。计算可行儿子。结点的优先级cc+lcost及相关信息。当cc+lcost<bestc时,将这个可行儿子结点插入到活结点优先队列中。

④对上述算法进行时间复杂性分析,分析时间复杂度对比。

        回溯法是一种通过探索所有可能的候选解来找出所有解的算法。在解决TSP问题时,回溯法会生成一棵解空间树,其中每个节点代表一个可能的城市访问顺序,叶子节点代表一个完整的访问序列。

      对于n个城市,解空间树是一个n-1层的完全二叉树,这棵树的节点总数是(n-1)!

      在最坏情况下,回溯法需要遍历解空间树的所有节点来找到最短路径。因此,时间复杂度是O((n-1)!),但由于(n-1)!与n!相差不大,通常可以简化为O(n!)。

      分支限界法解决TSP问题的时间复杂度在最坏情况下也是O(n!),然而,在实际应用中,通过剪枝操作,分支限界法大大减少了实际搜索空间,因此平均运行时间优于蛮力算法。

四、核心代码

//用这种简单粗暴的方法获取必定小于结果的一个值
void get_low()
{//取每行最小值之和作为下界low = 0;for (int i = 1; i <= n; i++){//创建一个等同于map的临时数组,可用memcpyint tmpA[MAX_N];for (int j = 1; j <= n; j++){tmpA[j] = cost[i][j];}sort(tmpA + 1, tmpA + 1 + n);//对临时的数组进行排序low += tmpA[1];}
}
int get_lb(Node p)
{int ret = p.sumv * 2;//路径上的点的距离的二倍int min1 = INF, min2 = INF;//起点和终点连出来的边for (int i = 1; i <= n; i++){if (!p.visited[i] && min1 > cost[i][p.s]){min1 = cost[i][p.s];}}ret += min1;for (int i = 1; i <= n; i++){if (!p.visited[i] && min2 > cost[p.e][i]){min2 = cost[p.e][i];}}ret += min2;for (int i = 1; i <= n; i++){if (!p.visited[i]){min1 = min2 = INF;for (int j = 1; j <= n; j++){if (min1 > cost[i][j])min1 = cost[i][j];}for (int j = 1; j <= n; j++){if (min2 > cost[j][i])min2 = cost[j][i];}ret += min1 + min2;}}return (ret + 1) / 2;
}

五、记录与处理

此处定义INF无穷大为100000,即对角线为INF

六、思考与总结

通过分析回溯法和分支限界法的时间复杂度以及实际运行效率,我深刻认识到了算法优化的重要性。我学会了如何使用限界函数和剪枝策略来减少搜索空间,从而提高算法的运行效率。

七、完整报告和成果文件提取链接

完整可运行代码以及相关实验报告以下链接可获取:
链接: https://pan.baidu.com/s/1iss6-C2nxZQGkEpo-WDn0A?pwd=g5cg 提取码: g5cg 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/67661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【3】阿里面试题整理

[1]. ES架构&#xff0c;如何进行路由以及选主 路由&#xff1a;在Elasticsearch&#xff08;ES&#xff09;中&#xff0c;默认的路由算法是基于文档的_id。具体来说&#xff0c;Elasticsearch会对文档的_id进行哈希计算&#xff0c;然后对分片数量取模&#xff0c;以确定该文…

【Linux】opencv在arm64上提示找不到libjasper-dev

解决opencv在arm64上提示找不到libjasper-dev的问题。 本文首发于❄慕雪的寒舍 问题说明 最近我在尝试编译opencv&#xff0c;安装依赖项libjasper1和libjasper-dev的时候就遇到了这个问题。在amd64平台上&#xff0c;我们可以通过下面的命令安装&#xff08;ubuntu18.04&…

【数据结构】_时间复杂度相关OJ(力扣版)

目录 1. 示例1&#xff1a;消失的数字 思路1&#xff1a;等差求和 思路2&#xff1a;异或运算 思路3&#xff1a;排序&#xff0b;二分查找 2. 示例2&#xff1a;轮转数组 思路1&#xff1a;逐次轮转 思路2&#xff1a;三段逆置&#xff08;经典解法&#xff09; 思路3…

基于微信小程序的电子商城购物系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【linux】Linux 常见目录特性、权限和功能

目录特性默认权限主要功能/用途/根目录&#xff0c;所有目录的起点755文件系统的顶层目录&#xff0c;包含所有其他子目录和文件/bin基础二进制命令目录&#xff08;系统启动和修复必需的命令&#xff09;755存放所有用户可用的基本命令&#xff08;如 ls, cp, bash 等&#xf…

docker直接运行arm下的docker

运行环境是树莓派A 处理器是 arm32v6 安装了docker&#xff0c;运行lamp 编译安装php的时候发现要按天来算&#xff0c;于是用电脑vm下的Ubuntu系统运行arm的docker 然后打包到a直接导入运行就可以了 第一种方法 sudo apt install qemu-user-static 导入直接运行就可以了…

计算机网络一点事(22)

地址解析协议ARP ARP&#xff1a;查询Mac地址 ARP表&#xff08;ARP缓存&#xff09;&#xff1a;记录映射关系&#xff0c;一个数据结构&#xff0c;定期更新ARP表 过程&#xff1a;请求分组&#xff0c;响应分组 动态主机配置协议DHCP 分配IP地址&#xff0c;配置默认网关…

tomcat核心组件及原理概述

目录 1. tomcat概述 1.1 概念 1.2 官网地址 2. 基本使用 2.1下载 3. 整体架构 3.1 核心组件 3.2 从web.xml配置和模块对应角度 3.3 如何处理请求 4. 配置JVM参数 5. 附录 1. tomcat概述 1.1 概念 什么是tomcat Tomcat是一个开源、免费、轻量级的Web服务器。 Tomca…

科技快讯 | OpenAI首次向免费用户开放推理模型;特朗普与黄仁勋会面;雷军回应“10后小学生深情表白小米SU7”

不用开口&#xff1a;谷歌 AI 帮你致电商家&#xff0c;价格、预约一键搞定 谷歌在1月30日推出Search Labs中的“Ask for Me”实验性功能&#xff0c;用户可利用AI代替自己致电商家咨询价格和服务。该功能已与美汽车修理厂和美甲沙龙店合作&#xff0c;用户需加入Search Labs并…

帆软 FCA -业务分析师认证学习

帆软 FCA -业务分析师认证学习 认证概述 适合人群 企业中有需求管理、指标梳理、业务逻辑梳理、项目规划等需求的人员&#xff0c;想提升综合数据能力、推进数据应用落地的业务/IT骨干。 具体-FCA-业务分析理论 考试要求&#xff1a; FCA-业务分析理论考试- 费用&#xff1a…

Vue.js路由管理与自定义指令深度剖析

Vue.js 是一个强大的前端框架,提供了丰富的功能来帮助开发者构建复杂的单页应用(SPA)。本文将详细介绍 Vue.js 中的自定义指令和路由管理及导航守卫。通过这些功能,你可以更好地控制视图行为和应用导航,从而提升用户体验和开发效率。 1 自定义指令详解 1.1 什么是自定义…

Maya软件安装步骤与百度网盘链接

软件简介&#xff1a; MAYA软件是Autodesk旗下的著名三维建模和动画软件。maya软件功能更为强大&#xff0c;体系更为完善&#xff0c;因此国内很多的三维动画制作人员都开始转向maya&#xff0c;maya软件已成为三维动画软件的主流。 百度网盘链接: https://pan.baidu.com/s…

kamailio的部分模块的解释及代码示例【文章由DeekSeek大模型提供】

以下是 Kamailio 中这些模块的详细说明及示例代码&#xff1a; 1. tls.so 作用&#xff1a;提供 TLS 支持&#xff0c;用于加密 SIP 通信。示例&#xff1a;loadmodule "tls.so" modparam("tls", "certificate", "/etc/kamailio/tls/serve…

深入理解linux中的文件(上)

1.前置知识&#xff1a; &#xff08;1&#xff09;文章 内容 属性 &#xff08;2&#xff09;访问文件之前&#xff0c;都必须打开它&#xff08;打开文件&#xff0c;等价于把文件加载到内存中&#xff09; 如果不打开文件&#xff0c;文件就在磁盘中 &#xff08;3&…

一个用于测试的 HL7 Server

说明 一个用于测试的 HL7 Server。在过NIST的认证时&#xff0c;需要演示检验数据通过HL7进行传输&#xff0c;所以写了这工具。 HL7的消息解析和编码使用了NHapi。包含两个服务&#xff1a; ReceiveServiceSendService 这2个服务都继承自 BaseService public class BaseSe…

使用 Go 和 gqlgen 实现 GraphQL API:实战指南

使用 Go 和 gqlgen 实现 GraphQL API&#xff1a;实战指南 在本文中&#xff0c;我将分享如何使用 Go 语言和 gqlgen 框架实现一个完整的 GraphQL API。我们将构建一个包含用户、文章和评论功能的博客系统 API。 技术栈 Gogqlgen (GraphQL 框架)MySQL (数据存储)Redis (缓存…

matlab快速入门(2)-- 数据处理与可视化

MATLAB的数据处理 1. 数据导入与导出 (1) 从文件读取数据 Excel 文件&#xff1a;data readtable(data.xlsx); % 读取为表格&#xff08;Table&#xff09;CSV 文件&#xff1a;data readtable(data.csv); % 自动处理表头和分隔符文本文件&#xff1a;data load(data.t…

洛谷题目 P5994 [PA 2014] Kuglarz 题解 (本题较难)

题目传送门&#xff1a; P5994 [PA 2014] Kuglarz - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言&#xff1a; 本题涉及到最小生成树中的 kruskal 算法和并查集算法&#xff0c;图论基础概念两大知识点&#xff0c;瞎按对莱索没有学过图论的或最小生成树的可能会对这道…

消息队列篇--通信协议篇--网络通信模型(OSI7层参考模型,TCP/IP分层模型)

一、OSI参考模型&#xff08;Open Systems Interconnection Model&#xff09; OSI参考模型是一个用于描述和标准化网络通信功能的七层框架。它由国际标准化组织&#xff08;ISO&#xff09;提出&#xff0c;旨在为不同的网络设备和协议提供一个通用的语言和结构&#xff0c;以…

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…