2021-04-26 Matlab遗传算法工具箱的使用及实例(线性规划)

36 篇文章 14 订阅

Matlab遗传算法工具箱的使用及实例(线性规划)

引言

在使用遗传算法(Genetic Algorithm,GA)之前,你得了解遗传算法是干什么的。遗传算法一般用于求解优化问题。遗传算法最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。

 

遗传算法的原理和具体流程,各大书籍资料都有,这里不再赘述。我相信来找工具箱的人对原理有所了解。我们在使用工具箱时,不需要理解他的原理,因为这些已经封装到工具箱里了,你只需要设定参数即可。我将结合线性规划、非线性规划两类问题,来介绍一下MATLAB遗传算法工具箱的使用。本文先介绍用遗传算法工具箱求解线性规划模型,非线性规划见下期。

线性规划的标准形式

在使用遗传算法求解线性规划问题的时候,需要将模型描述成标准线性规划的形式。

 

标准线性规划

标准线性规划使用矩阵的形式表示如下:

图片

是自变量列向量,若有三个自变量,即为(x1,x2,x3)'

min f(x)是目标函数;

A是小于约束中x的系数矩阵,b是小于约束常数项的列向量;

Aeq是等号约束中x的系数矩阵,beq是等号约束中的常数项的列向量;

lb是x的最小取值,ub是x的最大取值

 

非标准线性规划转化为标准线性规划的实例

对于非标准线性规划的形式,如何化为标准型的线性规划呢?下面通过一个例子来说.

例如:有以下线性规划问题:

图片

可以观察到,标准型的目标函数是求极小值,而这个案例的目标函数是极大值,我们可以在目标函数f(x)添加一个负号,改为求-f(x),根据中学数学知识可以知道,-f(x)的最小值,就是f(x)的最大值.

在约束条件中,标准型的不等式约束都是小于约束,而案例中出现了大于约束。根据中学知识,不等式的两边同时乘一个负数,不等号改变方向。因此,我们只需要在不等式两边同时乘-1即可.

 

而 x1,x,2,x3>=0是对于自变量定义域的限制。

 

因此,上述模型可以转化为:

图片

根据线性代数的知识,约束条件的方程/不等式组可以用矩阵形式表示:

式[1]是等号约束,可表示为Aeq*x=beq的形式:

图片

式[2][3]是小于号的约束,可表示为A*x<=b的形式:

图片

式[4]是自变量的取值范围,可表示为lb<=x<=ub的形式

 

图片

遗传算法工具箱的使用说明

MATLAB提供的遗传算法工具箱,主要分为两个函数:gaoptimset()函数和ga()函数,gaoptimset()函数是用于设置遗传算法的一些参数的,可以不设置。若不设置,就使用默认参数。ga()函数是调用遗传算法对优化问题进行计算。

 

设置遗传算法参数——gaoptimset()函数的使用

 

调用格式为: 

  •  
options = gaoptimset('Param1', value1, 'Param2', value2, ...);

其中,'Param1'、'Param2'等是需要设定的参数,比如:种群规模、交叉比例等。value1、value2等则是Param的具体值。常用的参数名如下表(只列出了常用的,还有很多参数可以调整,可自行上网搜索):

 

gaoptimset函数的常用选项

图片

 

例如,需要设置交叉比例为0.7、迭代次数为300、种群规模为30

  •  
options = gaoptimset('CrossoverFraction', 0.7, 'Generations', 300, 'PopulationSize', 30);

返回的options是结构体,用于ga函数的最后一个参数

 

遗传算法——ga()函数的使用

 

ga函数的调用格式为:

 

  •  
[x_best,fval] = ga(fun, nvars, A, b, Aeq, beq, lb, ub, nonlcon, options);

 

图片

在做约束条件为线性的模型时,参数nonlcon直接传入空矩阵即可,代表不使用。

返回值x_best为取到最小值时的自变量x的取值,fval为所求的最小值。

实例

 

求下列函数的极小值:

图片

第一步:把目标函数编写成函数的形式,便于调用(将x看作x1,y看作x2)

function z = fitnessfun(x)
% 注意,无论有几个自变量,入口参数都为一个x,表示自变量的矩阵
% 在函数内用x(1)、x(2)等将每个自变量的值索引出来
% 必须以这种格式编写,否则ga函数报错
    z = 2 - exp(-(x(1).^2 + x(2).^2));
end

​​​​​​第二步:用gaoptimset()函数设置options(ga函数的最后一个参数)

提示:这一步可以跳过,不设置,直接调用ga。

% 根据需要设置,这里我设置种群大小100,交叉概率0.8,迭代500次options = gaoptimset('PopulationSize',100, 'CrossoverFraction', 0.8, 'Generations', 500);

第三步:调用ga()函数,计算出结果

调用函数之前,需要对ga函数传入的参数进行设置。

由于本题没有约束,仅对自变量x的取值作了限制,因此A,b,Aeq,beq均为空矩阵。

自变量x的限制为:

图片

因此

图片

 

由于本题没有非线性的约束,因此用不上nonlcon参数,直接传入空矩阵即可。

以上参数设置完,即可调用ga函数进行求解了。​​​​​​​

%% ga函数的参数设置fun = @fitnessfun; % 设置适应度函数句柄,在定义的函数名前加个@即可nvars = 2; % 自变量个数,本题为2个自变量A = [];  b = []; Aeq = [];  beq = []; % 没有约束就赋值为空矩阵lb = [-5; -5];  ub = [5; 5];  % 对自变量x的限制%% 调用ga函数计算% 调用格式[x_best,fval] = ga(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,options); % fun是函数句柄, nvars变量数,A,b,Aeq,Beq是线性约束,lb,ub限制X范围,% nonlcon是非线性约束,做线性规划寻优时赋值为空即可。options是设定参数的结构体[x_best, fval] = ga(fun, nvars, A,b,Aeq,beq,lb,ub,[],options);

整体代码如下

clearclc% 设置种群大小100,交叉概率0.8,最大进化代数500options = gaoptimset('PopulationSize',100, 'CrossoverFraction', 0.8, 'Generations', 500); fun = @fitnessfun;  % 设置适应度函数句柄,在定义的函数名前加个@即可nvars = 2;    % 自变量个数,本题为2个自变量A = [];  b = []; Aeq = [];  beq = [];        % 没有约束就赋值为空矩阵lb = [-5;-5];  ub = [5;5];  % 对自变量x的限制[x_best, fval] = ga(fun, nvars, A,b,Aeq,beq,lb,ub,[],options); function z = fitnessfun(x)    z = 2-exp(-(x(1).^2+x(2).^2));end

得到fval的值为1,即为所求。

 

求下列函数的最小值

图片

 

 

第一步,编写目标函数:​​​​​​​

function z = fitnessfun(x)    z = (x(2)-x(1).^2).^2 + (1-x(1)).^2 + (x(3) - x(2).^2).^2 + (1 - x(2)).^2;end

第二步,调用ga函数进行求解​​​​​​​

fun = @fitnessfun; % 设置适应度函数句柄nvars = 3; % 自变量个数A = [-10,-20,-1;1,2,4];  b = [-100;40];  % A·x <= b约束Aeq = [9,6,1];  beq = [100];             % Aeq·x <= beq约束lb = [2;2;2];  ub = [10;10;10];          % 定义域lb <= x <= ub[x_best, fval] = ga(fun, nvars, A,b,Aeq,beq,lb,ub,[],[]);

运行代码,得到fval的值约为2330.8681,即为所求。

 

注:由于遗传算法具有一定的随机性,因此每次求解的结果可能有些许差别。

  • 25
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MATLAB 遗传算法工具箱及应用·第二版》一书的word转pdf版,为保护版权不对外提供原书的word版。本文件是在原书word版的基础上转换成pdf而成,非扫描版,极致清晰。 作 者:雷英杰 张善文 李续武 周创明 出版社:西安电子科技大学出版社 第一章 遗传算法概述 1 1.1 遗传算法的概念 1 1.2 遗传算法的特点 3 1.2. 1 遗传算法的优点 3 1.2.2 遗传算法的不足之处 4 1.3 遗传算法与传统方法的比较 4 1.4 遗传算法的基本用语 6 1.5 遗传算法的研究方向 7 1.6 基于遗传算法的应用 8 第二章 基本遗传算法及改进 11 2.1 遗传算法的运行过程 11 2.1.1 完整的遗传算法运算流程 11 2.1.2 遗传算法的基本操作 13 2.2 基本遗传算法 14 2.2.1 基本遗传算法的数学模型 14 2.2.2 基本遗传算法的步骤 14 2.2.3 遗传算法的具体例证 16 2.3 改进的遗传算法 22 2.3.1 改进的遗传算法一 23 2.3.2 改进的遗传算法二 24 2.3.3 改进的遗传算法三 25 2.3.4 改进的遗传算法四 28 2.4 多目标优化中的遗传算法 30 2.4.1 多目标优化的概念 30 2.4.2 多目标优化问题的遗传算法 31 第三章 遗传算法的理论基础 34 3.1 模式定理 34 3.2 积木块假设 36 3.3 欺骗问题 37 3.4 遗传算法的未成熟收敛问题及其防止 39 3.4.1 遗传算法的未成熟收敛问题 39 3.4.2 未成熟收敛的防止 40 3.5 性能评估 41 3.6 小生境技术和共享函数 43 第四章 遗传算法的基本原理与方法 45 4.1 编码 45 4.1.1 编码方法 46 4.1.2 编码评估策略 48 4.2 选择 48 4.3 交叉 52 4.4 变异 55 4.5 适应度函数 57 4.5.1 适应度函数的作用 57 4.5.2 适应度函数的设计主要满足的条件 58 4.5.3 适应度函数的种类 58 4.5.4 适应度尺度的变换 59 4.6 控制参数选择 60 4.7 约束条件的处理 61 第五章 遗传算法工具箱函数 62 5.1 工具箱结构 62 5.1.1 种群表示和初始化 63 5.1.2 适应度计算 63 5.1.3 选择函数 63 5.1.4 交叉算子 64 5.1.5 变异算子 64 5.1.6 多子群支持 64 5.2 遗传算法中的通用函数 64 5.2.1 函数 bs2rv 64 5.2.2 函数 crtbase 66 5.2.3 函数 crtbp 66 5.2.4 函数 crtrp 67 5.2.5 函数 migrate 68 5.2.6 函数 mut 69 5.2.7 函数 mutate 71 5.2.8 函数 mutbga 72 5.2.9 函数 ranking 74 5.2.10 函数 recdis 76 5.2.11 函数 recint 77 5.2.12 函数 reclin 78 5.2.13 函数 recmut 79 5.2.14 函数 recombin 81 5.2.15 函数 reins 81 5.2.16 函数 rep 84 5.2.17 函数 rws 84 5.2.18 函数 scaling 85 5.2.19 函数 select 86 5.2.20 函数 sus 88 5.2.21 函数 xovdp 88 5.2.22 函数 xovdprs 89 5.2.23 函数 xovmp 90 5.2.24 函数 xovsh 91 5.2.25 函数 xovshrs 92 5.2.26 函数 xovsp 93 5.2.27 函数 xovsprs 94 第六章 遗传算法工具箱的应用 95 6.1 安装 95 6.2 种群的表示和初始化 95 6.3 目标函数和适应度函数 96 6.4 选择 97 6.5 交叉 99 6.6 变异 101 6.7 重插入 101 6.8 遗传算法的终止 102 6.9 数据结构 102 6.10 多种群支持 104 6.11 示范脚本 105 第七章 遗传算法应用举例 107 7.1 简单一元函数优化实例 107 7.2 多元单峰函数的优化实例 111 7.3 多元多峰函数的优化实例 115 7.4 收获系统最优控制 118 7.5 装载系统的最优问题 122 7.6 离散二次线性系统最优控制问题 125 7.7 目标分配问题 128 7.8 双积分的优化问题 130 7.9 雷达目标识别问题 131 7.10 图像分割问题 134 7.11 一些测试函数对应的优化问题 136 7.11.1 轴并行超球体的最小值问题 136 7.11.2 旋转超球体的最小值问题 137 7.11.3 Rosenbrock’s Valley最小值问题 138 7.11.4 Rastrigin函数的最小值问题 139 7.11.5 Schwefel函数的最小值问题 140 7.11.6 Griewangk函数的最小值问题 141 7.11.7 不同权的总和最小值问题 142 7.12 多目标优化问题 142 第八章 使用MATLAB遗传算法工具 146 8.1 遗传算法与直接搜索工具箱概述 146 8.1.1 工具箱的特点 146 8.1.2 编写待优化函数的M文件 148 8.2 使用遗传算法工具初步 149 8.2.1 遗传算法使用规则 149 8.2.2 遗传算法使用方式 150 8.2.3 举例:Rastrigin函数 151 8.2.4 遗传算法的一些术语 156 8.2.5 遗传算法如何工作 157 8.3 使用遗传算法工具求解问题 160 8.3.1 使用遗传算法工具GUI 160 8.3.2 从命令行使用遗传算法 172 8.3.3 遗传算法举例 177 8.4 遗传算法参数函数 192 8.4.1 遗传算法参数 192 8.4.2 遗传算法函数 203 8.4.3 标准算法选项 207 第九章 使用MATLAB直接搜索工具 208 9.1 直接搜索工具概述 208 9.2 直接搜索算法 209 9.2.1 何谓直接搜索 209 9.2.2 执行模式搜索 209 9.2.3 寻找函数最小值 210 9.2.4 模式搜索术语 212 9.2.5 模式搜索如何工作 214 9.3 使用直接搜索工具 218 9.3.1 浏览模式搜索工具 218 9.3.2 从命令行运行模式搜索 226 9.3.3 模式搜索举例 229 9.3.4 参数函数 243 9.4 模式搜索参数函数 245 9.4.1 模式搜索参数 245 9.4.2 模式搜索函数 253 参考文献 259
遗传算法工具箱可以用来解决非线性规划问题。在MATLAB中,可以使用谢菲尔德大学遗传算法工具箱来实现。这个工具箱可以解决函数优化、一元函数优化、原函数优化、线性规划、非线性规划、TSP问题等。 对于非线性规划问题,遗传算法可以通过不断迭代和优化来找到最优解。在遗传算法中,通过对问题的解进行编码、交叉、变异等操作来产生新的解,并通过适应度函数评估解的优劣程度。通过不断迭代和选择,遗传算法能够逐渐趋近于最优解。 如果你想学习更多关于遗传算法在非线性规划问题中的应用,我建议你先阅读一下关于MATLAB遗传算法工具箱求解非线性规划问题的相关文章。该文章会提供更详细的介绍和实现方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MATLAB遗传算法工具箱使用实例(非线性规划)](https://blog.csdn.net/weixin_45012973/article/details/107311291)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [使用谢菲尔德大学遗传算法工具箱解优化问题](https://download.csdn.net/download/liningtroy/8185637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值