【opencv】示例-travelsalesman.cpp 使用模拟退火算法求解旅行商问题

0446b2afe218c87af03978969e6983bd.png

6eb23516b6dbfac595d1d35f62b8b3ee.png

3f6ce269db2eaaf6bfd4d672d76e98e1.png

// 载入 OpenCV 的核心头文件
#include <opencv2/core.hpp>
// 载入 OpenCV 的图像处理头文件
#include <opencv2/imgproc.hpp>
// 载入 OpenCV 的高层GUI(图形用户界面)头文件
#include <opencv2/highgui.hpp>
// 载入 OpenCV 的机器学习模块头文件
#include <opencv2/ml.hpp>// 使用命名空间cv,避免每次调用 OpenCV 的功能时都要前缀cv::
using namespace cv;// 定义旅行商(TravelSalesman)类
class TravelSalesman
{
private :// 私有成员:城市位置向量的引用const std::vector<Point>& posCity;// 私有成员:下一个城市索引的向量引用std::vector<int>& next;// 私有成员:随机数生成器RNG rng;// 私有成员:用于记录状态改变的城市索引int d0,d1,d2,d3;public:// 构造函数初始化城市位置和下一个城市的索引TravelSalesman(std::vector<Point> &p, std::vector<int> &n) :posCity(p), next(n){// 初始化随机数生成器rng = theRNG();}// 返回系统状态的能量值double energy() const;// 改变系统状态(随机扰动)void changeState();// 撤销到之前的状态void reverseState();};// 实现改变状态的函数
void TravelSalesman::changeState()
{// 产生随机城市索引d0 = rng.uniform(0,static_cast<int>(posCity.size()));// 获取随机城市后的各个城市索引d1 = next[d0];d2 = next[d1];d3 = next[d2];// 更改城市访问的顺序next[d0] = d2;next[d2] = d1;next[d1] = d3;
}// 实现撤销状态改变的函数
void TravelSalesman::reverseState()
{// 恢复原来的城市访问顺序next[d0] = d1;next[d1] = d2;next[d2] = d3;
}// 实现计算能量值的函数,能量值为城市间距离的总和
double TravelSalesman::energy() const
{// 初始化能量值double e = 0;// 遍历城市计算总距离for (size_t i = 0; i < next.size(); i++){// 计算两城市间距离并累加到能量值e += norm(posCity[i]-posCity[next[i]]);}// 返回总能量值return e;
}// 绘制每个城市点和城市间连线
static void DrawTravelMap(Mat &img, std::vector<Point> &p, std::vector<int> &n)
{// 遍历所有城市for (size_t i = 0; i < n.size(); i++){// 在图像中用小圆点表示城市位置circle(img,p[i],5,Scalar(0,0,255),2);// 连接城市间的线表示旅行路径line(img,p[i],p[n[i]],Scalar(0,255,0),2);}
}int main(void)
{// 设置城市数量int nbCity=40;// 创建图像,用于显示城市地图Mat img(500,500,CV_8UC3,Scalar::all(0));// 初始化随机数生成器,种子为123456RNG rng(123456);// 设置城市生成的半径范围int radius=static_cast<int>(img.cols*0.45);// 设置图像中心点位置Point center(img.cols/2,img.rows/2);// 初始化城市位置向量和下一个城市索引向量std::vector<Point> posCity(nbCity);std::vector<int> next(nbCity);// 随机生成城市位置for (size_t i = 0; i < posCity.size(); i++){// 在圆周上均匀分布城市double theta = rng.uniform(0., 2 * CV_PI);// 计算城市的坐标并存储posCity[i].x = static_cast<int>(radius*cos(theta)) + center.x;posCity[i].y = static_cast<int>(radius*sin(theta)) + center.y;// 设定下一个城市的索引next[i]=(i+1)%nbCity;}// 创建旅行商问题系统实例TravelSalesman ts_system(posCity, next);// 绘制初始的旅行商问题地图DrawTravelMap(img,posCity,next);// 显示地图窗口imshow("Map",img);// 短暂等待时间waitKey(10);// 初始化模拟退火算法的当前温度double currentTemperature = 100.0;// 模拟退火循环,直到连续10次没有改变发生时停止for (int i = 0, zeroChanges = 0; zeroChanges < 10; i++){// 执行模拟退火算法,尝试改变系统状态int changesApplied = ml::simulatedAnnealingSolver(ts_system, currentTemperature, currentTemperature*0.97, 0.99, 10000*nbCity, &currentTemperature, rng);// 重绘图像,显示新的旅行路径img.setTo(Scalar::all(0));DrawTravelMap(img, posCity, next);imshow("Map", img);// 短暂等待时间并检查是否有退出键被按下int k = waitKey(10);// 输出当前循环的信息std::cout << "i=" << i << " changesApplied=" << changesApplied << " temp=" << currentTemperature << " result=" << ts_system.energy() << std::endl;// 如果用户按下退出键,则退出程序if (k == 27 || k == 'q' || k == 'Q')return 0;// 如果没有改变发生,则计数器加1if (changesApplied == 0)zeroChanges++;}// 完成模拟退火算法,输出结束信息std::cout << "Done" << std::endl;// 等待用户按键以退出waitKey(0);// 程序结束return 0;
}

这段代码实现了一个使用模拟退火算法的旅行商问题解决方案。在这个解决方案中,首先随机在一个圆周上生成一定数量的城市,并在地图上用圆点和连线显示出旅行商访问城市的路径。然后,通过模拟退火算法不断尝试随机扰动城市访问的顺序,通过最小化城市间路径的总长度来寻找最优解(即最短路径)。代码中绘图部分使用了OpenCV库,而模拟退火的具体实现使用了OpenCV的机器学习模块。

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

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

相关文章

【C语言__结构体__复习篇3】

目录 前言 一、结构体基础知识 1.1 结构体的语法形式 1.2 创建结构体变量 1.3 结构体变量的初始化 1.4 点(.)操作符和箭头(->)操作符 二、匿名结构体 三、结构体自引用 四、结构体内存对齐 4.1 内存对齐的规则 4.2 出现结构体内存对齐的原因 4.3 修改默认对齐数 五、结…

【网站项目】面向企事业单位的项目申报小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

数据结构之排序

一、排序的概念及其应用 1、排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记…

宝塔面板Docker+Uwsgi+Nginx+SSL部署Django项目

这次为大家带来的是从零开始搭建一个django项目并将它部署到linux服务器上。大家可以按照我的步骤一步步操作&#xff0c;最终可以完成部署。 步骤1&#xff1a;在某个文件夹中创建一个django项目 安装django pip install django创建一个django项目将其命名为djangoProject …

计算机网络 实验指导 实验17

实验17 配置无线网络实验 1.实验拓扑图 Table PC0 和 Table PC1 最开始可能还会连Access Point0&#xff0c;无影响后面会改 名称接口IP地址网关地址Router0fa0/0210.10.10.1fa0/1220.10.10.2Tablet PC0210.10.10.11Tablet PC1210.10.10.12Wireless互联网220.10.10.2LAN192.16…

05.MySQL索引事务

1. 索引 1.1 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。 可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现 1.2 作用 数据库中的表、数据、索引之间的关系&#xff0c;类似于书架上的…

分布式ID的方案和架构

超过并发&#xff0c;超高性能分布式ID生成系统的要求 在复杂的超高并发、分布式系统中&#xff0c;往往需要对大量的数据和消息进行唯一标识如在高并发、分布式的金融、支付、餐饮、酒店、电影等产品的系统中&#xff0c;数据日渐增长&#xff0c;对数据分库分表后需要有一个唯…

LeetCode-31-下一个排列问题

题目说明 实现获取下一个排列的函数&#xff0c;算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列&#xff0c;则将数字重新排列成最小的排列&#xff08;即升序排列&#xff09;。 必须原地修改&#xff0c;只允许使用额外常数空间。…

数据结构与算法——20.B-树

这篇文章我们来讲解一下数据结构中非常重要的B-树。 目录 1.B树的相关介绍 1.1、B树的介绍 1.2、B树的特点 2.B树的节点类 3.小结 1.B树的相关介绍 1.1、B树的介绍 在介绍B树之前&#xff0c;我们回顾一下我们学的树。 首先是二叉树&#xff0c;这个不用多说&#xff…

网络篇09 | 运输层 udp

网络篇09 | 运输层 udp 01 简介UDP 是面向报文的 02 报文协议 01 简介 UDP 只在 IP 的数据报服务之上增加了一些功能&#xff1a;复用和分用、差错检测 UDP 的主要特点&#xff1a;无连接。发送数据之前不需要建立连接。 使用尽最大努力交付。即不保证可靠交付。 面向报文。…

eclipse 取消生成注释 TODO Auto-generated method stub

eclipse 取消生成注释 // TODO Auto-generated method stub 基本步骤 windows -> preferencesJava -> Code Style -> Code TemplatesCode -> Method body -> 编辑删除 // ${todo} Auto-generated method stub参考材料 Eclipse 中取消生成 TODO Auto-generated…

(四)C++自制植物大战僵尸游戏启动流程

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL 一、启动方式 鼠标左键单机VS2022上方工具栏中绿色三角按钮&#xff08;本地Windows调试器&#xff09;进行项目启动。第一次启动项目需要编译项目中所有代码文件&#xff0c;编译生成需要一定的时间。不同性能的电…

Qt快速入门(Opencv小案例之人脸识别)

Qt快速入门&#xff08;Opencv小案例之人脸识别&#xff09; 编译出错记录 背景 因为主要使用qt&#xff0c;并且官网下载的win版本的编译好的opencv默认是vc的&#xff0c;所以我们需要自己下载opencv的源码使用mingw自行编译&#xff0c;我直接使用的vscode。 报错 报错…

Rust取代C++? 保守了!关于未来的讨论

当各种平台在大肆讨论rust即将取代C/C的时候&#xff0c;已经有不少人意识到这种讨论是聒噪而无聊的。笔者和老师们通过周末茶会的讨论&#xff0c;认为现今世界常见的大多数编程语言都会在50-80年内被AI取代&#xff0c;同时供人类审计而诞生的“审计语言”会兴起。届时计算机…

Niobe开发板OpenHarmony内核编程开发——事件标志

本示例将演示如何在Niobe Wifi IoT开发板上使用cmsis 2.0 接口使用事件标志同步线程 EventFlags API分析 osEventFlagsNew() /// Create and Initialize an Event Flags object./// \param[in] attr event flags attributes; NULL: default values./// \return e…

【C++】详解类的--封装思想(让你丝滑的从C语言过度到C++!!)

目录 一、前言 二、【面向过程】 与 【面向对象】 三、结构体 与 类 &#x1f34e;C中结构体的变化 &#x1f349;C中结构体的具体使用 &#x1f350;结构体 --> 类 ✨类-----语法格式&#xff1a; ✨类的两种定义方式&#xff1a; 四、类的访问限定符及封装【⭐】 …

【opencv】示例-stiching_detailed.cpp 使用OpenCV进行图像拼接的整体流程

#include <iostream> // 引入输入输出流库 #include <fstream> // 引入文件流库&#xff0c;用于文件输入输出 #include <string> // 引入字符串库 #include "opencv2/opencv_modules.hpp" // 引入OpenCV模块 #include <opencv2/core/utility.h…

数据结构-堆详解

堆 图片&#xff1a; 二叉堆的父节点为这个子树的最值。 如何维护它。 我们发现它是一棵二叉树&#xff0c;那就自然满足若父节点为 x x x 则左儿子节点为 x 2 x\times2 x2 右儿子为 x 2 1 x\times 2 1 x21 这是显然的&#xff0c;但如果写成指针或结构体就太麻烦了&…

王道汽车4S企业管理系统 SQL注入漏洞复现

0x01 产品简介 王道汽车4S企业管理系统(以下简称“王道4S系统”)是一套专门为汽车销售和维修服务企业开发的管理软件。该系统是博士德软件公司集10余年汽车行业管理软件研发经验之大成,精心打造的最新一代汽车4S企业管理解决方案。 0x02 漏洞概述 王道汽车4S企业管理系统…

MySQL优化慢SQL的6种方式

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《mysql经验总结》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 优化思路 优化方法 1.避免查询不必要的列 2.分页优化 3.索引优化 4.JOIN优化 5.排序优化 6.UNION 优化…