dijkstra算法c++_Matlab 二维模拟退火算法最优路径(主程序)
这部分承接Dijkstra算法的基础之上,先算出单源最短路径(绿线),
之后把经过的每个虚线段分成1000份,它们的基准点分别是b1、b2等
随机产生一系列1000的数字排列成1*6的矩阵代入模拟退火算法
利用这些坐标计算出每个线段上的分点,然后计算距离找到更短的路径不断迭代,最后画出结果(蓝线)
NO.1 主程序代码如下所示,子函数的放在另外一篇文章中
----------------------------------
%% 二维模拟退火算法寻优
clc;
clear all
tic;
%% 初始作图
position = load('barrier.txt'); %障碍物顶点和边界点
%描述起点和终点
S = [20,180];
T = [160,90];
scatter([S(1),T(1)],[S(2),T(2)],'filled','d','LineWidth',1.5);
set(gca,'xtick',0:20:200) %横坐标刻度
title('Dijkstra算法演示','fontsize',12)
hold on
grid on
% 图形标注
text(S(1)+2,S(2),'S');
text(T(1)+2,T(2),'T');
%% 描绘障碍物图形填充
fill(position(1:4,1),position(1:4,2),[1,0.87059,0.67843]);
fill(position(5:8,1),position(5:8,2),[1,0.87059,0.67843]);
fill(position(9:12,1),position(9:12,2),[1,0.87059,0.67843]);
fill(position(13:15,1),position(13:15,2),[1,0.87059,0.67843]);
% 下载链路端点数据
L = load('lines.txt');
%L矩阵根据position里面的端点编号来,第一行是编号1和16坐标的点相连
%% 描绘线及中点,注意plot([x1,x2],[y1,y2])
v = zeros(size(L));
for i=1:size(L,1)
plot([position(L(i,1),1),position(L(i,2),1)],[position(L(i,1),2)...
,position(L(i,2),2)],'color','black','LineStyle','--');
v(i,:) = (position(L(i,1),:)+position(L(i,2),:))/2;
plot(v(i,1),v(i,2),'*');
text(v(i,1)+2,v(i,2),strcat('v',num2str(i))); %标记中点
end
%% 计算路径距离(中点和起终点之间)
sign = load('matrix.txt'); %节点间是否可到达,所有中点加上起点和终点
[n,m]=size(sign);
c = zeros(size(sign));
position_all = [S;v;T];
for i = 1:n
for j = 1:m
if sign(i,j) == 1
c(i,j) = sqrt(sum((position_all(i,:)-position_all(j,:)).^2));
end
end
end
c(c==0) = inf;
for i=1:n
c(i,i)=0; %对角线变零,其实这段不要也行,不会利用到对角线数据
end
%% 描绘可行路径
for i=1:n
for j=i:m
if sign(i,j)==1
plot([position_all(i,1),position_all(j,1)],[position_all(i,2),position_all(j,2)],...
'color','black','Linewidth',1,'LineStyle','-');
text((position_all(i,1)+position_all(j,1))/2,(position_all(i,2)+position_all(j,2))/2,char(vpa(c(i,j),4)),...
'color','red', 'fontsize',8)
end
end
end
%dijkstra算法产生初始路径
[path,distance_ori] = Dijkstra(c,n,position_all);
%% 算法的初始设置
n = 999; %分割线段,产生99个断点
path_base = path(2:end-1);
z = length(path_base);
%找到分段的基准点和另外一个端点,用以划分
position_base = position(L(path_base-1,1),:);
position_end = position(L(path_base-1,2),:);
for i=1:size(position_base,1)
scatter(position_base(i,1),position_base(i,2),'filled','d');
if i == 6
text(position_base(i,1)+6,position_base(i,2),strcat(',b',num2str(i)),'color','b');
else
text(position_base(i,1)+2,position_base(i,2),strcat('b',num2str(i)),'color','b');
end
end
T0 = 1000; %初始的温度
Tend = 1e-5; %结束时的温度
Loop = 200; %内循环次数(链长)
q = 0.95; %降温速率
S1 = unidrnd(n,[1,z]); %初始解的产生
temproute = zeros(Loop,z); %用于记录最优路线
tempdis = zeros(Loop,1); %用于记录距离
syms x
eqn = T0 * q^x == Tend; %降温的方程计算出迭代次数
Time = ceil(double(solve(eqn, x)));
Route_best = zeros(Time,z); %最优路线的记录
Length_best = zeros(Time,1); %最优路线值记录
Length_ave = zeros(Time,1); %此温度下平均值情况
count = 0; %计数的初始值
holdcount = 1; %计次保持的次数
while T0 > Tend
count = count+1; %更新迭代次数
% 某一个温度下先循环链长次
for k = 1:Loop
S2 = NewAnswer2(S1); %产生新解
[S1,R] = Metropolis_version2(S1,S2,position_base,position_end,T0,n); %Metropolis算法判断
temproute(k,:) = S1; %记录下路线和距离
tempdis(k,:) = R;
end
[min_length,min_index] = min(tempdis); %记录下这时候最短距离的值和索引
%% 参照蚁群算法最优值记录的方法(仅作参考)
% Route_best(count,:) = temproute(min_index,:);
% Length_best(count) = min_length;
% Length_ave(count) = mean(tempdis);
%% 另外一种记录方法
if count==1 || min_length
Length_best(count) = min_length;
holdcount = 1; %重置记录次数
% Route_best(count,:) = temproute(min_index,:);
else
Length_best(count) = Length_best(count-1); %如果当前温度最优大于上一轮的,则保持
holdcount = holdcount + 1;
if holdcount == 200 %如果200次数据无变化则跳出循环
break;
end
end
Length_ave(count) = mean(tempdis); %每次温度下路线的平均值
Route_best(count,:) = temproute(min_index,:);
T0 = q * T0; %降温
end
%% 找到结果里面最优值
Length_best(Length_best==0)=inf;
Length_ave(Length_ave==0)=inf;
[value,min_index] = min(Length_best); %找出最优值当中的最小值(因为有可能一直保持后跳出)
%所以要找不为零的那个
Length_ave_final = min(Length_ave);
Route_final = Route_best(min_index,:);
%% 作出最终结果图以及最终结果显示
m=n+1;
best_fen = zeros(z,2);
for j = 1:z
mm = Route_final(j)/(m-Route_final(j)); %计算比例和分点的坐标
best_fen(j,1) = (position_base(j,1)+mm*position_end(j,1))/(1+mm);
best_fen(j,2) = (position_base(j,2)+mm*position_end(j,2))/(1+mm);
end
SA_location = [S;best_fen;T];
% pause(1)
plot(SA_location(:,1),SA_location(:,2),'b--s','Linewidth',2);
%命令窗口的结果
if value < distance_ori
disp(['环游城市的最短距离:' num2str(value)]);
else
disp('算法寻优失败');
end
toc
figure()
%subplot(1,2,1)
% plot(Length_best,'color','black','LineWidth',1)
% text(min_index+5,value+5,num2str(value))
% xlabel('迭代次数','FontSize',11)
% ylabel('最短距离收敛轨迹','FontSize',11)
% grid on
% subplot(1,2,2)
plot(Length_ave,'color','black','LineWidth',1)
xlabel('迭代次数','FontSize',11)
ylabel('平均距离收敛轨迹','FontSize',11)
grid on
----------------------------------
(每次都能输出比Dijkstra更优解,但结果还不是非常的稳定。综合效率、结果优劣等各要素考量,需要不断调整算法参数)
dijkstra算法c++_Matlab 二维模拟退火算法最优路径(主程序)相关推荐
- 模拟退火算法_Matlab 二维模拟退火算法最优路径(主程序)
这部分承接Dijkstra算法的基础之上,先算出单源最短路径(绿线), 之后把经过的每个虚线段分成1000份,它们的基准点分别是b1.b2等 随机产生一系列1000的数字排列成1*6的矩阵代入模拟退火 ...
- 二维模式(矩阵)匹配(Rabin-Karp算法推广到二维)[转]
本文着重讨论由Rabin-Karp算法推广到二维来解决二维模式匹配问题的算法. 问题: 在一个n1*n2的二维字符组成中搜寻一个给定的m1*m2的模式.参考<算法导论>习题32.2-3. ...
- 数据结构与算法--数组:二维数组中查找
数组 数组最简单的是数据结构,占据一整块连续的内存并按照顺序存储数据,创建数组时候,我们需要首先指定数组的容量大小,然后根据大小分配内存.即使我们只在数组中存储一个元素,亚需要为所有数据预先分配内存, ...
- 深度学习应用篇-计算机视觉-语义分割综述[5]:FCN、SegNet、Deeplab等分割算法、常用二维三维半立体数据集汇总、前景展望等
[深度学习入门到进阶]必看系列,含激活函数.优化策略.损失函数.模型调优.归一化算法.卷积模型.序列模型.预训练模型.对抗神经网络等 专栏详细介绍:[深度学习入门到进阶]必看系列,含激活函数.优化策略 ...
- PHP二维数组排序算法函数
<?php // 二维数组排序算法函数,能够具有通用性,可以调用php内置函数. function array_sort(&$arr, $order = []){$result = [] ...
- 二维Otsu算法的原理与实现
1.简介: 一维Otsu算法有计算简洁.稳定.自适应强等优点,被广泛用于图像分割中.但一维Otsu算法没有考虑图像像素点之间的关系,当图像中有噪声时,会导致分割的效果不理想.因此,刘健庄等人在1993 ...
- 精通八大排序算法系列:二、堆排序算法
精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...
- 夜深人静写算法(十二)- 模拟退火
一.引例 1.函数最值 函数最值分为函数最大值和函数最小值,最小值即定义域内函数的最小值, 最大值即定义域内函数的最大值.函数最大(小)值的几何意义为函数图像的最高(低) ...
- c语言暴力求解法二维数组比较,【算法】搜索二维矩阵 暴力解法二分法 4种语言...
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1:输入:matrix = ...
最新文章
- 数据蒋堂 | 多维分析预汇总的存储容量
- 先有鸡还是先有蛋?--IT公司用人困惑
- 【科普】不同行业的常见数据分析的指标是什么?
- 单列集合Set的实现类TreeSet
- 《scikit-learn》SVM(二)数据不均衡
- 以管理员身份进入linux,ubuntu 以管理员身份运行程序
- 阿里矢量图iconfont的两种使用方法
- 篆刻学简体——第一章
- python的Bio下的Entrez使用
- php异步实现,避免长时间等待
- 好的重疾险原来长这样!你被骗了这么多年...
- java计算机毕业设计学校意见征集系统源码+系统+mysql数据库+lw文档
- 杨凌职业技术学院计算机专业宿舍,杨凌职业技术学院宿舍怎么样
- linux键盘符号错乱,Ubuntu14.04 键盘错位小问题
- Python爬虫练习:爬取软科世界大学学术排名
- js的数据类型和强制类型转换
- linux的双系统修复工具下载,EasyBCD(系统引导修复工具)
- 37互娱java待遇,37互娱现场java一面
- Arduino uno 折腾笔记-uno 变 键盘
- 我和小伙伴在北京的租房经历
热门文章
- 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape
- Java 方法、 流(Stream)、文件(File)和IO 总结
- 计算机竞赛作文,计算机打字比赛作文例文
- JDK8-lambda表达式四种forEach性能对比
- PHP 如何在Redis中实现事物(事物提交和事物回滚)
- mysql中insert into select from的使用
- 记一次MongoDB性能问题(从MySQL迁移到MongoDB)
- PHP的CURL:请求接口 模拟请求登陆 上传下载
- java preparedstatement 关闭_java - 如果基础连接已关闭,为什么isClosed()方法对PreparedStatements不返回true? - 堆栈内存溢出...
- PHP被忽视的编码规范