数学规划模型

1.线性规划的求解方法

线性规划问题的标准形式为:
\left\{\begin{array}{l}{\min z=c_{1} x_{1}+c_{2} x_{2}+\cdots+c_{n} x_{n}} \\ {a_{11} x_{1}+a_{12} x_{2}+\cdots+a_{1 n} x_{n}=b_{1}} \\ {a_{21} x_{1}+a_{22} x_{2}+\cdots+a_{2 n} x_{n}=b_{2}} \\ {\dots} \\ {a_{m 1} x_{1}+a_{m 2} x_{2}+\cdots+a_{m n} x_{n}=b_{m}} \\ {x_{1}, x_{2}, \cdots, x_{n} \geqslant 0}\end{array}\right.
或者写成矩阵形式:
\left\{\begin{array}{l}{\min Z=C x} \\ {A x=b} \\ {x \geqslant 0}\end{array}\right.
一般来说线性规划包括单纯形规划和多目标规划

1.1单纯形线性规划

单纯形法时从所有基本的可行解的一个较小部分中通过迭代过程选出最优解
matlab中求解线性规划的函数时linprog,使用方法如下:
一般情况下,Linprog命令的参数形式为[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub,x0),下面分别介绍各参数的含义.

  • [x,fval,exitflag,output,lamnda]:返回值中x为最优解,fval为最优值,output包含优化信息的输出变量
  • f:表示目标函数中各个变量前面的系数向量,如果是求最小值问题,那么f就是各个变量的系数,如果是求最大值问题,那么f就是各个变量的系数的相反数.
  • A,b:表示不等式约束Ax\leq b中的矩阵A和向量b,若不存在不等式关系
  • Aeq,beq:表示线性等式约束Aeq*x =beq中的矩阵Aeq和向量beq,若等式约束不存在则令Aeq=[ ],beq=[ ]
  • lb,ub :分别表示自变量的上下界组成的向量,如果没有上下界,该选项用[]表示,如果只有部分变量有上下界,其余的变量没有,那么可以把没有上下界的变量的上下界设为-inf或者inf使lb或者ub的长度符合要求.
  • x0:表示变量的初始值,可以缺省。

有如下例子:
min f(x)=-5 x_{1}-4 x_{2}-6 x_{3}
\left\{\begin{array}{l}{x_{1}-x_{2}+x_{3} \leqslant 20} \\ {3 x_{1}+2 x_{2}+4 x_{3} \leqslant 42} \\ {3 x_{1}+2 x_{2} \leqslant 30} \\ {0 \leqslant x_{1}, 0 \leqslant x_{2}, 0 \leqslant x_{3}}\end{array}\right.
由于没有等式约束,所以Aeq=[ ],beq=[ ]
不等式的条件系数为:
A=\left[ \begin{array}{rrr}{1} & {-1} & {1} \\ {3} & {2} & {4} \\ {3} & {2} & {0}\end{array}\right], \quad b=\left[ \begin{array}{l}{20} \\ {42} \\ {30}\end{array}\right]
由于没有上界要求:
l b=\left[ \begin{array}{l}{0} \\ {0} \\ {0}\end{array}\right], \quad u b=\left[ \begin{array}{l}{\text { inf }} \\ {\text { inf }} \\ {\text { inf }}\end{array}\right]

clear all
clc
f=[-5;-4;-6];
A=[1 -1 1;3 2 4;3 2 0];
b=[20;42;30];
lb=zeros(3,1);
[x,fval,exitflag,output,lambda]=linprog(f,A,b,[],[],lb)

>>
x =

    0.0000
   15.0000
    3.0000


fval =

  -78.0000

exitflag =

     1

exitflag =1表示正常收敛于解x处。

1.2 多目标线性规划

多目标线性规划有着两个或两个以上的目标函数
\max \left\{\begin{array}{c}{z_{1}=c_{11} x_{1}+c_{12} x_{2}+\cdots+c_{1 n} x_{n}} \\ {z_{2}=c_{21} x_{1}+c_{22} x_{2}+\cdots+c_{2 n} x_{n}} \\ {\vdots \quad \vdots} \\ {z_{r}=c_{r 1} x_{1}+c_{r 2} x_{2}+\cdots+c_{m} x_{n}}\end{array}\right.
约束条件为:
\left\{\begin{array}{l}{a_{11} x_{1}+a_{12} x_{2}+\cdots+a_{1 n} x_{n} \leqslant b_{1}} \\ {a_{21} x_{1}+a_{22} x_{2}+\cdots+a_{2 n} x_{n} \leqslant b_{2}} \\ {\vdots \quad \vdots} \\ {a_{m 1} x_{1}+a_{m 2} x_{2}+\cdots+a_{m n} x_{n} \leqslant b_{m}} \\ {x_{1}, x_{2}, \cdots, x_{n} \geqslant 0}\end{array}\right.
给出如下例子:
\begin{equation} \begin{array}{l}{\max f_{1}(x)=3 x_{1}-2 x_{2}} \\ {\max f_{2}(x)=-4 x_{1}-3 x_{2}}\end{array} \end{equation}
s.t.\begin{equation} \left\{\begin{array}{l}{2 x_{1}+3 x_{2} \leq 18} \\ {2 x_{1}+x_{2} \leq 10} \\ {x_{1}, x_{2} \geqslant 0}\end{array}\right. \end{equation}

1.2.1 理想点法

max Z = Cx
先求解r个单目标问题,设其最优值分别为Z^*_j,称为值域中的一个理想点,寻求距离Z^*_j最近的Z作为近似值,最直接的方法就是构造最短距离理想点法,构造评价函数:
\phi(Z) = \left(\sum_{i=1}^r[Zi-Z^*_j]^2\right)^{\frac{1}{2}}
然后最小化评价函数,将他的最优解x^*作为最优解.
在matlab中流程如下,先单个求解

clear all
clc
f=[3;-2]; 
A=[2,3;2,1]; 
b=[18;10];
lb=[0;0];
[x,fval]=linprog(f,A,b,[],[],lb)
>>
fval =

  -12.0000

clear all
clc
f=[-4;-3]; 
A=[2,3;2,1]; 
b=[18;10];
lb=[0;0];
[x,fval]=linprog(f,A,b,[],[],lb)
>>
fval =

  -24.0000

于是得到理想点(12,24)
然后求解如下模型:
min\phi[f(x)] = \left([f_1(x)-12]^2+[f_2(x)-24]^2\right)^{\frac{1}{2}}
s.t.\begin{equation} \left\{\begin{array}{l}{2 x_{1}+3 x_{2} \leq 18} \\ {2 x_{1}+x_{2} \leq 10} \\ {x_{1}, x_{2} \geqslant 0}\end{array}\right. \end{equation}

clear all
clc
A = [2,3;2,1];
b = [18,10];
x0 = [1,1];
lb = [0,0];
x = fmincon('((-3*x(1)+2*x(2)-12)^2+(4*x(1)+3*x(2)-24)^2)^(1/2)',x0,A,b,[],[],lb,[])
>>
x =

    0.5268    5.6488

得到最优的x

1.2.2 线性加权和方法

人们总希望给重要的指标较大的权重,将多目标问题转化为了所有目标加权求和的单目标问题
构造评价函数如下:
minZ(x) = \sum_{i=1}^rw_iZ_i(x)
maxZ = Cx
对于前面例子权重系数分别取0.5和0.5,进行求解
min[0.5\times(3x_1-2x_2)+0.5\times(-4x_1-3x_2)]

clear all
clc
f=[-0.5;-2.5];
A=[2,3;2,1]; 
b=[18;10]; 
lb=[0;0];
[x,fval]=linprog(f,A,b,[],[],lb)
>>
x =

    0.0000
    6.0000
fval =

  -15.0000

1.2.3 最大最小法

在决策时采用保守策略时最为稳妥的,在最坏的情况下,寻求最好的结果,可以构造如下的评价函数
\phi(x) = maxZ_i
min\phi[Z(x)] = min maxZ_i(x)
然后求解
max Z = Cx

function f = ex1019(x)
f(1) = 3*x(1)-2*x(2);
f(2) = -4*x(1)-3*x(2);
clear all
clc
x0=[1;1];
A=[2,3;2,1];
b=[18;10];
lb=zeros(2,1);
[x,fval]=fminimax('ex1019',x0,A,b,[],[],lb,[]) %这里使用fminimax函数

1.3 整数规划

当在实际问题中,部分自变量取整数时可以使用整数规划的方法,通过调用matlab中的intlinprog()实现,调用格式如下:

  • [x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,options):需要注意其中的intcon,intcon = [1,2,7] 表示 x(1), x(2), x(7) 只能取整数

给出例子如下:
\min _{x}\left(-3 x_{1}-2 x_{2}-x_{3}\right)
\begin{equation} \left\{\begin{array}{l}{x_{3} ,\text { binary }} \\ {x_{1}, x_{2} \geq 0} \\ {x_{1}+x_{2}+x_{3} \leq 7} \\ {4 x_{1}+2 x_{2}+x_{3}=12}\end{array}\right. \end{equation}

clc
clear all
intcon = 3;
f = [-3;-2;-1];
A = [1,1,1];
b = 7;
Aeq = [4,2,1];
beq = 12;
lb = zeros(3,1);
ub = [Inf,Inf,1]; % x3的上界为1保证x3只能取0,1
[x,fval,exitflag,output] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub);
x
fval

>>
x =

         0
    5.5000
    1.0000


fval =

  -12.0000

2.非线性规划

非线性规划安约束条件可以分为以下三类:

  1. 无约束非线性规划
  2. 等式约束非线性规划
  3. 不等式约束非线性规划

2.1 非线性规划的标准形式

2.2 二次规划

非线性规划的目标函数为自变量的二次函数,约束条件全是线性函数,这种规划称为二次规划。
其标准数学模型为:
\begin{equation} \min _{x} \frac{1}{2} x^{\mathrm{T}} \boldsymbol{H} x+f^{\mathrm{T}} \boldsymbol{x} \end{equation}
s.t.\begin{equation} \left\{\begin{array}{l}{A \cdot x \leqslant b} \\ {A e q \cdot x=b e q} \\ {l b \leqslant x \leqslant u b}\end{array}\right. \end{equation}
其中H,A和Aeq为矩阵,其余为列向量
matlab中利用quadprog求解二次规划问题,调用格式为:

  • x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options): 其中lb,ub为上下界,options为指定优化方法。
  • [x,fval,exitflag,output,lambda] = quadprog(...): 基本与此前函数类似,其中lambda为拉格朗日函数的乘子。

【例】求解以下最优化问题
目标函数为:
\begin{equation} f(x)=\frac{1}{2} x_{1}^{2}+x_{2}^{2}-x_{1} x_{2}-2 x_{1}-6 x_{2} \end{equation}
\begin{equation} \left\{\begin{array}{l}{x_{1}+x_{2} \leqslant 2} \\ {-x_{1}+2 x_{2} \leqslant 2} \\ {2 x_{1}+x_{2} \leqslant 3} \\ {x_{1} \geqslant 0, x_{2} \geqslant 0}\end{array}\right. \end{equation}
目标函数可以修改为:
\begin{equation} \begin{aligned} f(x) &=\frac{1}{2} x_{1}^{2}+x_{2}^{2}-x_{1} x_{2}-2 x_{1}-6 x_{2} \\ &=\frac{1}{2}\left(x_{1}^{2}-2 x_{1} x_{2}+2 x_{2}^{2}\right)-2 x_{1}-6 x_{2} \end{aligned} \end{equation}
其中:
\begin{equation} H=\left[ \begin{array}{rr}{1} & {-1} \\ {-1} & {2}\end{array}\right], \quad f=\left[ \begin{array}{l}{-2} \\ {-6}\end{array}\right], \quad x=\left[ \begin{array}{c}{x_{1}} \\ {x_{2}}\end{array}\right], \quad A=\left[ \begin{array}{rr}{1} & {1} \\ {-1} & {2} \\ {2} & {1}\end{array}\right], \quad b=\left[ \begin{array}{c}{27} \\ {2} \\ {3}\end{array}\right] \end{equation}

clc
clear all
H = [1,-1;-1,2];
f = [-2,-6];
A = [1,1;-1,2;2,1];
b = [27,2,3];
lb = [0,0];
[x,fval,exitflag] = quadprog(H,f,A,b,[],[],lb,[]);
x
fval

>>
x =

    0.8000
    1.4000


fval =

   -8.8400

2.3 无约束规划

1. fminbnd函数
用来求固定区间内单变量函数的最小值
其调用格式如下:

  • x = fminbnd(fun,x1,x2,options,p1,p2...) : 其中x1,x2为区间,options为优化方法,如果没有options,令options = [ ].
  • [x,fval,exitflag,output] = fminbnd(...) :与之前函数类似
clc
clear all
[x,f_min] = fminbnd('sin(2*x)',0,2pi);

2. fminsearch函数
用于求多变量无约束的函数的最小值,格式为:

  • [x,fval,exitflag,options] = fminsearch(fun,x0,options): x0为初值

【注意】:

  1. 对于求解二次以上问题,fminunc更加有效,但对于高度非线性不连续问题则相反
  2. fminsearch不适合求平方和问题,lsqnonlin更有效

3. fminunc函数(重要)
常用于求多变量无约束的函数的最小值

  • [x,fval,exitflag,output,grad,hessian] = fminunc(fun,x0,options): grad是解x处的梯度值,hessian将解x处的Hessian矩阵返回
clear all
clc
x0=[-1.2,1];
[x,fval]=fminunc('100*(x(2)-x(1)^2)^2+(1-x(1))^2',x0)
>>
x =

    1.0000    1.0000


fval =

   2.8336e-11

2.4 有约束规划

1. fmincon函数
求解多变量有约束的非线性函数的最小值,调用格式如下:

  • [x,fval,exitflag,output,lambda,grad,hessian] = fmincon(...)
  • x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,noncon,options) :其中noncon是计算非线性等式约束c(x)\leq0和非线性不等式约束ceq = 0
    给出丧心病狂的例子如下:
    【例】
    \begin{equation} \min f\left(x_{1}, x_{2}, x_{3}\right)=x_{1}^{2}\left(x_{2}+2\right) x_{3} \end{equation}
    s.t.\begin{equation} \left\{\begin{array}{l}{350-163 x_{1}^{-2.86} x_{3}^{0.86} \leqslant 0} \\ {10-4 \times 10^{-3} x_{1}^{-4} x_{2} x_{3}^{3} \leqslant 0} \\ {x_{1}\left(x_{2}+1.5\right)+4.4 \times 10^{-3} x_{1}^{-4} x_{2} x_{3}^{3}-3.7 x_{3} \leqslant 0} \\ {375-3.56 \times 10^{5} x_{1} x_{2}^{-1} x_{3}^{-2} \leqslant 0} \\ {4-x_{3} / x_{1} \leqslant 0} \\ {1 \leqslant x_{1} \leqslant 4} \\ {4.5 \leqslant x_{2} \leqslant 50} \\ {10 \leqslant x_{3} \leqslant 30}\end{array}\right. \end{equation}
    创建目标函数:
function f = ex10_6a(x)
f = x(1)*x(1)*(x(2)+2)*x(3);

创建非线性约束条件函数:

function[c,ceq] = ex10_6b(x)
c(1) = ...
c(2) = ...
c(3) = ...
c(4) = ...
c(5) = ...
ceq = 0;

求解程序如下:

clear all
clc
x0=[2 25 20]';
lb=[1 4.5 10]';
ub=[4 50 30]';
[x,fval,exitflag]=fmincon(@ex10_6a,x0,[],[],[],[],lb,ub,@ex10_6b)

2. fseminf 函数
\min _{x}\{F(x) | C(x) \leq 0, \operatorname{Ceq}(x)=0, \operatorname{PHI}(x, w) \leq 0\}
s.t.\left\{\begin{array}{l}{A^{*} x \leq B} \\ {A e q^{*} x=B e q}\end{array}\right.
上述问题的 Matlab 命令格式为:
X=FSEMINF(FUN,X0,NTHETA,SEMINFCON,A,B,Aeq,Beq)
其中 FUN 用于定义目标函数,X0 为 x 的初始值;NTHETA 是半无穷约束 PHI(x,w) 的个数;函数 SEMINFCON 用于定义非线性不等式约束C(x),非线性等
式约束 Ceq(x) 和半无穷约束 PHI(x) 的每一个分量函数,函数 SEMINFCON 有两个输入参量 X和S,S是推荐的取样步长,也许不被使用。
【例】
min f(x) = \sum_{i=1}^3(x_i-0.5)^2
约束为:
K_{1}\left(x, w_{1}\right)=\sin \left(w_{1} x_{1}\right) \cos \left(w_{1} x_{2}\right)-\frac{1}{1000}\left(w_{1}-50\right)^{2}-\sin \left(w_{1} x_{3}\right)-x_{3} \leq 1\\ K_{2}\left(x, w_{2}\right)=\sin \left(w_{2} x_{2}\right) \cos \left(w_{2} x_{1}\right)-\frac{1}{1000}\left(w_{2}-50\right)^{2}-\sin \left(w_{2} x_{3}\right)-x_{3} \leq 1\\1 \leq w_{1} \leq 100,1 \leq w_{2} \leq 100

function f = fun6(x)
f = sum((x-0.5).^2);

function [c,ceq,k1,k2,s]=fun8(x,s);
c=[];ceq=[];
if isnan(s(1,1))
    s=[0.2,0;0.2 0];
end
%取样值
w1=1:s(1,1):100;
w2=1:s(2,1):100;
%半无穷约束
k1=sin(w1*x(1)).*cos(w1*x(2))-1/1000*(w1-50).^2-sin(w1*x(3))-x(3)-1;
k2=sin(w2*x(2)).*cos(w2*x(1))-1/1000*(w2-50).^2-sin(w2*x(3))-x(3)-1;
%画出半无穷约束的图形
plot(w1,k1,'-',w2,k2,'+');

[x,y]  =  fseminf(@fun6,rand(3,1),2,@fun7)
>>
x =

    0.9525
    0.8183
    0.3714


y =

    0.3227

3.fminimax()函数


上述问题的 Matlab 命令为
X=FMINIMAX(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON)
【例】
求函数族取最大最小值时得x值

function f=fun9(x);
f=[2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304
    -x(1)^2-3*x(2)^2
    x(1)+3*x(2)-18
    -x(1)-x(2)
    x(1)+x(2)-8];

[x,y] = fminimax(@fun9,rand(2,1))
>>
x =

    4.0000
    4.0000


y =

    0.0000
  -64.0000
   -2.0000
   -8.0000
   -0.0000
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,513评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,312评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,124评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,529评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,937评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,913评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,084评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,816评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,593评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,788评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,267评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,601评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,265评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,158评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,953评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,066评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,852评论 2 277