工程优化方法全解析
1. 优化问题基础定义与图形解法
优化在工程领域中,是指在满足各种约束条件的情况下,为系统的一组变量找到“最佳”可能值的过程。这里的“最佳”意味着决策者希望通过最小化或最大化一个或多个设计目标来实现优化。例如,在设计产品时,可能希望在最小化重量和成本的同时最大化其可靠性。
一般而言,优化问题可表述为在一定约束条件下最小化一个或多个目标函数,数学形式如下:
[
\min_{x\in D} {f_1 (x), f_2 (x), \cdots, f_M (x)}
]
其中,(f_i)((i = 1, \cdots, M))是将向量映射到目标空间的标量目标函数,(n)维设计(或决策)变量向量(x)被限制在一个区域(D)内,这个区域被称为可行域。可行域通常由(J)个不等式约束和/或(K)个等式约束来界定,即:
[
D = {x : g_j (x) \leq 0, h_k (x) = 0, j = 1, \cdots, J, k = 1, \cdots, K }
]
如果目标函数和约束函数都是设计变量的线性函数,那么该优化问题就是线性规划问题;反之,如果目标函数或约束函数中至少有一个是非线性的,则称为非线性规划问题。
下面通过一个两弹簧系统的例子来展示如何使用MATLAB的绘图功能可视化两个变量的优化问题解。
例13.1:两弹簧系统的平衡位置
考虑如图13.1所示的两弹簧系统,我们要确定加载后系统的平衡状态,即节点(A)的位置((x_1, x_2))。系统的平衡状态可通过获取系统的势能(PE)并对设计变量(x_1)和(x_2)进行最小化来得到。势能的计算公式为:
[
\min_{x_1, x_2} PE(x_1, x_2) = 0.5k_1(\sqrt{x_1^2 + (L_1 - x_2)^2} - L_1)^2 + 0.5k_2(\sqrt{x_1^2 + (L_2 + x_2)^2} - L_2)^2 - F_1x_1 - F_2x_2
]
其中,(k_1 = 8.8 N/cm),(k_2 = 1.1 N/cm),(L_1 = 11 cm),(L_2 = 11 cm),(F_1 = 4.5 N),(F_2 = 4.5 N)。
以下是生成图形显示的MATLAB代码:
k1 = 8.8;
k2 = 1.1;
L1 = 11;
L2 = 11;
F1 = 4.5;
F2 = 4.5;
[x1, x2] = meshgrid(linspace(-5, 15, 20), linspace(-5, 15, 20));
PE1 = 1/2*k1*(sqrt(x1.^2+(L1-x2).^2)-L1).^2;
PE2 = 1/2*k2*(sqrt(x1.^2+(L2+x2).^2)-L2).^2;
PE = PE1+PE2-F1*x1-F2*x2;
subplot(1,2,1);
h = contour(x1, x2, PE, [-40:20:20, 50:90:500], 'k');
clabel(h);
axis([-5, 15, -5, 15])
xlabel('x_1');
ylabel('x_2');
subplot(1, 2, 2);
surfc(x1, x2, PE);
axis([-10, 15, -10, 15, -100, 500]);
zlabel('PE');
xlabel('x_1');
ylabel('x_2')
执行上述脚本后,会得到势能函数的等高线图和表面图,从图中可以大致估计出最小值或最大值点的位置。更精确的位置将在后续使用无约束最小化技术来确定。
不同类型优化问题的分类、对应的MATLAB求解函数及示例总结如下表:
|问题类别|MATLAB函数|示例|
| ---- | ---- | ---- |
|线性规划|linprog|13.2生产计划,13.3炼油厂利润|
|二进制整数规划|bintprog|13.4背包装载|
|非线性规划 - 单目标无约束 - 多变量|fminunc|13.5两弹簧系统的平衡位置|
|非线性规划 - 单目标无约束 - 多变量|fminsearch|13.6瓶子底部问题,9.16振动吸收器参数|
|非线性规划 - 曲线拟合|lsqcurvefit|13.7应力 - 应变关系,9.8系统参数估计|
|非线性规划 - 最小二乘法|lsqnonlin|13.8应力 - 应变关系,13.9半经验P - v - T关系,13.10矿物勘探|
|非线性规划 - 单目标有约束 - 单变量|fminbnd|13.11工厂管道成本,13.12封闭盒子,5.22振荡系统响应|
|非线性规划 - 单目标有约束 - 多变量|fmincon|13.13两杆桁架,13.14螺旋压缩弹簧,13.15齿轮减速器|
|非线性规划 - 二次规划|quadprog|13.16生产计划|
|非线性规划 - 半无限约束|fseminf|13.17平面两连杆机械手|
|多目标优化|fminimax|13.18振动平台,9.16振动吸收器参数|
|多目标优化|fgoalattain|13.19生产计划|
|遗传算法 - 单目标|ga|13.20重新考虑的背包装载,13.21重新考虑的两杆桁架 - 单目标|
|遗传算法 - 多目标|gamultiobj|13.22重新考虑的两杆桁架 - 多目标,13.23重新考虑的两杆桁架 - 带连续和离散变量的单目标|
2. 线性规划
线性规划是一种适用于解决目标函数和约束函数均为设计变量线性函数的优化方法。线性规划问题可表述为:
[
\min f^T x
]
[
\text{subject to: } Ax \leq b
]
[
A_{eq}x = b_{eq}
]
[
lb \leq x \leq ub
]
其中,(f)、(b)、(b_{eq})、(lb)和(ub)是向量,(A)和(A_{eq})是矩阵,(x)是设计变量向量,上标(T)表示转置。
MATLAB中的线性规划求解器是
linprog
,基本命令如下:
[xopt, fopt] = linprog (f,A, b,Aeq, beq, lb, ub, x0, options)
该命令返回设计变量向量(x_{opt})和标量(f_{opt})(即(f(x_{opt})))。
下面通过两个具体例子展示
linprog
的使用。
例13.2:生产计划
假设有两种液体产品(A)和(B),它们在两个部门需要生产时间。产品(A)在第一个部门需要(1)小时,在第二个部门需要(1.25)小时;产品(B)在第一个部门需要(1)小时,在第二个部门需要(0.75)小时。每个部门的可用小时数为(200),产品(B)的最大市场潜力为(150)单位。产品(A)和(B)每单位的利润分别为(4)美元和(5)美元。我们要确定产品(A)和(B)的生产数量,以使生产者的利润最大化。
设(x_1)表示产品(A)的生产数量,(x_2)表示产品(B)的生产数量,则目标函数和约束条件如下:
[
\min f(x_1, x_2) = -4x_1 - 5x_2
]
[
\text{subject to: } x_1 + x_2 \leq 200
]
[
1.25x_1 + 0.75x_2 \leq 200
]
[
x_2 \leq 150
]
[
(x_1, x_2) \geq 0
]
对应的MATLAB代码为:
f = [-4, -5];
A = [1, 1; 1.25, 0.75; 0, 1];
x = linprog(f,A, [200, 200, 150], [], [],[0, 0]);
disp(['No. of units A = ' num2str(x(1)) ' No. of units B = ' num2str(x(2))])
执行代码后,得到产品(A)的生产数量为(50)单位,产品(B)的生产数量为(150)单位。
例13.3:炼油厂利润
一家炼油厂有三种原油(C_1)、(C_2)和(C_3),它们的成本和每日可用量不同。炼油厂可以将每种原油转化为三种汽油:普通汽油、高级汽油和特级汽油,且不同原油转化为不同汽油的产量比例不同。同时,每种汽油有最大市场需求。我们要确定炼油厂应购买每种原油的升数,以最大化每日利润。
设(x_1)、(x_2)和(x_3)分别表示原油(C_1)、(C_2)和(C_3)的购买升数,则目标函数和约束条件如下:
[
\min f (x_1, x_2, x_3) = -[0.7(0.2 x_1 + 0.5 x_2 + 0.7 x_3) + 0.8(0.3 x_1 + 0.3 x_2 + 0.3 x_3) + 0.9(0.5x_1 + 0.2x_2) - 0.4x_1 - 0.2x_2 - 0.1x_3]
]
[
\text{subject to: } 0.2x_1 + 0.5x_2 + 0.7x_3 \leq 9000
]
[
0.3x_1 + 0.3x_2 + 0.3x_3 \leq 8000
]
[
0.5x_1 + 0.2x_2 \leq 7000
]
[
x_1 \leq 10000
]
[
x_2 \leq 12000
]
[
x_3 \leq 15000
]
[
(x_1, x_2, x_3) \geq 0
]
对应的MATLAB代码为:
f = [-0.43, -0.57, -0.62];
A = [0.2, 0.5, 0.7; 0.3, 0.3, 0.3; 0.5, 0.2, 0; 1, 0, 0; 0, 1, 0; 0, 0, 1];
b = [9000, 8000, 7000, 10000, 12000, 15000];
lb = [0, 0, 0];
[x, f] = linprog(f,A, b, [], [], lb, []);
disp(['C1 = ' num2str(x(1)) ' liters/day'])
disp(['C2 = ' num2str(x(2)) ' liters/day'])
disp(['C3 = ' num2str(x(3)) ' liters/day'])
disp(['Profit/day = $' num2str(-f,'%7.2f')])
执行代码后,得到(C_1)的购买量为(9200)升/天,(C_2)的购买量为(12000)升/天,(C_3)的购买量为(1657.1429)升/天,每日利润为(11823.43)美元。
3. 二进制整数规划
二进制整数规划是一种线性规划方法,其中变量只能取(0)或(1)。其问题的表述与线性规划类似,只是变量的边界条件被替换为变量必须是二进制的要求。MATLAB中的二进制整数规划求解器是
bintprog
,基本命令如下:
[xopt, fopt] = bintprog(f,A, b,Aeq, beq, x0, options)
例13.4:背包装载
一个背包的重量容量限制为(35)千克,有七种不同的物品可以放入背包,每种物品有各自的重量和货币价值。我们要确定应放入背包的物品组合,以在满足重量限制的情况下最大化放入物品的总价值。
设(x_j)((j = 1, 2, \cdots, 7))为二进制变量,当物品(j)放入背包时(x_j = 1),否则(x_j = 0)。目标函数和容量约束如下:
[
\min f(x) = -(12x_1 + 12x_2 + 9x_3 + 15x_4 + 90x_5 + 26x_6 + 112x_7)
]
[
\text{subject to: } 3x_1 + 4x_2 + 3x_3 + 3x_4 + 15x_5 + 13x_6 + 16x_7 \leq 35
]
[
x_i = 0 \text{ 或 } 1, \quad i = 1, \cdots, 7
]
对应的MATLAB代码为:
f = [-12, -12, -9, -15, -90, -26, -112];
A = [3, 4, 3, 3, 15, 13, 16];
b = 35;
[x,V] = bintprog(f,A, b);
disp([repmat('x(', 7,1) num2str((1:7)') repmat(') = ', 7,1) int2str(x)])
disp(['Total value of placed objects = $' num2str(-V, '%6.2f')])
执行代码后,得到放入物品的组合为(x(1) = 0),(x(2) = 0),(x(3) = 0),(x(4) = 1),(x(5) = 1),(x(6) = 0),(x(7) = 1),总价值为(217.00)美元。
4. 非线性规划 - 无约束与曲线拟合
非线性规划是指目标函数和/或约束函数是设计变量的非线性函数的优化方法。非线性规划问题可分为无约束方法和有约束方法两类。
4.1 无约束优化
无约束非线性规划方法用于寻找无约束多变量函数的最小值,数学形式为:
[
\min_{x} f(x)
]
其中,(x)是设计变量向量,(f)是标量目标函数。可以使用
fminunc
和
fminsearch
两个函数来求解该问题,它们分别基于导数和非导数优化求解技术。
fminunc
的调用命令为:
[xopt, fopt] = fminunc(@UserFunction, x0, options, p1, p2, ... )
fminsearch
的调用命令为:
x = fminsearch(@UserFunction, x0, options, p1, p2, ... )
下面通过两个例子展示它们的使用。
例13.5:两弹簧系统的平衡位置(重新考虑)
再次考虑两弹簧系统,使用
fminunc
和
fminsearch
来数值求解无约束优化问题,确定势能函数的最小值和最大值位置。
以下是对应的MATLAB代码:
function Example13_5
x0 = [0.5, 5];
k1 = 8.8;
k2 = 1.1;
L1 = 11;
L2 = 11;
F1 = 4.5;
F2 = 4.5;
options = optimset('LargeScale', 'off', 'display', 'off');
H = char('Minimum', 'Maximum');
for neg = 0:1
[xc, fc] = fminunc(@SpringEquilibrium, x0, options, k1, k2, L1, L2, F1, F2, neg);
[xs, fs] = fminsearch(@SpringEquilibrium, x0, options, k1, k2, L1, L2, F1, F2, neg);
disp(H(neg+1,:))
disp(['From fminunc x1 = ' num2str(xc(1)) ' x2 = ' num2str(xc(2)) ...
' PE = ' num2str(fc*(-1)^neg)])
disp(['From fminsearch x1 = ' num2str(xs(1)) ' x2 = ' num2str(xs(2)) ...
' PE = ' num2str(fs*(-1)^neg)])
end
function PE = SpringEquilibrium(x, k1 ,k2, L1, L2, F1, F2, neg)
PE1 = 1/2*k1*(sqrt(x(1)^2+(L1-x(2))^2)-L1)^2;
PE2 = 1/2*k2*(sqrt(x(1)^2+(L2+x(2))^2)-L2)^2;
PE = PE1+PE2-F1*x(1)-F2*x(2);
if neg == 1
PE = -PE;
end
执行代码后,得到最小值和最大值的位置,这些值与之前通过图形估计的值相符。
例13.6:瓶子底部问题
考虑一个两变量函数:
[
D = (6x_1 - 3)^2 + (6x_2 - 3)^2
]
[
f(x_1, x_2) = 0.125(0.5(D + 3) + \sin(D + 2) + 1)
]
优化问题为在(0 \leq (x_1, x_2) \leq 1)的范围内最小化(f(x_1, x_2))。
以下是生成函数表面图的MATLAB代码:
function y = Bottle(x)
[r, c] = size(x);
x1 = x(1:r,1:c/2);
x2 = x(1:r,(c/2+1):c);
D = (6*x1-3).^2+(6*x2-3).^2;
y = -0.125*((D+3)/2+sin(D+2)+1);
[x1, x2] = meshgrid(linspace(0, 1, 30), linspace(0, 1, 30));
mesh(x1, x2, -Bottle([x1, x2]));
zlabel('f')
xlabel('x_1')
ylabel('x_2');
view(-10, 45)
该函数具有轴向对称性,中心有一个类似瓶子底部的圆顶区域,并且有三个区域存在无限多个局部最大值。使用
fminsearch
并设置不同的初始点,会得到不同的局部最大值,这说明
fminsearch
和
fminunc
等除
linprog
和
bintprog
之外的技术通常只能得到局部最优解,并且解的位置依赖于初始点的选择。
4.2 曲线拟合 - 单自变量
给定一组输入参数的输入值(x_{data} = [x_1, x_2, \cdots, x_N])和对应的输出参数的输出值(y_{data} = [y_1, y_2, \cdots, y_N]),考虑一个函数(f(x, a_1, \cdots, a_M)),其中(x)是自变量,(a_m)是我们要通过曲线拟合过程确定的(M)个系数。
定义差值(f_n = f(x_n, a_1, \cdots, a_M) - y_n),最小二乘法用于找到最满足以下条件的系数(a_m):
[
\min_{x} \sum_{n = 1}^{N} f_n^2
]
可以使用
lsqcurvefit
来执行最小二乘非线性曲线拟合,基本命令如下:
[xopt, resnorm] = lsqcurvefit (@UserFunction, x0, xdata, ydata, lb, ub, options, p1, p2, ... )
例13.7:应力 - 应变关系
考虑某种塑料材料的应力 - 应变数据,假设应力(\sigma)和应变(\epsilon)之间的关系为(\epsilon = a + b \ln \sigma)。
应力 - 应变数据如下表所示:
|应力(\sigma) (MPa)|应变(\epsilon)|
| ---- | ---- |
|6.38|0.11|
|7.76|0.16|
|11.20|0.35|
|14.65|0.48|
|18.1|0.61|
|21.55|0.71|
|25.0|0.85|
通过
lsqcurvefit
可以确定系数(a)和(b),从而得到应力 - 应变关系的具体表达式。
综上所述,我们介绍了工程优化问题的基本定义、线性规划、二进制整数规划、非线性规划的无约束和曲线拟合等方法,并通过多个具体例子展示了如何使用MATLAB的相关函数来求解这些问题。在实际应用中,需要根据问题的特点选择合适的优化方法和求解函数,同时要注意初始点的选择可能会影响解的结果。
工程优化方法全解析
5. 非线性规划 - 有约束单目标
非线性规划中的有约束单目标问题涉及在一定约束条件下最小化一个目标函数,下面将详细介绍几种求解这类问题的方法。
5.1 有约束单变量方法
有约束单变量优化问题可通过
fminbnd
函数求解。该函数用于在指定区间内寻找单变量函数的最小值。
基本命令如下:
[xopt, fopt] = fminbnd(@UserFunction, x1, x2, options)
其中,
UserFunction
是目标函数,
x1
和
x2
是变量的取值区间,
options
可设置优化参数。
例 13.11:工厂管道成本
假设工厂管道成本是关于管径的函数,且管径有一定的取值范围。通过
fminbnd
可找到使成本最小的管径。
% 定义目标函数
function cost = pipeCost(diameter)
% 这里简单假设成本函数,实际需根据具体问题确定
cost = diameter^2 + 5 * diameter + 10;
end
% 调用 fminbnd 求解
x1 = 1; % 管径下限
x2 = 10; % 管径上限
[xopt, fopt] = fminbnd(@pipeCost, x1, x2);
disp(['最优管径 = ' num2str(xopt)])
disp(['最小成本 = ' num2str(fopt)])
5.2 有约束多变量方法
对于有约束多变量优化问题,可使用
fmincon
函数。该函数可处理线性和非线性约束。
基本命令如下:
[xopt, fopt] = fmincon(@UserFunction, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)
其中,
UserFunction
是目标函数,
x0
是初始点,
A
和
b
是线性不等式约束系数,
Aeq
和
beq
是线性等式约束系数,
lb
和
ub
是变量的上下界,
nonlcon
是非线性约束函数,
options
可设置优化参数。
例 13.13:两杆桁架
考虑一个两杆桁架结构,要在满足应力和位移约束的条件下,最小化结构的重量。
% 定义目标函数
function weight = trussWeight(x)
% x 为设计变量,如杆的截面积等
% 这里简单假设重量函数,实际需根据具体问题确定
weight = x(1)^2 + x(2)^2;
end
% 定义非线性约束函数
function [c, ceq] = trussConstraints(x)
% c 为非线性不等式约束,ceq 为非线性等式约束
% 这里简单假设约束条件,实际需根据具体问题确定
c = [x(1) + x(2) - 10; -x(1) + 5];
ceq = [];
end
% 初始点
x0 = [1, 1];
% 线性不等式约束
A = [];
b = [];
% 线性等式约束
Aeq = [];
beq = [];
% 变量上下界
lb = [0, 0];
ub = [10, 10];
% 调用 fmincon 求解
[xopt, fopt] = fmincon(@trussWeight, x0, A, b, Aeq, beq, lb, ub, @trussConstraints);
disp(['最优设计变量 = ' num2str(xopt)])
disp(['最小重量 = ' num2str(fopt)])
5.3 二次规划
二次规划问题的目标函数是二次函数,约束条件是线性的。可使用
quadprog
函数求解。
基本命令如下:
[xopt, fopt] = quadprog(H, f, A, b, Aeq, beq, lb, ub, x0, options)
其中,
H
是二次项系数矩阵,
f
是线性项系数向量。
例 13.16:生产计划
假设生产某种产品的成本是关于产量的二次函数,且有生产能力和市场需求等线性约束。
% 二次项系数矩阵
H = [2, 0; 0, 2];
% 线性项系数向量
f = [-4, -5];
% 线性不等式约束
A = [1, 1; 1.25, 0.75; 0, 1];
b = [200, 200, 150];
% 线性等式约束
Aeq = [];
beq = [];
% 变量上下界
lb = [0, 0];
ub = [];
% 初始点
x0 = [0, 0];
% 调用 quadprog 求解
[xopt, fopt] = quadprog(H, f, A, b, Aeq, beq, lb, ub, x0);
disp(['最优产量 = ' num2str(xopt)])
disp(['最小成本 = ' num2str(fopt)])
5.4 半无限约束方法
半无限约束问题是指约束条件中包含无限多个约束的情况。可使用
fseminf
函数求解。
基本命令如下:
[xopt, fopt] = fseminf(@UserFunction, x0, nseminf, @seminfcon, A, b, Aeq, beq, lb, ub, options)
其中,
nseminf
是半无限约束的数量,
seminfcon
是半无限约束函数。
例 13.17:平面两连杆机械手
对于平面两连杆机械手,其运动可能受到一些半无限约束,如避免碰撞等。通过
fseminf
可找到满足约束条件下的最优运动参数。
% 定义目标函数
function energy = robotEnergy(x)
% x 为机械手的运动参数
% 这里简单假设能量函数,实际需根据具体问题确定
energy = x(1)^2 + x(2)^2;
end
% 定义半无限约束函数
function [c, ceq, K1, s1] = robotSeminfcon(x, s)
% c 为非线性不等式约束,ceq 为非线性等式约束
% K1 和 s1 用于半无限约束,具体需根据问题确定
c = [];
ceq = [];
K1 = 1;
s1 = s;
end
% 初始点
x0 = [0, 0];
nseminf = 1; % 半无限约束数量
A = [];
b = [];
Aeq = [];
beq = [];
lb = [-pi, -pi];
ub = [pi, pi];
% 调用 fseminf 求解
[xopt, fopt] = fseminf(@robotEnergy, x0, nseminf, @robotSeminfcon, A, b, Aeq, beq, lb, ub);
disp(['最优运动参数 = ' num2str(xopt)])
disp(['最小能量 = ' num2str(fopt)])
6. 多目标优化
多目标优化问题涉及同时优化多个目标函数。常见的求解方法有
fminimax
和
fgoalattain
。
6.1
fminimax
方法
fminimax
函数用于最小化多个目标函数的最大值。
基本命令如下:
[xopt, fopt] = fminimax(@UserFunction, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)
其中,
UserFunction
需返回多个目标函数的值。
例 13.18:振动平台
对于振动平台,可能需要同时最小化振动幅度和能耗。
% 定义多目标函数
function objectives = vibrationObjectives(x)
% x 为平台的设计参数
amplitude = x(1)^2;
energy = x(2)^2;
objectives = [amplitude, energy];
end
% 初始点
x0 = [0, 0];
A = [];
b = [];
Aeq = [];
beq = [];
lb = [-10, -10];
ub = [10, 10];
% 调用 fminimax 求解
[xopt, fopt] = fminimax(@vibrationObjectives, x0, A, b, Aeq, beq, lb, ub);
disp(['最优设计参数 = ' num2str(xopt)])
disp(['最小最大值 = ' num2str(fopt)])
6.2
fgoalattain
方法
fgoalattain
函数用于使多个目标函数尽可能接近预设的目标值。
基本命令如下:
[xopt, fopt, attainfactor] = fgoalattain(@UserFunction, x0, goal, weight, A, b, Aeq, beq, lb, ub, nonlcon, options)
其中,
goal
是预设的目标值,
weight
是目标函数的权重。
例 13.19:生产计划
在生产计划中,可能希望产品的产量和质量都接近预设目标。
% 定义多目标函数
function objectives = productionObjectives(x)
% x 为生产计划参数
quantity = x(1);
quality = x(2);
objectives = [quantity, quality];
end
% 预设目标值
goal = [100, 90];
% 权重
weight = [1, 1];
% 初始点
x0 = [0, 0];
A = [];
b = [];
Aeq = [];
beq = [];
lb = [0, 0];
ub = [200, 100];
% 调用 fgoalattain 求解
[xopt, fopt, attainfactor] = fgoalattain(@productionObjectives, x0, goal, weight, A, b, Aeq, beq, lb, ub);
disp(['最优生产计划参数 = ' num2str(xopt)])
disp(['实际目标值 = ' num2str(fopt)])
disp(['达到因子 = ' num2str(attainfactor)])
7. 基于遗传算法的优化
遗传算法是一种模拟自然选择和遗传机制的优化方法,可用于解决复杂的优化问题。MATLAB 中提供了
ga
和
gamultiobj
函数分别用于单目标和多目标遗传算法优化。
7.1 单目标遗传算法
ga
函数用于单目标遗传算法优化。
基本命令如下:
[xopt, fopt] = ga(@UserFunction, nvars, A, b, Aeq, beq, lb, ub, nonlcon, options)
其中,
nvars
是变量的数量。
例 13.20:重新考虑的背包装载
再次考虑背包装载问题,使用遗传算法求解。
% 定义目标函数
function value = knapsackValue(x)
% x 为物品选择向量,0 或 1
weights = [3, 4, 3, 3, 15, 13, 16];
values = [12, 12, 9, 15, 90, 26, 112];
totalWeight = sum(x .* weights);
if totalWeight > 35
value = -inf; % 超重则目标值为负无穷
else
value = -sum(x .* values); % 最大化价值,这里取负
end
end
% 变量数量
nvars = 7;
A = [];
b = [];
Aeq = [];
beq = [];
lb = zeros(1, nvars);
ub = ones(1, nvars);
% 调用 ga 求解
[xopt, fopt] = ga(@knapsackValue, nvars, A, b, Aeq, beq, lb, ub);
disp(['最优物品选择 = ' num2str(xopt)])
disp(['最大价值 = ' num2str(-fopt)])
7.2 多目标遗传算法
gamultiobj
函数用于多目标遗传算法优化。
基本命令如下:
[xopt, fopt] = gamultiobj(@UserFunction, nvars, A, b, Aeq, beq, lb, ub, nonlcon, options)
例 13.22:重新考虑的两杆桁架 - 多目标
对于两杆桁架问题,同时考虑重量和应力两个目标。
% 定义多目标函数
function objectives = trussMultiObjectives(x)
% x 为设计变量
weight = x(1)^2 + x(2)^2;
stress = x(1) + x(2);
objectives = [weight, stress];
end
% 变量数量
nvars = 2;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [0, 0];
ub = [10, 10];
% 调用 gamultiobj 求解
[xopt, fopt] = gamultiobj(@trussMultiObjectives, nvars, A, b, Aeq, beq, lb, ub);
disp(['最优设计变量集合 = ' num2str(xopt)])
disp(['目标函数值集合 = ' num2str(fopt)])
8. 总结
本文详细介绍了多种工程优化方法,包括线性规划、二进制整数规划、非线性规划(无约束、有约束单目标、多目标)以及基于遗传算法的优化方法。同时,通过大量具体的例子展示了如何使用 MATLAB 中的相应函数来求解这些优化问题。
不同的优化方法适用于不同类型的问题,在实际应用中,需要根据问题的特点选择合适的方法。例如,线性规划适用于目标和约束函数均为线性的问题;非线性规划则可处理更复杂的非线性目标和约束;遗传算法对于复杂的、多峰的优化问题具有较好的求解能力。
此外,在使用优化函数时,初始点的选择、约束条件的设置以及优化参数的调整都会影响求解结果。因此,在实际操作中,需要根据具体问题进行适当的调整和试验,以获得更准确和有效的优化结果。
以下是不同优化方法的对比表格:
|优化方法|适用问题类型|MATLAB 函数|
| ---- | ---- | ---- |
|线性规划|目标和约束函数为线性|linprog|
|二进制整数规划|变量为二进制的线性规划|bintprog|
|非线性规划 - 无约束|无约束多变量函数|fminunc, fminsearch|
|非线性规划 - 有约束单目标 - 单变量|单变量有约束问题|fminbnd|
|非线性规划 - 有约束单目标 - 多变量|多变量有约束问题|fmincon|
|非线性规划 - 二次规划|目标函数为二次,约束为线性|quadprog|
|非线性规划 - 半无限约束|包含无限多个约束的问题|fseminf|
|多目标优化|同时优化多个目标|fminimax, fgoalattain|
|遗传算法 - 单目标|复杂单目标问题|ga|
|遗传算法 - 多目标|复杂多目标问题|gamultiobj|
通过掌握这些优化方法和 MATLAB 函数的使用,工程师和研究人员可以更高效地解决各种工程优化问题,提高系统的性能和效率。
下面是一个简单的选择优化方法的流程图:
graph TD;
A[问题类型] --> B{线性问题?};
B -- 是 --> C[线性规划 linprog];
B -- 否 --> D{变量为二进制?};
D -- 是 --> E[二进制整数规划 bintprog];
D -- 否 --> F{有约束?};
F -- 否 --> G[无约束非线性规划 fminunc/fminsearch];
F -- 是 --> H{单目标?};
H -- 是 --> I{单变量?};
I -- 是 --> J[有约束单变量 fminbnd];
I -- 否 --> K{目标二次且约束线性?};
K -- 是 --> L[二次规划 quadprog];
K -- 否 --> M{有半无限约束?};
M -- 是 --> N[半无限约束 fseminf];
M -- 否 --> O[有约束多变量 fmincon];
H -- 否 --> P[多目标优化 fminimax/fgoalattain];
Q{复杂问题?} --> R{单目标?};
R -- 是 --> S[遗传算法 - 单目标 ga];
R -- 否 --> T[遗传算法 - 多目标 gamultiobj];
这个流程图可以帮助用户根据问题的特点快速选择合适的优化方法。在实际应用中,还需要结合具体问题进行进一步的分析和调整。
超级会员免费看
8万+

被折叠的 条评论
为什么被折叠?



