这部分承接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 二维模拟退火算法最优路径(主程序)相关推荐

  1. 模拟退火算法_Matlab 二维模拟退火算法最优路径(主程序)

    这部分承接Dijkstra算法的基础之上,先算出单源最短路径(绿线), 之后把经过的每个虚线段分成1000份,它们的基准点分别是b1.b2等 随机产生一系列1000的数字排列成1*6的矩阵代入模拟退火 ...

  2. 二维模式(矩阵)匹配(Rabin-Karp算法推广到二维)[转]

    本文着重讨论由Rabin-Karp算法推广到二维来解决二维模式匹配问题的算法. 问题: 在一个n1*n2的二维字符组成中搜寻一个给定的m1*m2的模式.参考<算法导论>习题32.2-3. ...

  3. 数据结构与算法--数组:二维数组中查找

    数组 数组最简单的是数据结构,占据一整块连续的内存并按照顺序存储数据,创建数组时候,我们需要首先指定数组的容量大小,然后根据大小分配内存.即使我们只在数组中存储一个元素,亚需要为所有数据预先分配内存, ...

  4. 深度学习应用篇-计算机视觉-语义分割综述[5]:FCN、SegNet、Deeplab等分割算法、常用二维三维半立体数据集汇总、前景展望等

    [深度学习入门到进阶]必看系列,含激活函数.优化策略.损失函数.模型调优.归一化算法.卷积模型.序列模型.预训练模型.对抗神经网络等 专栏详细介绍:[深度学习入门到进阶]必看系列,含激活函数.优化策略 ...

  5. PHP二维数组排序算法函数

    <?php // 二维数组排序算法函数,能够具有通用性,可以调用php内置函数. function array_sort(&$arr, $order = []){$result = [] ...

  6. 二维Otsu算法的原理与实现

    1.简介: 一维Otsu算法有计算简洁.稳定.自适应强等优点,被广泛用于图像分割中.但一维Otsu算法没有考虑图像像素点之间的关系,当图像中有噪声时,会导致分割的效果不理想.因此,刘健庄等人在1993 ...

  7. 精通八大排序算法系列:二、堆排序算法

    精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...

  8. 夜深人静写算法(十二)- 模拟退火

    一.引例         1.函数最值        函数最值分为函数最大值和函数最小值,最小值即定义域内函数的最小值, 最大值即定义域内函数的最大值.函数最大(小)值的几何意义为函数图像的最高(低) ...

  9. c语言暴力求解法二维数组比较,【算法】搜索二维矩阵 暴力解法二分法 4种语言...

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1:输入:matrix = ...

最新文章

  1. 数据蒋堂 | 多维分析预汇总的存储容量
  2. 先有鸡还是先有蛋?--IT公司用人困惑
  3. 【科普】不同行业的常见数据分析的指标是什么?
  4. 单列集合Set的实现类TreeSet
  5. 《scikit-learn》SVM(二)数据不均衡
  6. 以管理员身份进入linux,ubuntu 以管理员身份运行程序
  7. 阿里矢量图iconfont的两种使用方法
  8. 篆刻学简体——第一章
  9. python的Bio下的Entrez使用
  10. php异步实现,避免长时间等待
  11. 好的重疾险原来长这样!你被骗了这么多年...
  12. java计算机毕业设计学校意见征集系统源码+系统+mysql数据库+lw文档
  13. 杨凌职业技术学院计算机专业宿舍,杨凌职业技术学院宿舍怎么样
  14. linux键盘符号错乱,Ubuntu14.04 键盘错位小问题
  15. Python爬虫练习:爬取软科世界大学学术排名
  16. js的数据类型和强制类型转换
  17. linux的双系统修复工具下载,EasyBCD(系统引导修复工具)
  18. 37互娱java待遇,37互娱现场java一面
  19. Arduino uno 折腾笔记-uno 变 键盘
  20. 我和小伙伴在北京的租房经历

热门文章

  1. 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape
  2. Java 方法、 流(Stream)、文件(File)和IO 总结
  3. 计算机竞赛作文,计算机打字比赛作文例文
  4. JDK8-lambda表达式四种forEach性能对比
  5. PHP 如何在Redis中实现事物(事物提交和事物回滚)
  6. mysql中insert into select from的使用
  7. 记一次MongoDB性能问题(从MySQL迁移到MongoDB)
  8. PHP的CURL:请求接口 模拟请求登陆 上传下载
  9. java preparedstatement 关闭_java - 如果基础连接已关闭,为什么isClosed()方法对PreparedStatements不返回true? - 堆栈内存溢出...
  10. PHP被忽视的编码规范