阿白数模笔记之遗传算法(genetic algorithm)MATLAB代码详解

2023-11-05

目录

Preface

一.极值问题Extremum problem

1.参数初始化 Parameter initialization

 2.解码 decode

3.轮盘赌,选择淘汰Roulette, choose to eliminate

4.交叉 cross

5.变异 variation

6.完成迭代 Iteration completed

二.旅行商问题TSP

Reference article


Preface

        关于遗传算法的知识点,可以参考其他博主的文章,写的都很详尽易懂。作为数模小白,作者在这里分享关于代码的理解和每一步操作的意义。

一.极值问题Extremum problem

1.参数初始化 Parameter initialization

function result = func1(x) %待求的函数
fit = x+10*sin(5*x)+7*cos(4*x);
result = fit;
end
NP = 100; %种群数量
L = 20; %二进制位串长度
Pc = 0.8; %交叉率
Pm = 0.01; %变异率
G = 100; %最大遗传代数
Xs = 10; %上限
Xx = 0; %下限
f = rand(NP,L); %随机获得初始种群
trace=zeros(1,G); %用来记录每次迭代的最优解

 2.解码 decode

for k = 1:G %这是外层循环,对应的end在后面
    
    for i = 1:NP
        U = f(i,:); %第i行,解码
        m = 0;
        for j = 1:L
            m = U(j)*2^(j-1)+m;%二进制转化为10进制
        end
        x(i) = Xx+m*(Xs-Xx)/(2^L-1);%代回定义域
        Fit(i) = func1(x(i));
    end

    maxFit = max(Fit); %最大值,寻求的最优个体
    minFit = min(Fit); %最小值
    trace(k) = maxFit; %历代最优适应度,记录下来

    rr = find(Fit==maxFit);
    fBest = f(rr(1,1),:); %历代最优个体
    xBest = x(rr(1,1));
    Fit = (Fit-minFit)/(maxFit-minFit); %归一化适应度值

3.轮盘赌,选择淘汰Roulette, choose to eliminate

    sum_Fit = sum(Fit);
    fitvalue = Fit./sum_Fit; %返回概率矩阵
    fitvalue = cumsum(fitvalue);%累计和,a(j)=a(1)+a(2)+...a(j)
    ms = sort(rand(NP,1));%轮盘赌
    fiti = 1;
    newi = 1;
    while (newi <=NP) && (fiti<=NP)
        if (ms(newi)) < fitvalue(fiti)
            nf(newi,:) = f(fiti,:);%f是初始种群,储存被选中的个体
            newi = newi+1; %对于优秀个体(占比率较多的)多复制的可能更大
        else
            fiti = fiti+1;
        end
    end

4.交叉 cross

    for i = 1:2:NP
        p = rand;
        if p < Pc %进行交叉
            q = rand(1,L);
            for j = 1:L
                if q(j)<Pc
                    temp = nf(i+1,j);
                    nf(i+1,j) = nf(i,j);
                    nf(i,j) = temp;
                end
            end
        end
    end

5.变异 variation

    i = 1;
    while i <= round(NP*Pm)
        h = randi([1,NP],1,1); %随机选取一个需要变异的染色体,返回1*1介于[1,NP]的伪整数矩阵
        for j = 1:round(L*Pm)
            g = randi([1,L],1,1); %随机选取需要变异的基因数
            nf(h,g) =~ nf(h,g);
        end
        i = i+1;
    end

6.完成迭代 Iteration completed

    f = nf;
    f(1,:) = fBest; %保留最优个体在新种群中
end   %与前面的for对应

x=linspace(Xx,Xs,10000);
plot(x,func1(x));legend('x+10*sin(5*x)+7*cos(4*x)','location','northwest')
title('function');

figure
plot(trace)
xlabel('Iterations')
ylabel('Objective function value')
title('Fitness evolution curve')

 

 从上面可以发现,GA很快就收敛到了目标值,没有陷入局部最优值,效率还是很快的

二.旅行商问题TSP

关于代码的解释上面已给出,下面分享TSP问题的代码,稍难的已给出注释。另可参考阿白数模笔记之蚁群算法(1):TSP问题,遍历全球244个国家和地区的最短路径和

function [out]=distance(d)
m=size(d,1);
out=zeros(m,m);
for i=1:m
    for j=i:m
        a=d(i,:);
        b=d(j,:);
        out(i,j)= ((a-b)*(a-b)')^0.5; % 计算最短直线距离
        out(j,i)=out(i,j);
    end
end
end
tic
clc;clear
load('data2.mat')%C 31个地区的坐标
N = size(C,1); %TSP 问题的规模,即城市数目
D =distance(C); %任意两个城市距离间隔矩阵
NP = 200; %种群规模
G = 5000; %最大遗传代数
% f = zeros(NP,N); %用于存储种群
F = []; %种群更新中间存储

for i = 1:NP
    f(i,:) = randperm(N); %p = randperm(n) 返回行向量,其中包含从 1 到 n 没有重复元素的整数随机排列。
end
R = f(1,:); %存储最优种群
len = zeros(NP,1); %存储路径长度
fitness = zeros(NP,1); %存储归一化适应值
gen = 0;

while gen < G
    %%%%%%%%%%%%%%%计算路径长度%%%%%%%%%%%%%%%%
    for i = 1:NP
        len(i,1) = D(f(i,N),f(i,1));
        for j = 1:(N-1)
            len(i,1) = len(i,1)+D(f(i,j),f(i,j+1));
        end
    end
    maxlen = max(len); %最长路径
    minlen = min(len); %最短路径
    %%%%%%%%%%%%%%%更新最短路径%%%%%%%%%%%%%%%
    rr = find(len==minlen);
    R = f(rr(1,1),:);
    %%%%%%%%%%%%%%计算归一化适应值%%%%%%%%%%%%%%
    for i = 1:length(len)
        fitness(i,1) = (1-((len(i,1)-minlen)/(maxlen-minlen+0.001)));
    end
    %%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%
    nn = 0;
    for i = 1:NP
        if fitness(i,1) >= rand
            nn = nn+1;
            F(nn,:) = f(i,:);
        end
    end
    [aa,bb] = size(F);
    while aa < NP
        nnper = randperm(nn);
        A = F(nnper(1),:);
        B = F(nnper(2),:);
        %%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%
        W = ceil(N/10); %交叉点个数
        p = unidrnd(N-W+1); %随机选择交叉范围,从 p 到 p+W,
                            %r = unidrnd(n) 从由最大值 n 指定的离散均匀分布中生成随机数。
        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
        %%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%
        %但迭代到后面为防止重要基因丢失,变异概率应随着迭代进行而降低
        for k=1:floor((G-gen)/G*0.2*N)+1
            p1 = floor(1+N*rand());
        %Y = floor(X) 将 X 的每个元素四舍五入到小于或等于该元素的最接近整数。
            p2 = floor(1+N*rand());
            while p1==p2
                p1 = floor(1+N*rand());
                p2 = floor(1+N*rand());
            end
            tmp = A(p1);
            A(p1) = A(p2);
            A(p2) = tmp;
            tmp = B(p1);
            B(p1) = B(p2);
            B(p2) = tmp;
            F = [F;A;B];
            [aa,bb] = size(F);
        end
    end
    if aa > NP
        F = F(1:NP,:); %保持种群规模为 NP
    end
    f = F; %更新种群
    f(1,:) = R; %保留每代最优个体
    clear F;
    gen = gen+1;
    Rlength(gen) = minlen;
    for i = 1:N-1
        plot([C(R(i),1),C(R(i+1),1)],[C(R(i),2),C(R(i+1),2)],'bo-');
        hold on
    end
    plot([C(R(N),1),C(R(1),1)],[C(R(N),2),C(R(1),2)],'ro-');
    title(['Minimum distance:',num2str(minlen)]);
    hold off
end
figure
plot(Rlength)
xlabel('Iterations')
ylabel('Objective function value')
title('Fitness evolution curve')
toc

历时 233.815222 秒。

Reference article

 [1]遗传算法小结及算法实例(附Matlab代码) 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿白数模笔记之遗传算法(genetic algorithm)MATLAB代码详解 的相关文章

  • 如何以编程方式指定 MATLAB 编辑器键绑定

    我想将键盘键绑定设置为Windows 默认设置我想在启动时使用startup m因为我希望在大量系统上设置此设置 首选项对话框中的等效设置是 MATLAB gt Keyboard gt Shortcuts gt Active Setting
  • 如何从绘图处理程序中绘图?

    我有绘图的处理程序或图形的处理程序 例子 h plot 1 0 2 10 xx get h xx DisplayName Annotation 1x1 handle Color 0 0 1 LineStyle LineWidth 0 500
  • 傅里叶变换定理 matlab

    我目前正在尝试理解二维傅里叶位移定理 根据我到目前为止所了解到的情况 图像空间中的平移会导致相位差异 但不会导致频率空间中的幅度差异 我试图用一个小例子来演示这一点 但它只适用于行的移位 而不适用于列的移位 这是一个小演示 我只在这里显示幅
  • 在 Matlab 中显示有理数

    我有两个整数 m n 它们一起形成 m n 形式的有理数 现在我只想以这种理性的形式在 Matlab 中显示它们 我可以通过这样做来做到这一点 char sym m n 所以 如果 例如m 1 n 2 Matlab将显示1 2 然而 如果m
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 为什么 MATLAB 本机函数 cov(协方差矩阵计算)使用与我预期不同的除数?

    给定一个 M 维和 N 个样本的数据矩阵数据 例如 data randn N M 我可以计算协方差矩阵 data mu data ones N 1 mean data cov matrix data mu data mu N 如果我使用原生
  • 如何加载具有可变文件名的 .mat 文件?

    select all mat files oar dir oar mat n oar name loop through files for l 1 length oar load pat oar l lt this is the mat
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • 垂直子图的单一颜色条

    我想让下面的 MATLAB 图有一个沿着两个子图延伸的颜色条 像这样的事情 使用图形编辑器手动完成 Note 这与提出的问题不同here https stackoverflow com questions 39950229 matlab t
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • Matlab:条形图中缺少标签

    使用 Matlab 2012 和 2013 我发现设置XTickLabel on a bar图表最多只能使用 15 个柱 如果条形较多 则标签会丢失 如下所示 绘制 15 个条形图 N 15 x 1 N labels num2str x d
  • matlab中无限while嵌套在for循环中

    我想做一个while循环 嵌套在for在 Matlab 中循环以查找数据中不同对之间的距离 我的数据具有以下形式 ID lon lat time 1 33 56 40 89 803 2 32 45 41 03 803 3 35 78 39
  • 在matlab中不使用for循环检查数组中的成员资格

    我想简化这段代码 使其无需 for 循环即可工作 for i 1 N for j 1 N if ismember j A PID i i TFP i j PID i i end end end 其中A是一个包含一些标签的矩阵 我之前存储的T
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看
  • MATLAB 除法...29/128 应该返回 0 吗?

    我真的不认为这是一个精度问题 答案应该是0 226左右 这是确切的代码 val I i j bucketSize pos val bucketSize I只是我从中获取值的矩阵 以下是 MATLAB 的输出 val 29 bucketSiz
  • MATLAB:将当前文件夹设置为脚本位置

    我在不同的文件夹中有一些脚本和数据 我使用addpath和相对路径经常 我的问题是 只有当我的当前文件夹是我执行的脚本所在的位置时 这才有效 例如 如果我执行添加路径 X 的脚本 A 然后执行位于路径 X 中的脚本 B 则 Matlab 不
  • 使用简单矩阵乘法时出错

    我在一次简单的乘法运算中偶然发现了一个错误 这让我感到非常惊讶 我一直以为这里发生了什么 只为矩阵乘法 http www mathworks nl help matlab matlab prog operators html x 2 y z
  • 如何在 MATLAB 中将矩阵元素除以列总和?

    有没有一种简单的方法可以将每个矩阵元素除以列和 例如 input 1 4 4 10 output 1 5 4 14 4 5 10 14 以下是执行此操作的不同方法的列表 使用bsxfun https www mathworks com he

随机推荐

  • 记录JsonNode文本处理asText()和toString()的差异

    原文地址 https blog csdn net xudc0521 article details 89926158 最近使用JsonNode解析json字符串时 遇到一个与预期不一致的小问题 记录一下 先来看一个Test author x
  • log4j问题解决:log4j:WARN No appenders could be found for logger

    在resources目录下新建log4j properties文件 添加以下代码 log4j rootLogger ERROR log4j appender CONSOLE org apache log4j ConsoleAppender
  • 浙江大学 陈越_浙江大学陈越教授开展“程序设计课程建设”讲座

    12月10日下午 媒体工程学院耿卫东院长邀请了浙江大学陈越教授开展 程序设计课程建设 讲座 学院各课程群负责人 专业主任及其他专业教师共30余人聆听了讲座 并围绕 程序设计课程建设 的主题展开了深入探讨和交流 学院副院长章化冰主持讲座 代表
  • java基础学习 day25(二维数组)

    什么是二维数组 在数组中存放数组 二维数组的应用场景 当我们需要把数据分组管理的时候 就需要用二维数组 静态初始化格式 数据类型 数组名 new 数据类型 元素1 元素2 元素1 元素2 简化格式 数据类型 数组名 元素1 元素2 元素1
  • Java使用JVM工具检测问题

    1 jps 显示运行程序的进程 编码 主类目录信息 public class Demo01 jps 显示进程ID 主类名称 jps v 显示进程ID 主类名称以及详细编码信息 jps l 显示进程ID 主类目录 param args thr
  • 简单理解B树和B+树

    前言 前面我们说了红黑树 他是一种特殊的搜索树 但是由于他只是二叉树 所以这就导致他在大量的数据面前深度过高 同时会造成大量的磁盘空间浪费 所以我们又研究出来了B树和B 树 B树 他是人们早期的一种设计 他打破了二叉树的方式 它可以有多个分
  • android小项目之新闻客户端二

    基于Android的小巫新闻客户端开发 UI设计 主界面 2013年2月15日 由于太多事情要乱 不可能只专注一样东西 因为怕完成不了任务 原本这系列博客就是要在寒假搞定的 没想到拖了那么久 没办法 现在只能有空的时候就回顾一下小巫新闻客户
  • 多输入多输出

    多输入多输出 MATLAB实现DNN全连接神经网络多输入多输出 目录 多输入多输出 MATLAB实现DNN全连接神经网络多输入多输出 预测效果 基本介绍 模型结构 程序设计 参考资料 预测效果 基本介绍 DNN的结构不固定 一般神经网络包括
  • 所见即所得,使用Java将HTML解析为Excel,支持多级表头嵌套、单元格合并

    最近项目需要实现如题 所见即所得 的功能 之前每次生成Excel都需要重新从数据库查询一遍 降低效率不说 那些嵌套的表头实在是很难用Sql嵌套拼接实现 而且这样做还没有通用性 不同的表格需要写不同的Sql实现 非常繁琐 在网上找了很多关于H
  • SAP 程序中权限检查和用户权限缺失检查 SU53

    1 在程序中调用权限对象 在很多SAP标准程序中 已经存在了对权限数据的调用及管控功能 在程序中可以通过ABAP程序编辑器快速插入调用权限的代码 权限代码需要放在AT SELECTION SCREEN 事件块里 AUTHORITY CHEC
  • 飞飞影视php 漏洞,飞飞影视SQL injection exploit[转]

    飞飞影视管理系统 SQL injection 飞飞影视系统PHP版 v1 9 injection exploit by www 08sec com fans keyword Powered by www ff84 com error rep
  • vue.js关于动态绑定数据

    最近在写vue的时候发现一个问题 在后台传过来的一个数组需要给页面进行渲染 需要为每个 li 标签吧绑定一个点击事件 这个点击事件需要取这个 li li 标签的name属性的值 然后再进行页面的跳转 如何给name赋值呢 刚开始如上图写的
  • vue+element+el-table表格简单封装成组件

    封装后调用 我的页面是这样的 像那些图片 按钮 和状态这些 都是埋好的具名插槽 配置的时候先传插槽的名字 然后在table组件中对应名字 就形成了 具体看代码 比较详细 直接复制引用就可以展示 我在props里定义了点默认值 引用时方便理解
  • FPGA常用通信协议之IIC

    目录 1 概述 2 IIC时序 2 1数据位的有效性规定 2 2起始 终止 应答 非应答信号 2 3数据传送格式 2 4总线的寻址 3 FPGA读写EEPROM 3 1EEPROM芯片手册 3 1 1写时序 3 1 2读时序 3 1 3硬件
  • CSliderCtrl::ClearSel

    CSliderCtrl ClearSel void ClearSel BOOL bRedraw FALSE Parameters bRedraw Redraw flag If this parameter is TRUE the slide
  • 2022年的vue、react面试题目汇总集合(持续更新)

    vue系列 2021 Vue js 面试题汇总及答案 Jack Niu 博客园 react系列 React面试题及答案 2021年React面试题大全带答案 知乎 2021年React常见的面试题以及答案 持续更新中 再见已是路人的博客 C
  • 图像边缘检测及其在MATLAB中的实现

    图像边缘检测及其在MATLAB中的实现 图像边缘检测是数字图像处理中的常用技术之一 它可以帮助我们识别出物体的轮廓 形状等特征 下面介绍几种常用的边缘检测方法以及在MATLAB中的实现方法 Roberts算子 Roberts算子又称Prew
  • abaqus6.14导出网格inp以及导入inp以建模

    建好part 组装后 划分网格 然后建立job 之后write input就可以在工作目录生成刚才新建网格的单元和节点编号信息了 1 Heading 2 Job name buildmodel Model name Model 1 3 Ge
  • Expected more than 1 value per channel when training, got input size torch.Size

    Expected more than 1 value per channel when training got input size torch Size 训练的时候 batch size必须大于1 但是预测的时候 batch size可
  • 阿白数模笔记之遗传算法(genetic algorithm)MATLAB代码详解

    目录 Preface 一 极值问题Extremum problem 1 参数初始化 Parameter initialization 2 解码 decode 3 轮盘赌 选择淘汰Roulette choose to eliminate 4