热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gatspmatlab,遗传算法(GA)求解TSP问题MATLAB程序

本程序求解常见的组合优化问题TSP问题,如果仅仅是用一个程序去求解一个优化问题,显然这样的工作意义并不大。主要是因为求解的好坏往往是很难评价的ÿ

本程序求解常见的组合优化问题TSP问题,如果仅仅是用一个程序去求解一个优化问题,显然这样的工作意义并不大。主要是因为求解的好坏往往是很难评价的,另外尤其对于遗传算法来说,遗传算法交叉

变异方法不同,交叉率,变异率等参数选择的不同,对结果都有很大的影响。我们采用如下的一个30个城市的TSP问题benckmark问题,最优解为423.7,30个城市的坐标如下

41

94;37 84;54 67;25 62;7 64;2 99;68 58;71 44;54 62;83 69;64 60;18

54;22 60;83 46;91 38;25 38; 24 42;58 69;71

71;74 78;87 76;18 40;13 40;82 7;62 32;58 35;45 21;41 26;44 35;4

50

%以遗传算法求解30个城市的TSP问题

%程序主要变量表

%A(30,2) 存放30个城市的坐标  zhongqun(100,30)存放种群规模100的父代

%k 总的循环迭代次数  zhongqun1(200,30)存放父代和交叉之后的子代

%n1 n2 随机选择交叉的两个个体

%gene1 geng2 随机选择两点交叉的两个交叉位置

%zxh1 父代1的子回路  zxh_1

排序完成后子代1的子回路

%zxh2 父代2的子回路  zxh_2

排序完成后子代2的子回路

%bianyi(200,1) 变异参数 小于变异概率 该个体就发生变异

%bianyi1  bianyi2

变异时交换编码的位置

%bianyilv 小于变异概率的个体发生变异

%din(1,200)存放父代与子代的适值函数 由小到大

tic;%统计程序的运行时间

A=[41 94;37 84;54 67;25 62;7 64;2 99;68 58;71 44;54 62;83

69;64 60;18 54;22 60;83 46;91 38;25 38;

24 42;58 69;71 71;74

78;87 76;18 40;13 40;82 7;62 32;58 35;45 21;41 26;44 35;4 50];%输入数据

TSP问题中30个城市的坐标

chushi=rand(100,30);%生产初始矩阵 存放初始解

for i=1:1:100

zhongqun(i,1:1:30)=1:1:30;

end

for i=1:1:50%生产初始解 对0到1之间的随机数进行排序 来确定初始解

for k=1:1:30

for j=1:1:29

if(chushi(i,j)>chushi(i,j+1))%排序

temp=chushi(i,j);

chushi(i,j)=chushi(i,j+1);

chushi(i,j+1)=temp;

temp=zhongqun(i,j);

zhongqun(i,j)=zhongqun(i,j+1);

zhongqun(i,j+1)=temp;

end

end

end

end

for k1=1:1:300%迭代次数

%交叉开始 采用子巡回交换交叉方式

zhongqun1=zeros(200,30);% 存放父代和交叉之后的子代

zhongqun1(1:100,1:end)=zhongqun;%前100个存放父代

for k=1:2:99%交叉开始

gene1=ceil(30*rand(1));%两点交叉的第一个节点

gene2=ceil(gene1*rand(1));%两点交叉的第二个节点

n1=ceil(100*rand(1));%随机选择从父代中选择两个个体

n2=ceil(100*rand(1));%随机选择从父代中选择两个个体

zhongqun1(k+100,1:1:gene2)=zhongqun(n1,1:1:gene2);%交叉

zhongqun1(k+101,1:1:gene2)=zhongqun(n2,1:1:gene2);%交叉

zxh1=zhongqun(n1,(gene2+1):1:gene1);%存放父代1的子巡回

zxh_1=zeros(1,gene1-gene2);%存放子代1的子巡回

i1=1;

%以父代2的次序 对父代1的子巡回编码进行排序 得到子代1的子巡回

for i1=1:1:(gene1-gene2)

for i=1:1:30

if(zhongqun(n2,i)==zxh1(i1))

zxh_1(i1)=i;

end

end

end

for i1=1:1:(gene1-gene2)

for i=1:1:(gene1-gene2-1)

if(zxh_1(i)

temp=zxh_1(i);

zxh_1(i)=zxh_1(i+1);

zxh_1(i+1)=temp;

temp=zxh1(i);

zxh1(i)=zxh1(i+1);

zxh1(i+1)=temp;

end

end

end

zhongqun1(k+100,(gene2+1):1:gene1)=zxh1;

zxh2=zhongqun(n2,(gene2+1):1:gene1);%存放父代2的子巡回

zxh_2=zeros(1,gene1-gene2);%存放子代2的子巡回

i1=1;

%以父代1的次序 对父代2的子巡回编码进行排序 得到子代2的子巡回

for i1=1:1:(gene1-gene2)

for i=1:1:30

if(zhongqun(n1,i)==zxh2(i1))

zxh_2(i1)=i;

end

end

end

for i1=1:1:(gene1-gene2)

for i=1:1:(gene1-gene2-1)

if(zxh_2(i)

temp=zxh_2(i);

zxh_2(i)=zxh_2(i+1);

zxh_2(i+1)=temp;

temp=zxh2(i);

zxh2(i)=zxh2(i+1);

zxh2(i+1)=temp;

end

end

end

zhongqun1(k+101,(gene2+1):1:gene1)=zxh2;

zhongqun1(k+100,(gene1+1):1:30)=zhongqun(n1,(gene1+1):1:30);%交叉

zhongqun1(k+101,(gene1+1):1:30)=zhongqun(n2,(gene1+1):1:30);%交叉

end

%变异开始 采用交换变异方式

bianyi=rand(200,1);%生产变异参数 来判断是否变异

bianyi1=ceil(30*rand(1));%生成随机数 用来确定 变异的时候交换哪两个位置的编码

bianyi2=ceil(30*rand(1));%生成随机数

if(k1<50)

bianyilv&#61;0.1;%自适应的修改变异概率当迭代初期选择大的变异概率

end

if((k1<&#61;100)&&(k1>&#61;50))

bianyilv&#61;0.05;%自适应的修改变异概率

end

if(k1>100)

bianyilv&#61;0.02;%自适应的修改变异概率 当迭代末期选择小的变异概率

end

for i&#61;1:1:200

if(bianyi(i)

tempb&#61;zhongqun1(i,bianyi1);%交换

zhongqun1(i,bianyi1)&#61;zhongqun1(i,bianyi2);

zhongqun1(i,bianyi1)&#61;tempb;

end

end

din&#61;zeros(200,1);%存放父代和子代的适值函数

for i&#61;1:1:200%计算适值函数

for j&#61;1:1:29

din(i)&#61;din(i)&#43;sqrt((A(zhongqun1(i,j),1)-A(zhongqun1(i,j&#43;1),1))^2&#43;(A(zhongqun1(i,j),2)-A(zhongqun1(i,j&#43;1),2))^2);%计算距离

end

din(i)&#61;din(i)&#43;sqrt((A(zhongqun1(i,1),1)-A(zhongqun1(i,30),1))^2&#43;(A(zhongqun1(i,1),2)-A(zhongqun1(i,30),2))^2);%计算起点与终点距离

end

xuanze&#61;1:1:200;

%对父代与子代的个体适值函数由小到大排序

for i&#61;1:1:200

for j&#61;1:1:199

if(din(j)>din(j&#43;1))

tempx&#61;din(j&#43;1);

din(j&#43;1)&#61;din(j);

din(j)&#61;tempx;

tempx1&#61;xuanze(j&#43;1);

xuanze(j&#43;1)&#61;xuanze(j);

xuanze(j)&#61;tempx1;

end

end

end

%保持种群规模不变 只选择其中适值函数较小的100个 做为下一次迭代的父代

for i&#61;1:1:100

zhongqun(i,1:end)&#61;zhongqun1(xuanze(i),1:end);

end

%画图程序

plot(k1,din(1),&#39;*&#39;),hold on

,xlabel(&#39;迭代次数&#39;),ylabel(&#39;计算结果&#39;),title(&#39;种群数&#61;50&#39;)

end

fprintf(&#39;计算结果&#61;%f\n&#39;,din(1));

toc;



推荐阅读
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 本文介绍了多维缩放(MDS)技术,这是一种将高维数据映射到低维空间的方法,通过保持原始数据间的关系,以便于可视化和分析。文章详细描述了MDS的原理和实现过程,并提供了Python代码示例。 ... [详细]
  • A题这题贼水,直接暴力就可以了。用个bool数组记录一下,如果某一天,当前剩下的最大的出现了的话,就输出一段。1#include<stdio.h>2intn;3boolvi ... [详细]
  • 我是这么写的, ... [详细]
  • 垂直泊车路径设计
    本文探讨了垂直泊车路径的设计原理与实现方法。垂直泊车是指汽车从特定位置出发,经过一系列横向和纵向移动,最终达到与车位垂直停放的状态。路径设计旨在确保泊车过程既高效又安全。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼错误72error:ErroropeningoutputfileC:Users林鑫辰AppDataLocalTemptmpxft_0000 ... [详细]
  • Matlab:数学之美–绘制分形图形学习最好的动力是兴趣,所以我们先看看效果:这一篇与Java学习日记:数学之美-分形图形绘制有共同之处,只是所用的工具不同。clear;%不同的参 ... [详细]
  • #-*-coding:utf-8-*-print(upython与开源QGis课题研究组)#print(汉字)##创建矢量数据文件#try:fromosgeoimporto ... [详细]
  • 主函数:CStringGetCPUIDString()Copyright(C)shangweixiao2011 ... [详细]
  • 1引言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着JavaSE1.6对Synchronized进行 ... [详细]
  • 本文目录一览:1、\mysybase.dump对数据库正常使用有影响吗 ... [详细]
  • html显示屏幕中心1,HTML中常见的长度单位
    8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?THML中常见的8种长度1、常见的单位px:像素 ... [详细]
author-avatar
雷神天在飘雪_804_959
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有