%%%这是一个遗传算法

tic;

clc;

clear all;

%%

%初始化

a=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...

3238 1229;4196 1044;4312  790;4386  570;3007 1970;2562 1756;...

2788 1491;2381 1676;1332  695;3715 1678;3918 2179;4061 2370;...

3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...

3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;2370 2975];

n=100; %种群大小

C=2000; %迭代代数

m=2;

Pc=0.8;

Pm=0.1;

%%

%%求任意两城市的距离

[c,d]=size(a);%此例中c=31,d=2

D=zeros(c,c);%申请一个0阵

for i=1:c

for j=i:c

bb=(a(i,1)-a(j,1)).^2+(a(i,2)-a(j,2)).^2;

D(i,j)=bb^(0.5);%计算第i个城市到j城市的距离

D(j,i)=D(i,j);

end

end

%%

%产生一个100的种群

[N,NN]=size(D);%(31*31)

farm=zeros(n,N);%用于存储种群

for i=1:n

farm(i,:)=randperm(N);%随机生成初始种群

end

R=farm(1,:);%一个随机解(个体)

%%%%

scatter(a(:,1),a(:,2),'x');

title('城市位置示意图');

hold on

%%%%一个随机解的路径

figure;

scatter(a(:,1),a(:,2),'x')

hold on

plot([a(R(1),1),a(R(31),1)],[a(R(1),2),a(R(31),2)])

hold on

for i=2:length(R)

x0=a(R(i-1),1);

y0=a(R(i-1),2);

x1=a(R(i),1);

y1=a(R(i),2);

xx=[x0,x1];

yy=[y0,y1];

plot(xx,yy)

hold on

end

title('随机解示意图');

%%

%求线路长度

len=zeros(100,1);

for i=1:n

len(i)=D(farm(i,N),farm(i,1));

for j=1:(N-1)

len(i)=len(i)+D(farm(i,j),farm(i,j+1));

end

end

%%%%%%%%%%

%%求适应度

maxlen=max(len);

minlen=min(len);

avelen=mean(len);

for i=1:n

fitness(i,1)=(1-((len(i,1)-minlen)/(maxlen-minlen+0.0001))).^m;%

end

%%

%%遗传过程

counter=0;

ii=1;

CC=zeros(C/10,1);

RR=zeros(C/10,1);

RV=zeros(C/10,1);

%%%%迭代过程

while counter<=C

%%%%%%%%%%路径长度

[N,NN]=size(D);

len=zeros(100,1);

for i=1:n

len(i)=D(farm(i,N),farm(i,1));

for j=1:(N-1)

len(i)=len(i)+D(farm(i,j),farm(i,j+1));

end

end

%%%%%%%%%%%%%%%%%适应度

maxlen=max(len);

minlen=min(len);

avelen=mean(len);

for i=1:n

fitness(i,1)=(1-((len(i,1)-minlen)/(maxlen-minlen+0.0001))).^m;%

end

%%%%%%%%%%%%%%%%%%%%%%%%R为最短路径

rr=find(len==minlen);%返回的是在len中路径最短的路径坐标(i,1)

R=farm(rr(1,1),:);%更新最短路径

FARM=farm;

%优胜劣汰,nn记录了复制的个数

%%%%%%%%%%%%%%%%%选择 复制个体

nn1=0;%nn-选择后种群数

for i=1:n

if  fitness(i,1)>=rand

nn1=nn1+1;

FARM(nn1,:)=farm(i,:);

end

end

FARM=FARM(1:nn1,:);  % FARM (nn*N)

[aa,bb]=size(FARM);%(aa=nn)

%%%%%%%%%%%%%%%%%%%%%%交叉操作

FARM2=FARM;

for i=1:2:aa

if Pc>rand&&i

A=FARM(i,:);

B=FARM(i+1,:);

%%%%%%%%%%这是部分匹配交叉

L=length(A);

if L<=10  %确定交叉宽度

W=9;

elseif ((L/10)-floor(L/10))>=rand&&L>10

W=ceil(L/10)+8;

else

W=floor(L/10)+8;

end

p=unidrnd(L-W+1);%随机选择交叉范围,从p到p+W %%p确定交叉点

for i=1:W

%交叉

x=find(A==B(1,p+i-1));

y=find(B==A(1,p+i-1));

%%%%交叉选中部分

temp=A(1,p+i-1);

A(1,p+i-1)=B(1,p+i-1);

B(1,p+i-1)=temp;

%%%%替换对应的位置

temp=A(1,x);

A(1,x)=B(1,y);

B(1,y)=temp;

end

FARM(i,:)=A;

FARM(i+1,:)=B;

%%%交叉完成

end

end

[aa,bb]=size(FARM);

%%%%%%%%%%%%%%变异过程

FARM2=FARM;

for i=1:aa

if Pm>=rand

M=FARM(i,:);

L=length(FARM(i,:));

rray=randperm(L);

%%%%%%%交换

%%%%随机交换两个位置

temp=M(rray(1));

M(rray(1))=M(rray(2));

M(rray(2))=temp;

%%%%%%%

end

end

%%%%%%%%%%%%%%群体的更新

FARM2=zeros(n-aa+1,N);

if n-aa>=1

for i=1:n-aa

FARM2(i,:)=randperm(N);%随机生成n-aa种群

end

end

FARM=[R;FARM;FARM2];%将随机产生的n-aa个体加入从后面种群,将上次迭代的最优解从前面加入种群

[aa,bb]=size(FARM);

%保持种群规模为n

if aa>n

FARM=FARM(1:n,:);

end

%更新farm

farm=FARM;

clear FARM

%更新迭代次数

counter=counter+1 ;

if mod(counter,10)==0

CC(ii,1)=counter;

RR(ii,1)=minlen;

RV(ii,1)=avelen;

ii=ii+1;

end

end

%结果输出

%%%%%%%%%%%%

figure;

scatter(a(:,1),a(:,2),'x')

hold on

plot([a(R(1),1),a(R(31),1)],[a(R(1),2),a(R(31),2)])

hold on

title('最优路径')

for i=2:length(R)

x0=a(R(i-1),1);

y0=a(R(i-1),2);

x1=a(R(i),1);

y1=a(R(i),2);

xx=[x0,x1];

yy=[y0,y1];

plot(xx,yy)

hold on

end

%%%%%%%%%%%%

disp('迭代次数c=');

disp(C);

disp('迭代后结果:');

R

Rlength=minlen  %结果输出

figure;

plot(CC,RR,CC,RV)  %最短路径长度、平均路径长度随进化代数的变化图

title('迭代过程示意图');

toc

matlab遗传算法tsp程序,遗传算法解TSP问题的程序相关推荐

  1. 遗传算法(四)MATLAB GA工具箱使用 附解TSP问题

    笔记(一) 基本遗传算法 笔记(二) 遗传算法的优化改进 笔记(三) 遗传算法解组合优化 笔记(四) MATLAB遗传算法工具箱使用 基本使用 1. 直接参见函数ga 函数原型:[x fval] = ...

  2. 单片机c语言程序流程图,ds1302时钟程序详解,ds1302程序流程图(C程序)

    ds1302时钟程序详解 DS1302 的控制字如图2所示.控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RA ...

  3. java小程序详解_微信小程序登录Java后台接口(详解,附示例代码)

    首先看一下官方文档 地址:微信小程序官方文档API登录接口 我们先对官方给的时序图进行简单的分析 1.当小程序调用wx.login()时,会获得一个code(临时登录凭证),然后我们需要用wx.req ...

  4. 微信小程序详解 php,微信小程序canvas基础详解

    canvas 元素用于在网页上绘制图形.HTML5 的 canvas 元素使用 JavaScript 在网页上绘制2D图像.本文主要和大家分享微信小程序canvas基础详解,希望能帮助到大家. 一.了 ...

  5. 微信小程序详解 php,微信小程序列表开发详解

    本文主要和大家分享微信小程序列表开发详解,主要以代码的形式和大家分享,希望能帮助到大家. 一.知识点 (一).列表渲染 wx:for tip:wx:for="array"可以等于参 ...

  6. ds1302的c语言程序,ds1302时钟程序详解,ds1302程序流程图(C程序)

    DS1302 的控制字如图2所示.控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据, 为1表示存取RAM数据;位5至位1指示操 ...

  7. 求解tsp的c语言程序,解TSP问题的遗传算法C语言程序.doc

    解TSP问题的遗传算法C语言程序 #include#include#include#include#include#include#include#include#include#define max ...

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

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

  9. 遗传算法之旅行家问题(TSP)

    遗传算法之旅行家问题(TSP) 本文针对没有任何机器学习知识的小白.(干货) 先要了解什么是遗传算法?? 遗传算法是:(1)遗传学基本原理模拟 生物自然进化的方法 (2)遵循优胜劣汰,适者生存的原则 ...

  10. 数学建模——遗传算法步骤及程序详解

    数学建模--遗传算法步骤及程序详解 文章目录 数学建模--遗传算法步骤及程序详解 前言 一.遗传算法的基础 1.编码和解码 2.适应度函数 3.交叉 4.变异 5.选择 二.遗传算法原理步骤 1.初始 ...

最新文章

  1. 新方向!DeepMind提出人工生命框架,促进智能生物体的出现
  2. C#的UInt64.MaxValue和C语言的0xffffffffffffffc5ull
  3. 数字化正在使CIO职责发生变化
  4. openstack热迁移配置注意事项
  5. ubuntu16.04打开软件或终端的窗口自动在左上角
  6. jQuery -- 光阴似箭(五):AJAX 方法
  7. 前端问题记录1:debounce is not a function
  8. day27 网络编程一
  9. 手机扫描到WiFi时,WiFi站点知道吗?
  10. springboot11 模板引擎
  11. 我的世界seus光影java版下载_我的世界seus光影mod
  12. 常用和不常用端口一览表
  13. 计算机创新发展战略,计算机行业投资机会报告:智能汽车创新发展战略发布
  14. 2022年智能电梯行业研究报告
  15. Pandas库下载和安装
  16. Word中中英文目录对齐设置问题
  17. java操作远端ftp文件失败
  18. 分页插件之--kaminari
  19. 跟开涛学SpringMVC
  20. Android定制开机动画与logo

热门文章

  1. linux 运行文件
  2. INC和DEC为什么不影响状态标志位
  3. 干货:怎么提高科技成果转移转化成效?
  4. 网络术语还在困扰你吗?
  5. 京东秒杀倒计时(js)
  6. 【HEVC学习与研究】46、HEVC参考代码中SAO的实现
  7. 程序流程图的基本画法大全
  8. [RTOS]uCOS、FreeRTOS、RTThread、RTX等RTOS的对比之特点
  9. IIS 6 元数据库与IIS 6 配置的兼容性 解决方案
  10. mac下 unix网络编程环境安装