gamultiobj
使用遗传算法寻找多个适应度函数的帕累托前沿
语法
说明
示例
简单的多目标问题
找到简单多目标问题的帕累托前沿。有两个目标和两个决策变量 x
。
fitnessfcn = @(x)[norm(x)^2,0.5*norm(x(:)-[2;-1])^2+2];
找到该目标函数的帕累托前沿。
rng default % For reproducibility x = gamultiobj(fitnessfcn,2);
gamultiobj stopped because the average change in the spread of Pareto solutions is less than options.FunctionTolerance.
绘制解点。
plot(x(:,1),x(:,2),'ko') xlabel('x(1)') ylabel('x(2)') title('Pareto Points in Parameter Space')
要了解线性约束对此问题的影响,请请参阅 具有线性约束的多目标问题。
具有线性约束的多目标问题
此示例说明如何在存在线性约束的情况下找到多目标问题的帕累托前沿。
有两个目标函数和两个决策变量 x
。
fitnessfcn = @(x)[norm(x)^2,0.5*norm(x(:)-[2;-1])^2+2];
线性约束是 。
A = [1,1]; b = 1/2;
找到帕累托前沿。
rng default % For reproducibility x = gamultiobj(fitnessfcn,2,A,b);
gamultiobj stopped because the average change in the spread of Pareto solutions is less than options.FunctionTolerance.
绘制约束解和线性约束。
plot(x(:,1),x(:,2),'ko') t = linspace(-1/2,2); y = 1/2 - t; hold on plot(t,y,'b--') xlabel('x(1)') ylabel('x(2)') title('Pareto Points in Parameter Space') hold off
要查看从该问题中去除线性约束的效果,请请参阅 简单的多目标问题。
具有边界约束的多目标优化
在区间 上找到两个适应度函数 sin(x)
和 cos(x)
的帕累托前沿。
fitnessfcn = @(x)[sin(x),cos(x)]; nvars = 1; lb = 0; ub = 2*pi; rng default % for reproducibility x = gamultiobj(fitnessfcn,nvars,[],[],[],[],lb,ub)
gamultiobj stopped because the average change in the spread of Pareto solutions is less than options.FunctionTolerance.
x = 18×1
4.7124
4.7124
3.1415
3.6733
3.9845
3.4582
3.9098
4.4409
4.0846
3.8686
⋮
绘制解。gamultiobj
找到沿整个帕累托前沿的点。
plot(sin(x),cos(x),'r*') xlabel('sin(x)') ylabel('cos(x)') title('Pareto Front') legend('Pareto front')
不连续的帕累托前沿
找到并绘制双目标 Schaffer 第二函数的帕累托前沿。此函数具有断开的帕累托前沿。
将此代码复制到 MATLAB® 路径上的函数文件中。
function y = schaffer2(x) % y has two columns % Initialize y for two objectives and for all x y = zeros(length(x),2); % Evaluate first objective. % This objective is piecewise continuous. for i = 1:length(x) if x(i) <= 1 y(i,1) = -x(i); elseif x(i) <=3 y(i,1) = x(i) -2; elseif x(i) <=4 y(i,1) = 4 - x(i); else y(i,1) = x(i) - 4; end end % Evaluate second objective y(:,2) = (x -5).^2;
绘制两个目标。
x = -1:0.1:8; y = schaffer2(x); plot(x,y(:,1),'r',x,y(:,2),'b'); xlabel x ylabel 'schaffer2(x)' legend('Objective 1','Objective 2')
两个目标函数在 [1,3
] 和 [4,5]
范围内竞争 x
。但是,帕累托最优前沿仅由两个不连续的区域组成,对应于 [1,2]
和 [4,5]
范围内的 x
。由于区域 [2,3]
低于 [4,5]
,因此存在不连通的区域。在该范围内,目标 1
具有相同的值,但目标 2
较小。
设置边界以将种群成员保持在 范围内。
lb = -5; ub = 10;
设置选项以在 gamultiobj
运行时查看帕累托前沿。
options = optimoptions('gamultiobj','PlotFcn',@gaplotpareto);
调用 gamultiobj
。
rng default % For reproducibility [x,fval,exitflag,output] = gamultiobj(@schaffer2,1,[],[],[],[],lb,ub,options);
gamultiobj stopped because it exceeded options.MaxGenerations.
整数 gamultiobj
在两个问题变量中创建一个双目标函数。
rng default % For reproducibility M = diag([-1 -1]) + randn(2)/4; % Two problem variables fun = @(x)[(x').^2 / 30 + M*x']; % Two objectives
指定第二个变量必须是整数。
intcon = 2;
指定问题边界、gaplotpareto
绘图函数和 100 的种群规模。
lb = [0 0]; ub = [100 50]; options = optimoptions("gamultiobj","PlotFcn","gaplotpareto",... "PopulationSize",100);
找到问题的帕累托集。
nvars = 2; A = []; b = []; Aeq = []; beq = []; nonlcon = []; [x,fval] = gamultiobj(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,intcon,options);
gamultiobj stopped because the average change in the spread of Pareto solutions is less than options.FunctionTolerance.
列出十个解,并注意第二个变量是整数值。
x(1:10,:)
ans = 10×2
8.3393 28.0000
12.9927 49.0000
7.1611 27.0000
7.0210 18.0000
0.0004 12.0000
9.0989 44.0000
9.3974 29.0000
0.5537 17.0000
6.4010 17.0000
7.0531 31.0000
从 gamultiobj
获取所有输出
运行一个简单的多目标问题并获取所有可用的输出。
设置随机数生成器以实现可再现性。
rng default
将适应度函数设置为 kur_multiobjective
,该函数具有三个控制变量并返回两个适应度函数值。
fitnessfcn = @kur_multiobjective; nvars = 3;
kur_multiobjective
函数有以下代码。
function y = kur_multiobjective(x) %KUR_MULTIOBJECTIVE Objective function for a multiobjective problem. % The Pareto-optimal set for this two-objective problem is nonconvex as % well as disconnected. The function KUR_MULTIOBJECTIVE computes two % objectives and returns a vector y of size 2-by-1. % % Reference: Kalyanmoy Deb, "Multi-Objective Optimization using % Evolutionary Algorithms", John Wiley & Sons ISBN 047187339 % Copyright 2007 The MathWorks, Inc. % Initialize for two objectives y = zeros(2,1); % Compute first objective for i = 1:2 y(1) = y(1) - 10*exp(-0.2*sqrt(x(i)^2 + x(i+1)^2)); end % Compute second objective for i = 1:3 y(2) = y(2) + abs(x(i))^0.8 + 5*sin(x(i)^3); end
为所有变量设定下限和上界。
ub = [5 5 5]; lb = -ub;
找到该问题的帕累托前沿和所有其他输出。
[x,fval,exitflag,output,population,scores] = gamultiobj(fitnessfcn,nvars, ...
[],[],[],[],lb,ub);
gamultiobj stopped because the average change in the spread of Pareto solutions is less than options.FunctionTolerance.
检查一些返回变量的大小。
sizex = size(x) sizepopulation = size(population) sizescores = size(scores)
sizex = 18 3 sizepopulation = 50 3 sizescores = 50 2
返回的帕累托前沿包含 18 个点。最终种群有 50 个成员。每个 population
行都有三个维度,对应三个决策变量。每个 scores
行都有两个维度,对应两个适应度函数。
输入参数
fun
— 需要优化的适应度函数
函数句柄 | 函数名称
nvars
— 变量的数目
正整数
A
— 线性不等式约束
实矩阵
线性不等式约束,指定为实矩阵。A
是一个 M
×nvars
矩阵,其中 M
是不等式的数量。
A
以如下形式编写 M
个线性不等式
A*x <= b
,
其中,x
是由 nvars
个变量组成的列向量 x(:)
,b
是具有 M
个元素的列向量。
例如,给出约束 A = [1,2;3,4;5,6]
和 b = [10;20;30]
来指定这些总和:
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30。
示例: 要将 x 分量的总和设置为 1 或更小,请取 A = ones(1,N)
和 b = 1
。
数据类型: double
b
— 线性不等式约束
实数向量
线性不等式约束,指定为实数向量。b
是与 A
矩阵相关的包含 M
个元素的向量。如果将 b
作为行向量传递,求解器会在内部将 b
转换为列向量 b(:)
。
b
以如下形式编写 M
个线性不等式
A*x <= b
,
其中,x
是由 nvars
个变量组成的列向量 x(:)
,A
是大小为 M
×nvars
的矩阵。
例如,给出约束 A = [1,2;3,4;5,6]
和 b = [10;20;30]
来指定这些总和:
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30。
示例: 要将 x 分量的总和设置为 1 或更小,请取 A = ones(1,N)
和 b = 1
。
数据类型: double
Aeq
— 线性等式约束
实矩阵
线性等式约束,指定为实矩阵。Aeq
是 Me
×nvars
矩阵,其中 Me
是等式的数量。
Aeq
以如下形式编写 Me
个线性等式
Aeq*x = beq
,
其中,x
是由 nvars
个变量组成的列向量 x(:)
,beq
是具有 Me
个元素的列向量。
例如,给出约束 Aeq = [1,2,3;2,4,1]
和 beq = [10;20]
来指定这些总和:
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20。
示例: 要将 x 分量的总和设置为 1,请取 Aeq = ones(1,N)
和 beq = 1
。
数据类型: double
beq
— 线性等式约束
实数向量
线性等式约束,指定为实数向量。beq
是与 Aeq
矩阵相关的包含 Me
个元素的向量。如果将 beq
作为行向量传递,求解器会在内部将 beq
转换为列向量 beq(:)
。
beq
以如下形式编写 Me
个线性等式
Aeq*x = beq
,
其中,x
是由 nvars
个变量组成的列向量 x(:)
,Aeq
是大小为 Meq
×N
的矩阵。
例如,给出约束 Aeq = [1,2,3;2,4,1]
和 beq = [10;20]
来指定这些总和:
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20。
示例: 要将 x 分量的总和设置为 1,请取 Aeq = ones(1,N)
和 beq = 1
。
数据类型: double
lb
— 下界
实数向量 | 实数数组
下界,指定为实数向量或实数数组。如果是 numel(lb) = nvars
,那么 lb
指定对于所有 i
都是 x(i) >= lb(i)
。
如果是 numel(lb) < nvars
,那么 lb
指定 x(i) >= lb(i)
为 1 <= i <= numel(lb)
。
在这种情况下,求解器会发出警告。
示例: 要将所有 x 分量指定为正值,请设置 lb = zeros(nvars,1)
。
数据类型: double
ub
— 上界
实数向量 | 实数数组
上界,指定为实数向量或实数数组。如果是 numel(ub) = nvars
,那么 ub
指定对于所有 i
都是 x(i) <= ub(i)
。
如果是 numel(ub) < nvars
,那么 ub
指定 x(i) <= ub(i)
为 1 <= i <= numel(ub)
。
在这种情况下,求解器会发出警告。
示例: 要指定所有 x 分量小于一,请设置 ub = ones(nvars,1)
。
数据类型: double
nonlcon
— 非线性约束
函数句柄 | 函数名称
非线性约束,指定为函数句柄或函数名称。nonlcon
是一个接受行向量 x
并返回两个行向量 c(x)
和 ceq(x)
的函数。
c(x)
是x
处非线性不等式约束的行向量。gamultiobj
函数尝试使c
的所有条目满足c(x) <= 0
。ceq(x)
是x
处的行向量非线性等式约束。gamultiobj
函数尝试使ceq
的所有条目满足ceq(x) = 0
。
如果将 UseVectorized
选项设置为 true
,则 nonlcon
将接受大小为 n
x nvars
的矩阵,其中该矩阵代表 n
个体。nonlcon
在第一个参量中返回大小为 n
x mc
的矩阵,其中 mc
是非线性不等式约束的数量。nonlcon
在第二个参量中返回大小为 n
x mceq
的矩阵,其中 mceq
是非线性等式约束的数量。请参阅 向量化适应度函数。
例如 x = gamultiobj(@myfun,nvars,A,b,Aeq,beq,lb,ub,@mycon)
,其中 mycon
是 MATLAB® 函数,如下所示:
function [c,ceq] = mycon(x) c = ... % Compute nonlinear inequalities at x. ceq = ... % Compute nonlinear equalities at x.
有关详细信息,请参阅非线性约束。
数据类型: char
| function_handle
| string
options
— 优化选项
optimoptions
的输出 | 结构体
优化选项,指定为 optimoptions
的输出或结构体。请参阅 遗传算法选项 中的选项详细信息。
optimoptions
隐藏以斜体列出的选项。请参阅 optimoptions 隐藏的选项。
{}
中的值表示默认值。{}*
表示存在线性约束时的默认值,而MutationFcn
表示存在边界时的默认值。I* 表示求解器以不同的方式处理整数约束的选项。
NM 表示该选项不适用于
gamultiobj
。
适用于 ga
和 gamultiobj
的选项
选项 | 描述 | 值 |
---|---|---|
ConstraintTolerance | 确定非线性约束的可行性。此外, 对于选项结构体,使用 | 非负标量 | |
| 创建初始种群的函数。指定为内置创建函数或函数句柄的名称。请参阅 种群选项。 |
|
| 算法用来创建交叉子项的函数。指定为内置交叉函数或函数句柄的名称。请参阅 交叉选项。 |
|
| 交叉函数产生的代种群比例(不包括精英子女)。 | 非负标量 | |
| 显示级别。 |
|
| 计算个体距离测量的函数。指定为内置距离测量函数的名称或函数句柄。该值适用于决策变量或设计空间(基因型)或函数空间(表型)。默认的 对于选项结构体,使用函数句柄,而不是名称。 |
|
| NM 正整数,指定当前代中有多少个体能够保证存活到代。 | 非负整数 | |
| NM 如果适应度函数达到 | 标量 | |
| 缩放适应适应度函数值的函数。指定为内置缩放函数或函数句柄的名称。 |
|
FunctionTolerance | 如果 对于 对于选项结构体,使用 | 非负标量 | |
| I* 在 或者,指定混合函数及其选项的元胞数组。请参阅 ga 混合函数。 对于 当问题有整数约束时,不能使用混合函数。 请参阅 何时使用混合函数。 | 函数名称或句柄 | 或者 1×2 元胞数组| |
InitialPenalty | NM I*惩罚参数的初始值 | 正标量 | |
| 用于为遗传算法提供种子的初始种群。最多有 对于选项结构体,使用 | 矩阵 | |
| 指定初始种群中个体范围的矩阵或向量。适用于 对于选项结构体,使用 | 矩阵或向量| |
| 用于确定适应度的初始分数。最多有 对于选项结构体,使用 | 单目标的列向量|多目标的矩阵 | |
| 算法停止之前的最大迭代次数。 对于选项结构体,使用 | 非负整数 | |
| 如果 对于 对于选项结构体,使用 | 非负整数 | |
| NM 如果目标函数在 对于选项结构体,使用 | 正标量 |
| 该算法运行 对于选项结构体,使用 | 非负标量 | |
MigrationDirection | 迁移方向。请参阅 迁移选项。 |
|
MigrationFraction | 从 0 到 1 的标量指定每个亚群中迁移到不同亚群的个体比例。请参阅 迁移选项。 | 标量 | |
MigrationInterval | 正整数指定亚种群间个体迁移的代。请参阅 迁移选项。 | 正整数 | |
| 产生变异子代的函数。指定为内置变异函数或函数句柄的名称。请参阅 变异选项。 |
|
| 非线性约束算法。请参阅 遗传算法算法的非线性约束求解算法。 对于选项结构体,使用 |
|
|
对于选项结构体,使用 | 函数句柄或函数句柄元胞数组| |
| 从 0 到 1 的标量指定在求解器从更高前沿选择个体时保持在第一个帕累托前沿的个体比例,仅适用于 | 标量 | |
PenaltyFactor | NM I* 惩罚更新参数。 | 正标量 | |
| 绘制算法计算的数据的函数。指定为内置绘图函数的名称、函数句柄,或者内置名称或函数句柄的元胞数组。请参阅 绘图选项。 对于选项结构体,使用 |
仅限 仅限 |
PlotInterval | 正整数指定连续调用绘图函数之间的代。 | 正整数 | |
| 种群大小。 | 正整数 | 如果是 |
| 种群的数据类型。对于混合整数问题必须是 |
当 |
| 选择交叉和变异子代的父代代的函数。指定为内置选择函数或函数句柄的名称。
|
|
StallTest | NM 停止测试类型。 |
|
UseParallel | 并行计算适应度和非线性约束函数。请参阅向量化和并行选项(用户函数评估)和如何在 Global Optimization Toolbox 中使用并行处理。 |
|
| 指定函数是否向量化。请参阅向量化和并行选项(用户函数评估)和向量化适应度函数。 对于选项结构体,使用 |
|
示例: optimoptions('gamultiobj','PlotFcn',@gaplotpareto)
problem
— 问题描述
结构体
问题描述,指定为包含这些字段的结构体。
fitnessfcn | 适应度函数 |
nvars | 设计变量的数量 |
Aineq |
|
Bineq |
|
Aeq |
|
Beq |
|
lb |
|
ub |
|
nonlcon | 非线性约束函数 |
intcon | 整数变量的索引 |
rngstate | 重置随机数生成器状态的字段 |
solver |
|
options | 使用 |
您必须指定字段 fitnessfcn
、nvars
和 options
。其余部分对于 gamultiobj
来说是可选的。
数据类型: struct
输出参量
x
— 帕累托点
m
×nvars
数组
帕累托点,以 m
×nvars
数组的形式返回,其中 m
是帕累托前沿上的点数。x
的每一行代表帕累托前沿上的一个点。
fval
— 帕累托前沿上的函数值
m
×nf
数组
帕累托前沿上的函数值,以 m
×nf
数组的形式返回。m
是帕累托前沿上的点数,nf
是适应度函数的数量。fval
的每一行代表 x
中一个帕累托点的函数值。
exitflag
— gamultiobj
停止的原因
整数
gamultiobj
停止的原因,以整数形式返回。
exitflag 值 | 停止条件 |
---|---|
1 |
|
0 | 超出最大代 |
-1 | 优化由输出函数或绘图函数终止 |
-2 | 未找到可行点 |
-5 | 超出时间限制 |
output
— 有关优化过程的信息
结构体
有关优化过程的信息,以包含下列字段的结构体形式返回。
输出字段 | 含义 |
---|---|
problemtype | 问题类型:
|
rngstate | 算法开始之前,MATLAB 随机数生成器的状态。您可以使用 |
generations | 总代,不包括 HybridFcn 迭代。 |
funccount | 函数计算的总数。 |
message | gamultiobj 退出消息。 |
averagedistance | 平均“距离”,默认是帕累托前沿成员与其平均值之差的标准差。 |
spread | “距离”的组合,以及最后两次迭代之间帕累托前沿上点的移动度量。 |
maxconstraint | 最终帕累托集的最大约束违反。 |
population
— 最终种群
n
×nvars
数组
最终种群,以 n
×nvars
数组的形式返回,其中 n
是种群成员的数量。
scores
— 最终种群得分
n
×nf
数组
最终种群的得分,以 n
×nf
数组的形式返回。n
是种群成员的数量,nf
是适应度函数的数量。
当存在非线性约束时,gamultiobj
将不可行种群成员的 scores
设置为 Inf
。
详细信息
算法
gamultiobj
使用受控的精英遗传算法(NSGA-II [1] 的变体)。精英(GA) 总是青睐具有更好适应度值(排名)的个体。受控精英算法还会青睐个体能够帮助增加种群多样性的个体,即使它们的适应度值较低。保持种群的多样性对于收敛到最优帕累托前沿非常重要。随着算法的进展,通过控制种群中的精英成员来保持多样性。ParetoFraction
和 DistanceMeasureFcn
两个选项控制精英主义。ParetoFraction
限制帕累托前沿的个体数量(精英成员)。由 DistanceMeasureFcn
选择的距离函数有助于通过偏向前端相对较远的个体来保持前端的多样性。如果扩展(帕累托前沿移动的量度)很小,则算法停止。有关详细信息,请参阅gamultiobj 算法。
替代功能
App
优化实时编辑器任务为 gamultiobj
提供了一个可视化界面。
参考
[1] Deb, Kalyanmoy. Multi-Objective Optimization Using Evolutionary Algorithms. Chichester, England: John Wiley & Sons, 2001.
扩展功能
自动并行支持
通过使用 Parallel Computing Toolbox™ 自动运行并行计算来加快代码执行。
要并行运行,请将 'UseParallel'
选项设置为 true
。
options = optimoptions('
solvername
','UseParallel',true)
有关详细信息,请参阅如何在 Global Optimization Toolbox 中使用并行处理。
版本历史记录
在 R2007b 中推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)