Matlab无基础快速上手1(遗传算法框架)

news2024/11/14 12:18:01

本文用经典遗传算法框架模板,对matlab新手友好,快速上手看懂matlab代码,快速应用实践,源代码在文末给出。

基本原理:

遗传算法(Genetic Algorithm,GA)是一种受生物学启发的优化算法,它模拟了生物进化中的基因遗传和自然选择过程,通过模拟“进化”过程来搜索问题的最优解或近似最优解。

遗传算法的基本思想是通过对候选解(称为个体或染色体)的不断进化和变异来搜索最优解。在遗传算法中,每个个体都代表了问题的一个潜在解,并且具有一个与其适应度相关联的数值,用于评价个体的优劣。

遗传算法的主要步骤包括:

  • 初始化:随机生成一组初始个体(种群),并为每个个体计算适应度。
  • 选择:根据个体的适应度值,使用选择算子(如轮盘赌算法、竞争选择等)选择一部分个体作为父代。
  • 交叉:从父代中选取一对个体,通过交叉操作产生新的个体(子代),以增加种群的多样性。
  • 变异:对新生成的个体进行变异操作,以引入新的基因组合,增加种群的多样性。
  • 替换:使用替换策略(如保留最优个体、精英保留等)更新种群,产生下一代。
  • 重复迭代:重复进行选择、交叉、变异和替换步骤,直到满足停止条件(如达到最大迭代次数、找到满意解等)。

        通过不断重复这些步骤,遗传算法能够在解空间中搜索出较好的解,逐步逼近最优解。由于其并行性和全局搜索能力,遗传算法被广泛应用于各种领域的优化问题,如工程优化、机器学习、数据挖掘等。

参数与子函数定义:

此代码的待解决问题为function函数,也就是多元函数平方和求极小值问题,看懂代码后,可将function应用为自己的待解决问题。

function MySGA
NP = 50;                     %种群规模
Max_N = 1000;                %迭代次数
Pc = ones(1,NP)*0.8;         %ones表示创建一个全为1的数组,参数为数组大小
Pm = ones(1,NP)*0.1;         %变异概率
D = 500;
MinX = -100;
MaxX = 100;
Error = 1.0e-10;
X = MinX + (MaxX - MinX)*rand(NP,D);
F=fun(X);
[BestF,BestLow] = min(F);

function F = fun(X)
for i = 1:1:length(X(:,1))
    F(i) = sum(X(i,:).^2)
end

代码讲解:

ones函数:

这里出现了ones函数

  • 用法为:A = ones(sz)
  • sz为参数,可以是一个表示数组大小的向量,可以是一个数字标量、一个向量或一个矩阵
  • 这个函数表示将一个空间内的元素都置为1
  • ones(3)创建一个 3x3 的矩阵,所有元素都为 1。只有一个参数默认还是2维x2维的矩阵。尽量使用ones(3,3)来创建,增加代码可读性
  • ones(2,4) 创建一个 2x4 的矩阵,所有元素都为 1。
  • ones([2,3,4])创建一个 2x3x4 的数组,所有元素都为 1。

标量,向量,矩阵

这里提到了标量,向量,矩阵,这里继续学习一下:

  • 数字标量:就是一个普通的数
  • 向量:向量是一种特殊的数组,它只有一个维度,有水平和垂直两种向量,也可以说行向量或者列向量,例如:行向量:v = [1, 2, 3, 4];列向量:v = [1; 2; 3; 4];
  • 矩阵:矩阵是一个由数字按行和列排列成的二维数组。
  • 创建一个矩阵:A = [1, 2, 3; 4, 5, 6; 7, 8, 9];

这里的Pc = ones(1,NP)*0.8就表示创建一个包含1行,NP列的数组,全为0.8,表示变异概率。

这里出现了Error = 1.0e-10;,这种表示方法为科学计数法表示1 \times 10^{-10} 

接下来是X = MinX + (MaxX - MinX)*rand(NP,D);这里先看rand函数

rand函数:

  • 定义:rand函数用于生成指定大小的服从均匀分布的随机数矩阵或随机数向量
  • 参数:两个参数表示生成mxn维的矩阵,矩阵元素为0-1之间的随机数,若有一个参数为n则表示生成一个包含n个0-1之间随机数的向量,若无参数则生成一个0-1之间的随机数
  • 返回:例如r = rand(3, 3),这会生成一个3x3的矩阵返回给r,且矩阵的元素为(0,1)之间的随机值

        再看这个代码, (MaxX - MinX)*rand(NP,D)表示生成为(0,MaxX - MinX)直接的随机值的NP行,D列的矩阵,前面再加上MinX就表示生成范围为(MinX,MaxX)之间的NP行,D列的矩阵。

F=fun(X)

子函数代码:

function F = fun(X)
for i = 1:1:length(X(:,1))
    F(i) = sum(X(i,:).^2)
end
 for函数:
for index = start:increment:end 
% 在这里执行循环体代码 
end

 start是开始值,increment是步长,end是结束值,步长为1的话可以省略increment

length函数:

length函数用于返回数组的长度或矩阵的最大维度

例如:

vec = [1, 2, 3, 4, 5];
len = length(vec); % 返回 5,因为 vec 含有 5 个元素

 len为5,因为有5个元素

mat = [1, 2, 3; 4, 5, 6];
len = length(mat); % 返回 3,因为矩阵的列数为 3

len为3,因为矩阵有3列 

X(:,1)用法:

 这表示选中X矩阵的所有行的第一个元素,:表示所有,也就是提取出X的第一列的内容

分析此函数功能

for i = 1:1:length(X(:,1))表示根据X的第一列的长度进行遍历,也就是循环次数为X的行数。

F(i) = sum(X(i,:).^2)这个代码中,X(i,:)表示选中第i行的所有列,也就是提取出第i行元素,.^2表示进行乘方运算,那么这个代码的运行结果就是将第i行的所有元素平方和相加赋值给F的第i个元素。

min函数:

  • 定义:min函数用于找到数组或矩阵中的最小值及其对应的索引(若有多个列则按列索引)
  • 格式:[M, I] = min(A)
  • 参数:参数A为待索引矩阵或向量
  • 返回值:返回值为一个一维矩阵,一行或一列矩阵返回该行或该列的最小值和所在行/列位置,多行矩阵的话,第一个元素为A第一列的最小值,第二个元素为A第一列最小值的索引位置

 主函数实现:

选择:

for gen = 1:1:Max_N %循环迭代次数
    time(gen) = gen;
    tmpF = cumsum(F/sum(F);     %归一化
    disp(tmpF);
    CopyX = X;
    for i = 1:1:NP %通过适应度选择个体
       rnd = rand;%生成0-1之间的数
       for flag = 1:1:NP
          if(rnd  < tmpF(flag))
              break;
          end
          X(i,:) = CopyX(flag,:);
       end    
    end
    
end

        如上述代码所示,首先第一个for循环是循环迭代次数,下面的代码为每一次迭代所需要的操作,其中,选择操作采用了轮盘赌选择法。

        time数组记录当前迭代次数,tmpF是制作好的轮盘。

分析tmpF的实现:

        首先轮盘赌选择法是基于适应度进行选择的,适应度与选中概率成正比,适应度越高那么被选中的概率越大。轮盘的制作分为两步:

1.根据适应度计算概率

设种群规模为NF_{i}表示第i个个体的适应值,那么这个个体被选中的概率为:P_{i}=\frac{F_{i}}{\sum_{j=1}^{N}F_{j}}

代码中F/sum(F)实现此功能。

2.归一化制作轮盘

        要实现概率越高选中越大就要将这个所有个体的概率归一化,那么使用cumsum函数计算每个个体与它前所有元素的累加和,这样就制作好了一个轮盘,实现所有个体被选中的累计概率为1。如下图所示:因此第一个for循环代码表示遍历整个种群对每个个体进行更新,rnd=rand表示模拟轮盘转动。第二个for循环进行个体选择。

        上述提到的是经典遗传算法问题的轮盘制作过程,本模板需要计算的是多元函数求极值问题,具体为多个未知数的平方和最小问题,因此这里用F表示适应度的话,F越小、适应度越小被选中概率越高,因此轮盘制作代码需要改为如下:

tmpF = cumsum((1./F)/sum(1./F));

交叉:

    Pc_rand=rand(1,NP);
    for i=1:2:(NP-1)
        if Pc(i) > Pc_rand(i)
            alfa=rand;
            CpX = X(i,:);
            X(i,:)=alfa*X(i+1,:)+(1-alfa)*X(i,:);
            X(i+1,:)=alfa*CpX+(1-alfa)*X(i+1,:);
        end
    end

 Pc_rand为1行NP列,也就是一行NP个元素,每个元素为0-1随机值的矩阵。使用它判断每两个个体是否进行交叉操作,Pc为1行NP列,元素全为0.8的矩阵,代表进行交叉操作的概率。

开始循环,循环次数为种群的一半,代表一次是否选中两个个体进行交叉操作,循环里进行判断是否进行交叉操作,实现了交叉操作概率为0.8。

交叉操作:生成一个0-1之间的随机数alfa = rand;将第i个个体乘以(1-alfa)加上第i+1个个体乘以alfa更新为第i个个体,第i+1个个体同理。

变异:

    Pm_rand=rand(NP,D);
    for i=1:1:NP
        for j=1:1:D
            if Pm(i) > Pm_rand(i,j)
                X(i,j)=MinX+(MaxX-MinX)*rand;
            end
        end
    end

这个代码就很简洁了,遍历每个个体的每个参数,当0.01比这个值大时(0.01就是变异概率),就随机改变这个参数的值,也就是变异了。 

后续处理:

    X(NP,:)=bestX;%保留最佳个体防止淘汰
    F=fun(X); %评估当前种群
    [BestF,BestLow] = min(F);
    bestX=X(BestLow,:);
    result(gen)=BestF;  %记录结果 

        X(NP,:)=bestX就是将上一次循环后的最优个体保留,防止种群的最后一个个体位置,确保每次迭代的最佳个体被保留在种群中,以防止其在后续的进化过程中被淘汰掉。

整体代码:

function MySGA
NP = 100;                     %种群规模
Max_N = 10000;                %迭代次数
Pc = ones(1,NP)*0.8;         %ones表示创建一个全为1的数组,参数为数组大小
Pm = ones(1,NP)*0.01;         %变异概率
flagc=[0,Max_N]; 
D = 50;
MinX = -100;
MaxX = 100;
Error = 1.0e-10;
X = MinX + (MaxX - MinX)*rand(NP,D);
F=fun(X);
[BestF,BestLow] = min(F);
bestX=X(BestLow,:);
%disp(F);
for gen = 1:1:Max_N %循环迭代次数
    time(gen) = gen;
    tmpF = cumsum((1./F)/sum(1./F));     %归一化
    %disp(tmpF);
    CopyX = X;
    for i = 1:1:NP %通过适应度选择个体
       rnd = rand;%生成0-1之间的数
       for flag = 1:1:NP
          if(rnd  < tmpF(flag))
              break;
          end
          X(i,:) = CopyX(flag,:);
       end    
    end
    %种群交叉
    Pc_rand=rand(1,NP);
    for i=1:2:(NP-1)
        if Pc(i) > Pc_rand(i)
            alfa=rand;
            CpX = X(i,:);
            X(i,:)=alfa*X(i+1,:)+(1-alfa)*X(i,:);
            X(i+1,:)=alfa*CpX+(1-alfa)*X(i+1,:);
        end
    end
    %种群变异
    Pm_rand=rand(NP,D);
    for i=1:1:NP
        for j=1:1:D
            if Pm(i) > Pm_rand(i,j)
                X(i,j)=MinX+(MaxX-MinX)*rand;
            end
        end
    end
    X(NP,:)=bestX;%保留最佳个体防止淘汰
    F=fun(X);
    %------------------------------ 种群评估 -------------------------------
    [BestF,BestLow] = min(F);
    bestX=X(BestLow,:);
    %--------------------------- 记录结果 ----------------------------------
    result(gen)=BestF;
    if (BestF<Error) & (flagc(1)==0)
        flagc(1)=1;flagc(2)=gen;
    end
    if mod(gen,1000)==0
        disp(['代数:',num2str(gen),'----最优:',num2str(BestF)]);
        %disp(X);
    end
end
plot(time,result)
function F = fun(X)
for i = 1:1:length(X(:,1))
    F(i) = sum(X(i,:).^2);
end

此代码在交叉操作中还可以采用别的方式,可以读懂代码后,继续尝试增加多种方式。

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

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

相关文章

IDEA JAVA项目如何设置JVM参数

问题背景&#xff1a; 有时候项目在本地启动时会报参数引用不到&#xff0c;如果确实找不到在哪里添加的话&#xff0c;我们可以先加JVM参数来暂时解决本地环境的调试。 解决方案&#xff1a; 编辑配置Edit Configurations 选择需要配置的项目&#xff0c;点击Modify options 选…

FileNotFoundError: [Errno 2] No such file or directory: ‘llvm-config‘

查找本地的llvm-config find / -name llvm-config 2>/dev/null 输出 /usr/local/Cellar/llvm/17.0.6_1/bin/llvm-config 执行安装命令 LLVM_CONFIG/usr/local/Cellar/llvm/17.0.6_1/bin/llvm-config pip install llvmlite # 看自己路径在哪

男朋友花费了9万多,供我上大学,现在毕业1w多想分手,怎么办?

大家好&#xff0c;我是YUAN哥&#xff01;今天要跟大家聊聊一个热门话题——爱情与金钱的关系。最近看到一个网友的发帖&#xff0c;她说自己的男朋友供她上了四年大学&#xff0c;现在她找到了好工作&#xff0c;却想分手了。这个问题引起了网友们的热议。 在爱情中&#xff…

overflow(溢出)4个属性值,水平/垂直溢出,文字超出显示省略号的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

基于SpringBoot+Vue钢材销售管理系统的设计与实现

系统介绍 为了更好地发挥本系统的技术优势&#xff0c;根据钢材销售管理系统的需求&#xff0c;本文尝试以B/S经典设计模式中的Spring Boot框架&#xff0c;JAVA语言为基础&#xff0c;通过必要的编码处理、钢材销售管理系统整体框架、功能服务多样化和有效性的高级经验和技术…

[数据结构与算法]-什么是二叉树?

二叉树是一种数据结构&#xff0c;由节点组成&#xff0c;每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。二叉树的每个节点包含一个值&#xff0c;并且左子节点的值小于等于父节点的值&#xff0c;右子节点的值大于等于父节点的值。这个性质使得二叉树在搜…

论文辅助笔记:处理geolife数据

论文笔记&#xff1a;Context-aware multi-head self-attentional neural network model fornext location prediction-CSDN博客 对应命令行里 python preprocessing/geolife.py 20 这一句 1 读取geolife数据 pfs, _ read_geolife(config["raw_geolife"], print_…

文本生成任务的评价方法BLEU 和 ROUGE

BLEU 是 2002 年提出的&#xff0c;而 ROUGE 是 2003 年提出的。这两种指标虽然存在着一些问题&#xff0c;但是仍然是比较主流的评价指标。 BLUE BLEU 的全称是 Bilingual evaluation understudy&#xff0c;BLEU 的分数取值范围是 0&#xff5e;1&#xff0c;分数越接近1&a…

Mysql The last packet sent successfully to the server was 0 milliseconds ago.

项目启动后&#xff0c;报错&#xff0c;但是我的navicat 数据库连接工具是连接上的&#xff0c;没有问题的&#xff0c;但是程序就是连接不上。端口放开了&#xff0c;防火墙也放开了 先说问题&#xff1a;是网络问题&#xff0c; 如何解决&#xff1a;因为我的机子上又跑了…

思颜肌密:匠心独蕴,传世掠影

赋予延绵岁月以华彩乐章&#xff0c;将来自时间的承诺注入生活每分每秒&#xff0c;在思颜肌密的世界里&#xff0c;恒久之美并非遥不可及&#xff0c;它是艺术&#xff0c;亦是心意。华美节日翩然而至&#xff0c;思颜肌密拉开神秘帷幕&#xff0c;在惊鸿掠影中向世人展现传世…

IO实现方式(同步阻塞、同步非阻塞、IO多路复用)

1. 同步阻塞IO 同步阻塞io在数据在数据拷贝到两个阶段都是阻塞的&#xff0c;即把socket的数据拷贝到内核缓冲区和把内核缓冲区的数据拷贝到用户态到应用程序缓冲区都是阻塞的。用户线程在这个期间不能处理其他任务。 优点&#xff1a;简单易用 缺点&#xff1a;为每一次io请…

基于Springboot+Vue的Java项目-网上超市系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

腾讯后端一面:如果需要实现一个分布式锁,你该如何实现?

更多大厂面试内容可见 -> http://11come.cn 腾讯后端一面&#xff1a;如果需要实现一个分布式锁&#xff0c;你该如何实现&#xff1f; 分布式锁 如果让你来实现一个分布式锁&#xff0c;该如何实现&#xff1f; 实现分布式锁的话&#xff0c;肯定需要一个地方去存储锁的…

Python | Leetcode Python题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; class Solution:def searchInsert(self, nums: List[int], target: int) -> int:left, right 0, len(nums) #采用左闭右开区间[left,right)while left < right: # 右开所以不能有,区间不存在mid left (right - left)//2 # 防止溢出…

java线程-线程池

简介 工作原理 如何获取线程池对象 构造器的参数含义 注意事项 构造器-ThreadPoolExecutor // ArrayBlockingQueue 是一个有界的阻塞队列&#xff0c;它的内部实现是一个数组。有界的意思是它的容量是有限的&#xff0c;我们必须在创建 ArrayBlockingQueue 实例的时候指定容量…

IMUGNSS的误差状态卡尔曼滤波器(ESKF)---更新过程

IMU&GNSS的误差状态卡尔曼滤波器&#xff08;ESKF&#xff09;---更新过程 ESKF的更新过程 ESKF的更新过程 前面介绍的是ESKF的运动过程&#xff0c;现在考虑更新过程。假设一个抽象的传感器能够对状态变量产生观测&#xff0c;其观测方程为抽象的h,那么可以写为 其中z为…

科研基础与工具(论文搜索)

免责申明&#xff1a; 本文内容只是学习笔记&#xff0c;不代表个人观点&#xff0c;希望各位看官自行甄别 参考文献 科研基础与工具&#xff08;YouTube&#xff09; 搜索论文 Google Scholar 谷歌学术 涵盖面太全了&#xff0c;都收录&#xff0c;就会有很多低质量的论文…

NodeRed节点编辑用于边缘计算和规则引擎,能做带UI界面和业务逻辑的上位机或前端应用吗?

先说结论&#xff0c;可以&#xff0c;但是需要有页面嵌套继承类似的技术&#xff0c;实现页面模块化封装&#xff0c;否则难以实现复杂应用。 相信目光敏锐的人都在关注节点编辑在自身行业的应用&#xff01; NodeRed在边缘计算做数据协议解析、以及物联网平台中作为规则链引…

算法训练营day13

一、SlidingWindowMaximum(滑动窗口最大值) 前置题&#xff0c;155.最小栈 参考K神155. 最小栈 - 力扣&#xff08;LeetCode&#xff09; 做完最小栈的题能更好的理解这道题 鄙人想到了开辟空间来保存最小值&#xff0c;使用的HashMap&#xff1b;K神用的是栈逻辑优化 cla…

网盘_游戏_博客自动化部署(Nginx多项目部署)

目录 一.前提介绍 二.环境介绍 三.自述&#xff08;脚本&#xff09; 四.关于Nginx多项目部署 一.前提介绍 在我之前的博客里详细介绍了上述项目的部署&#xff0c;那么如何使用简单脚本自动部署和使用Nginx多项目部署是本文来介绍的基础篇章。 二.环境介绍 CentOS Linux…