MATLAB 遗传算法求解约束优化问题

摘要
本文以一个双变量的目标函数优化问题为例,借助MATLAB内置的遗传算法进行优化分析。

1. 问题

最小化如下包含两个变量的目标函数
min ⁡ x f ( x ) = 100 ( x 1 2 − x 2 ) 2 + ( 1 − x 1 ) 2 (1) \min_x f(x) = 100(x_1^2-x_2)^2 + (1-x_1)^2 \tag{1} xminf(x)=100(x12x2)2+(1x1)2(1)
满足的非线性约束条件和边界条件为:
{ x 1 x 2 + x 1 − x 2 + 1.5 ≤ 0 10 − x 1 x 2 ≤ 0 0 ≤ x 1 ≤ 1  and  0 ≤ x 2 ≤ 13 (2) \left\{ \begin{aligned} &x_1x_2 + x_1 - x_2 + 1.5 \le 0 \\ &10 - x_1x_2 \le 0 \\ &0 \le x_1 \le 1 \ \text{and} \ 0 \le x_2 \le 13 \end{aligned} \tag{2} \right. x1x2+x1x2+1.5010x1x200x11 and 0x213(2)

2. 程序

依托MATLAB,定义目标函数和约束函数

图 1 函数定义与代码对应关系

2.1 目标函数

在MATLAB中编写目标函数

function y = myFitness(x)
% 目标函数
% 输入:
%     x-对应优化的变量,x(1)-x1, x(2)-x2
% 输出:
%     y-对应优化值
y = 100 * (x(1)^2 - x(2))^2 + (1 - x(1))^2;
end

可在命令行键入 myFitness([1,2]), 检查函数是否正确,正确的输出结果为 100.

2.2 约束条件

在MATLAB中编写约束条件

function [c,c_eq] = myConstraints(x)
% 约束函数
% 输入:
%     x-对应优化的变量,x(1)-x1, x(2)-x2
% 输出:
%     c—不等式约束
%     c_eq—等式约束
c = [1.5 + x(1)*x(2) + x(1) + x(2);
    -x(1)*x(2) + 10];
c_eq = []; 
end

可在命令行键入 [c, c_eq] = myConstraints([1,2]), 检查函数是否正确,正确的输出结果为 c = [2.5000 8.0000]',c_eq = [].

2.3 主函数

在MATLAB中编写主函数,调用内置的GA算法

%% 主函数
% 利用GA(Genetic Algorithm)最小化目标函数
ObjFcn = @myFitness; % 利用@传输目标函数句柄
nvars = 2; % 变量数目
LB = [0,0]; % 变量下限
UB = [1,13]; % 变量上限
ConsFcn = @myConstraints; % 利用@传输约束函数句柄
[x,fval] = ga(ObjFcn,nvars,[],[],[],[],LB,UB,ConsFcn); % 调用遗传算法,x为最优值对应的变量取值,fval为最优值

本例的正确结果为x=[0.8122 12.3166],fval=1.3588e+04

3. 附录

Constrained Optimization with Genetic Algorithm - A MATLAB Tutorial for Beginners
在matlab中使用遗传算法执行最优化

  • 27
    点赞
  • 229
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿呆591

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值