参考学习b站:
线性规划
[x fval] = linprog(c, A, b, Aeq, beq, lb,ub, x0)
c是目标函数的系数向量,A是不等式约束Ax<=b
的系数矩阵,b是不等式约束Ax<=b
的常数项
Aeq是等式约束Aeq x=beq
的系数矩阵,beq是等式约束Aeq x=beq
的常数项
lb是X的下限,ub是X的上限,X是向量[x1,x2,...xn]'
, 即决策变量。
迭代的初始值为x0(一般不用给)
返回的x表示最小值处的x取值 ; fval表示最优解处时取得的最小值
例题:
max Z = 2 x 1 + 3 x 2 − 5 x 3 s . t . { x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 \begin{aligned}\max Z=2x_{1}+3x_{2}-5x_{3}\\ s. t.\begin{cases}x_{1}+x_{2}+x_{3}=7\\ 2x_{1}-5x_{2}+x_{3}\geq 10\\ x_{1}+3x_{2}+x_{3}\leq 12\\ x_{1},x_{2},x_{3}\geq 0\end{cases}\end{aligned} maxZ=2x1+3x2−5x3s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧x1+x2+x3=72x1−5x2+x3≥10x1+3x2+x3≤12x1,x2,x3≥0
求解:
c = [-2 -3 5]';
A = [-2 5 -1;
1 3 1];
b = [-10 12];
Aeq = ones(1,3);
beq = 7;
lb = zeros(3,1);
% ub不写,则意味着没有上界的约束
[x fval] = linprog(c, A, b, Aeq, beq, lb)
fval = -fval % 注意这个fval要取负号
结果:
x =
6.4286
0.5714
0
fval =
-14.5714
fval =
14.5714
非线性规划
[x,fval] = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlfun,option)
x0表示给定的初始值(用行向量或者列向量表示),必须得写
A b表示线性不等式约束
Aeq beq 表示线性等式约束
lb ub 表示上下界约束
@fun表示目标函数
@nonlfun表示非线性约束的函数
option 表示求解非线性规划使用的方法
例题:
min f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 s . t . { x 1 2 − x 2 + x 3 2 ≥ 0 x 1 + x 2 2 + x 3 2 ≤ 20 − x 1 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 , x 2 , x 3 ≥ 0 \begin{aligned}\min f\left( x\right) =x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+8\\ s.t. \begin{cases}x_{1}^{2}-x_{2}+x_{3}^{2}\geq 0\\ x_{1}+x_{2}^{2}+x_{3}^{2}\leq 20\\ -x_{1}-x_{2}^{2}+2=0\\ x_{2}+2x_{3}^{2}=3\\ x_{1},x_{2},x_{3}\geq 0\end{cases}\end{aligned} minf(x)=x12+x22+x32+8s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x12−x2+x32≥0x1+x22+x32≤20−x1−x22+2=0x2+2x32=3x1,x2,x3≥0
求解:
fun.m
function f = fun(x)
% f = x(1)^2+x(2)^2 +x(3)^2+8 ;
% x实际上是一个向量,我们可以使用矩阵的运算符号对其计算
f = sum(x.*x) + 8;
end
nonlfun.m
function [c,ceq] = nonlfun(x)
% 非线性不等式约束
% 这里的x是一个向量!不能把x(1)写成x1
c = [-x(1)^2+x(2)-x(3)^2;
x(1)+x(2)^2+x(3)^2-20];
% 非线性等式约束
ceq = [-x(1)-x(2)^2+2;
x(2)+2*x(3)^2-3];
end
f.m
% 可以将Matlab的计算结果显示为一般的长数字格式(默认会保留四位小数,或使用科学计数法)
format long g
x0 = [1 1 1]; %任意给定一个初始值
lb = [0 0 0]; % 决策变量的下界
[x,fval] = fmincon(@fun,x0,[],[],[],[],lb,[],@nonlfun)
结果:
x =
0.552167405729277 1.20325915507969 0.947824046150443
fval =
10.6510918606939
可以用蒙特卡罗寻找初始值x0
clc,clear;
n=1000000;
x1= unifrnd(0,2,n,1); % 生成在[0,2]之间均匀分布的随机数组成的n行1列的向量构成x1
x2 = sqrt(2-x1); % 根据非线性等式约束用x1计算出x2
x3 = sqrt((3-x2)/2); % 根据非线性等式约束用x2计算出x3
fmin=+inf;
for i=1:n
%构造x向量, 不要写成:x =[x1, x2, x3]
x = [x1(i), x2(i), x3(i)];
if (-x(1)^2+x(2)-x(3)^2<=0) & (x(1)+x(2)^2+x(3)^2-20<=0)
result =sum(x.*x) + 8 ;
if result < fmin
fmin = result;
x0 = x;
end
end
end
disp('蒙特卡罗选取的初始值为:'); disp(x0)
结果:
蒙特卡罗选取的初始值为:
0.5522 1.2033 0.9478
整数规划
线性规划的函数:[x fval] = linprog(c, A, b, Aeq, beq, lb,ub, x0)
线性整数规划的函数:[x fval] = linprog(c, intcon, A, b, Aeq, beq, lb,ub)
例题:
min Z = − 3 x 1 − 2 x 1 − x 3 s . t . { x 1 + x 2 + x 3 ≤ 7 4 x 1 + x 2 + x 3 = 12 x 1 , x 2 ≥ 0 x 3 = 0 , 1 \begin{aligned}\min Z=-3x_{1}-2x_{1}-x_{3}\\ s.t. \begin{cases}x_{1}+x_{2}+x_{3}\leq 7\\ 4x_{1}+x_{2}+x_{3}=12\\ x_{1},x_{2}\geq 0\\ x_{3}= 0,1\end{cases}\end{aligned} minZ=−3x1−2x1−x3s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧x1+x2+x3≤74x1+x2+x3=12x1,x2≥0x3=0,1
求解:
c=[-3;-2;-1];
intcon=3; % x3限定为整数
A=ones(1,3); b=7;
Aeq=[4 2 1]; beq=12;
lb=zeros(3,1);
ub=[+inf;+inf;1]; %x(3)为0-1变量
[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
结果:
x =
0
5.5000
1.0000
fval =
-12