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

本程序求解常见的组合优化问题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=0.1;%自适应的修改变异概率当迭代初期选择大的变异概率

end

if((k1<=100)&&(k1>=50))

bianyilv=0.05;%自适应的修改变异概率

end

if(k1>100)

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

end

for i=1:1:200

if(bianyi(i)

tempb=zhongqun1(i,bianyi1);%交换

zhongqun1(i,bianyi1)=zhongqun1(i,bianyi2);

zhongqun1(i,bianyi1)=tempb;

end

end

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

for i=1:1:200%计算适值函数

for j=1:1:29

din(i)=din(i)+sqrt((A(zhongqun1(i,j),1)-A(zhongqun1(i,j+1),1))^2+(A(zhongqun1(i,j),2)-A(zhongqun1(i,j+1),2))^2);%计算距离

end

din(i)=din(i)+sqrt((A(zhongqun1(i,1),1)-A(zhongqun1(i,30),1))^2+(A(zhongqun1(i,1),2)-A(zhongqun1(i,30),2))^2);%计算起点与终点距离

end

xuanze=1:1:200;

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

for i=1:1:200

for j=1:1:199

if(din(j)>din(j+1))

tempx=din(j+1);

din(j+1)=din(j);

din(j)=tempx;

tempx1=xuanze(j+1);

xuanze(j+1)=xuanze(j);

xuanze(j)=tempx1;

end

end

end

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

for i=1:1:100

zhongqun(i,1:end)=zhongqun1(xuanze(i),1:end);

end

%画图程序

plot(k1,din(1),'*'),hold on

,xlabel('迭代次数'),ylabel('计算结果'),title('种群数=50')

end

fprintf('计算结果=%f\n',din(1));

toc;

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

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

相关文章

墨卡托投影介绍

一、墨卡托投影 墨卡托投影&#xff0c;又称正轴等角圆柱投影&#xff0c;由荷兰地图学家墨卡托(G.Mercator)于1569年创拟。假设地球被套在一个圆柱中&#xff0c;赤道与圆柱相切&#xff0c;然后在地球中心放一盏灯&#xff0c;把球面上的图形投影到圆柱体上&#xff0c;再把…

disallow php,在robots.txt中Disallow: /abc和Disallow: /abc/的区别

站长&#xff1a;不就是多了条斜杠吗&#xff0c;能有多大不同&#xff1f;小编&#xff1a;很多新手站长搞不明白这其中的作用&#xff0c;其实作用区别很大的呦。Disallow: /abc表示禁止蜘蛛索引网站根目录下所有以abc开头的文件夹和文件举例&#xff1a;/abc.html/abcde.php…

Java double转decimal_Java中Double与BigDecimal的相互转换

今天写代码过程中&#xff0c;发现一个Double的变量通过new BigDecimal(Double d)转换为BigDecimal时&#xff0c;有效数字改变了&#xff0c;如下&#xff1a; public class BigDecimalTest {public static void main(String[] arg) {String s1 "123.45";Double d…

oracle数据库日期加一,日期和Oracle数据库

我想知道Oracle环境中的哪个参数导致这个&#xff1a;假设我在两台不同的服务器上有两个数据库。数据库中的数据相同。在sql developer下我写这个查询&#xff1a;select to_char(date_column, DD/MM/YYYY) from my_table;当我在sql developer中检查my_table时&#xff0c;日期…

JTS使用实践

文章目录JTS使用实践一、前言简介环境二、正文基础说明使用记录创建几何要素操作示例JTS使用实践 一、前言 简介 JTS Topology Suite&#xff08;Java Topology Suite&#xff09;是一个开源的Java软件库&#xff0c;它为欧几里得平面线性几何提供了一个对象模型以及一组基本…

matlab 信息融合,MSDF,matlab,多传感器信息融合

MSDF&#xff0c;matlab&#xff0c;多传感器信息融合关注次数&#xff1a; 164下载次数&#xff1a; 15文件大小&#xff1a; 7.52M下载需要积分&#xff1a; 1代码分类&#xff1a;开发平台&#xff1a; matlab上传会员&#xff1a; yhcpp下载代码预览代码Downma.com:专注MAT…

JTS基本概念和使用

简介 JTS是加拿大的 Vivid Solutions公司做的一套开放源码的 Java API。它提供了一套空间数据操作的核心算法。为在兼容OGC标准的空间对象模型中进行基础的几何操作提供2D空间谓词API。 操作 表示Geometry对象 Geometry类型介绍见另一篇文章&#xff1a;WKT WKB和GeoJSON pa…

sde oracle11g,Arcsde post oracle11g报错解决办法

环境&#xff1a;oracle11.2.0.3和oracle10.2.0.1&#xff0c;Arcsde9.3.1在oracle11.2.0.3中创建ab实例&#xff0c;然后使用Arcsde9.3.1 post oracle11.2.0.3创建配置sde&#xff0c;在post过程中报错&#xff0c;错误内容为[Thu Apr 04 10:24:55 2013] ERROR: Unable to loa…

GIS算法:可视化工具JTS TestBuilder

java、python、js都有可以引用的第三方包&#xff0c;实现GIS的空间算法。 java是jts&#xff0c;python是shapely&#xff0c;js是turf。 其中jts值得首先拥有&#xff0c;因为jts提供了一个界面工具JTS TestBuilder&#xff0c;可以在上面绘制图形&#xff0c;验证各种算法…

php aes 3des区别,AES和3DES之间的区别

Post Views:283AES与3DESAES(高级加密标准)和3DES(也称为Triple DES(数据加密标准))是当前数据加密中的两个标准。AES是使用替代置换网络的全新加密&#xff0c;而3DES只是对依靠平衡Feistel网络的旧DES加密的一种改编。基本上&#xff0c;3DES只是将DES应用于加密信息的 3次。…

wkt区域围栏

API文档 http://shengshifeiyang.gitee.io/geotools-learning/ /** * 判断以x,y为坐标的点point(x,y)是否在geometry表示的Polygon中 * param x * param y * param geometry wkt格式 POLYGON((0 0, 10 0, 10 10, 0 10,0 0)) * return */ public static boolean withinGeo(doub…

oracle监听生成trace,监听器控制程序lsnrctl跟踪trace file

Oracle监听器是一个独立的数据库组件&#xff0c;在整个体系中扮演非常重要的作用。即使在windows平台上&#xff0c;监听器listener也被实现成为一个独立的进程程序。在一些与网络相关的故障中&#xff0c;监听器相关故障占了很大部分。了解监听器的工作过程&#xff0c;分析每…

Math.sin() 与 Math.cos() 用法

Math.sin() 与 Math.cos() 用法 Math.sin(x) x 的正玄值。返回值在 -1.0 到 1.0 之间&#xff1b;Math.cos(x) x 的余弦值。返回的是 -1.0 到 1.0 之间的数&#xff1b; 这两个函数中的X 都是指的“弧度”而非“角度”&#xff0c;弧度的计算公式为&#xff1a; 2PI/360…

oracle关联字段和序列,oracle(9) 序列和约束

序列 SEQUENCE也是数据库对象之一&#xff0c;作用&#xff1a;根据指定的规则生成一些列数字。序列通常是为某张表的主键提供值使用。主键&#xff1a;通常每张表都会有主键字段&#xff0c;该字段的值要求非空且唯一&#xff0c;使用该字段来确定表中的每一条记录。CREATE SE…

lambda表达式处理异常_lambda表达式内出现异常无法throw抛出

lambda体中有受检异常,为什么不能在lambda表达式外层try catch,只能在lambda里面try catch xxx.getUpdateList().forEach((map) ->{xxxVO vo new xxxVO();BeanUtils.populate(vo,map); // populate方法往外抛了异常list.add(vo);});因为lambda表达式本身没有处理异常的机制…

lambda处理异常四种方式

最近对接第三方呼叫系统&#xff0c;第三方SDK的所有方法里都有异常抛出&#xff0c;因为用到了lambda&#xff0c;所以异常处理还是很必要的。 本文主要用到了四种解决方案&#xff1a; 直接代码块处理自定义函数式接口&#xff0c;warp静态方法通过Either 类型包装通过Pair…

linux 历史命令快捷键,Linux历史命令及bash快捷键

本文环境 Centos71.历史命令1.1 在使用linux中熟练的使用历史命令&#xff0c;能给我很多便捷&#xff0c;下面我来总结一些常用的一些历史命令。a) 执行上一条命令,这个很重要 &#xff0c;执行上一条命令有四种方法&#xff0c;如下:[rootCentOS-7-64data]#[rootCentOS-7-64 …

linux解压rar文件权限,linux下使用unrar命令解压*.rar格式文件

使用帮助[userlocalhost ~]$ unrarUNRAR 5.40 freeware Copyright (c) 1993-2016 Alexander RoshalUsage: unrar - -e Extract files without archived pathsl[t[a],b] List archive contents [technical[all], bare]p Print file to std…

lambda表达式无法抛出异常_Lambda 异常处理

lambda表达式无法抛出异常 背景&#xff1a;在一个方法中使用了lambda表达式&#xff0c;表达式中需要捕获异常&#xff0c;使用throws关键字发现并不起作用&#xff0c;必须使用trycatch才行 public class BeanUtil {public static <T,R> List<R> copyList(List…

linux的shell命令 a,linux shell命令大全(都是随堂笔记)

1. Tftp服务器(上传下载文件)注意&#xff1a;上传和下载文件时不能用目录表示 。因此&#xff0c;需要先cd到当前目录。注意目录权限&#xff1a;chmod 0777目录文件 8进制表示&#xff1a;Chmod的文件、目录的权限U自己 g 所属组 o其它 可加减步骤&#xff1a;安装服务器&…