最优化方法的考查重点为:大M法、两阶段法、对偶性质(已知原问题最优解,求对偶问题最优解)、分支定界法、目标规划和运输模型的数学模型(列出来即可,不需要计算)
线性规划
线性规划的标准形式为:
maxz=∑j=1ncjxj
max z = \sum_{j=1}^n c_jx_j
maxz=j=1∑ncjxj
s.t.={∑j=1naijxj,i = 1,2,...mxj≥0,j = 1,2,...m \begin{equation} s.t. = \begin{cases} \sum\limits_{j=1}^n a_{ij}x_j, & \text{i = 1,2,...m} \\ x_j ≥ 0, & \text{j = 1,2,...m} \end{cases} \end{equation} s.t.=⎩⎨⎧j=1∑naijxj,xj≥0,i = 1,2,...mj = 1,2,...m
式中:bj≥0,i=1,2,...,mb_j ≥ 0,i =1,2,...,mbj≥0,i=1,2,...,m
而MATLAB中基于求解器的标准形式为
minfTx
min f^Tx
minfTx
s.t.={A⋅x≤bj,Aeq⋅x=beq,lb≤x≤ub \begin{equation} s.t. = \begin{cases} A · x ≤ bj,\\ Aeq · x = beq,\\ lb≤x≤ub \end{cases} \end{equation} s.t.=⎩⎨⎧A⋅x≤bj,Aeq⋅x=beq,lb≤x≤ub
如果原目标函数中存在类似 ∣xi∣|x_i|∣xi∣ 的绝对值式子,解决办法为 xi=ui−vi,∣xi∣=ui+vix_i = u_i - v_i,|x_i| = u_i + v_ixi=ui−vi,∣xi∣=ui+vi,然后带入原式即可
线性规划的基本定理
- 若线性规划可行解K非空,则K是凸集
- 线性规划的可行解集合K的点X是极点的充要条件为X是基本可行解。
- 极点是基本可行解,反之,基本可行解一定是极点,但它们并非一一对应,有可能两个或几个基本可行解对应于同一极点
- 若线性规划有最优解,则最优值一定可以在可行解集合的某个极点上到达,最优解就是极点的坐标向量。
- 若最优解唯一,则最优解只能在某一极点上达到,若具有多重最优解,则最优解是某些极点的凸组合,最优解是可行解集的极点或界点,不可能是可行解集的内点。
- 若线性规划的可行解集非空且有界,则一定有最优解;若可行解集无界,则线性规划可能有最优解,也可能没有最优解。
寻求最优解不是在无限个可行解中去找,而是在有限个基本可行解中去寻求。
单纯形法
单纯形计算方法是先求出一个初始基可行解并判断它是否最优,若不是最优,再换一个基可行解并判断,直到得出最优解或无最优解。它是一种逐步逼近最优解的迭代方法。
当系数矩阵A中可以观察得到一个可行基时(通常是一个单位矩阵或m个线性无关的单位向量组成的矩阵),可以通过解线性方程组求得基本可行解。
检验数:目标函数用非基变量表达时的变量系数
单纯形表计算步骤
-
求初始基可行解,列出初始单纯形表,求出检验数。其中基变量的检验数必为零;
-
判断:
- 最优表中所有非基变量的检验数非零,则线规划具有唯一最优解。
- 某个λ>0且该列系数小于零,则线性规划具有无界解
- 最优表中存在非基变量的检验数为零,则线则性规划具有多重最优解。
- 若存在λ>0且a(i=1,…m)不全非正,则进行换基;
-
检验数大的作为进基列,如果是极小值问题,选择检验数小于零的作为进基列
-
θ列=b进基列\frac{b}{进基列}进基列b,θ小的作为出基行
-
进基列和出基行交叉处为主元素
-
化简时将主元素化为1,主元素同列其它元素化为0
退化基本可行解的判断:存在某个基变量为零的基本可行解。
大M和两阶段单纯形法
在实际问题中有些模型并不含有单位矩阵,为了得到一组基向量和初基可行解,在约束条件的等式左端加一组虚拟变量MxiMx_iMxi,得到一组基变量。这种人为加的变量称为人工变量,构成的可行基称为人工基,用大M法或两阶段法求解,这种用人工变量作桥梁的求解方法称为人工变量法。
M是一个很大的抽象的数,不需要给出具体的数值,可以理解为它能大于给定的任何一个确定数值
两阶段单纯形法与大M单纯形法的目的类似,将人工变量从基变量中换出,以求出原问题的初始基本可行解。将问题分成两个阶段求解:
第一阶段的目标函数是minw=∑i=1mRi(人工变量的和)min w = \sum\limits_{i=1}^m R_i(人工变量的和)minw=i=1∑mRi(人工变量的和),约束条件是加入人工变量后的约束方程,当第一阶段的最优解中没有人工变量作基变量时,得到原线性规划的一个基本可行解,当第一阶段的最优解w≠0时,说明还有不为零的人工变量是基变量,则原问题无可行解。
第二阶段,在第一阶段的最后一张最优表基础上,目标函数换成问题中的,继续进行计算可得最优解
线性规划中的对偶问题
| 原问题(或对偶问题) | 对偶问题(或原问题) | ||
|---|---|---|---|
| 目标函数max,目标函数系数(资源限量),约束条件系数矩阵A(AT)A(A^T)A(AT) | 目标函数min,资源限量(目标函数系数),约束条件系数矩阵AT(A) | ||
| 变量 | n个变量 第j个变量≥0 第j个变量≤0 第j个变量无约束 | 约束 | n个约束 第j个约束为≥ 第j个约束为≤ 第j个约束为= |
| 约束 | m个约束 第i个约束≤ 第i个约束≥ 第i个约束为= | 变量 | m个变量 第i个变量≥0 第i个变量≤0 第i个变量无约束 |
对偶性质
设原问题LP为:
maxZ=CX
max Z = CX
maxZ=CX
{AX≤bX≥0 \begin{equation} \begin{cases} AX≤b\\ X ≥0 \end{cases} \end{equation} {AX≤bX≥0
对偶问题DP为:
minw=Yb
min w = Yb
minw=Yb
{YA≥CY≥0 \begin{equation} \begin{cases} YA ≥ C\\ Y ≥ 0 \end{cases} \end{equation} {YA≥CY≥0
对称性:对偶问题的对偶是原问题
弱对偶性:CX ≤ Yb
这一性质说明了两个线性规划互为对偶时,求最大值的线性规划的任意目标值都不会大于求最小值的线性规划的任一目标值,不能理解为原问题的目标值不超过对偶问题的目标值。
由这个性质可得到下面几个结论:
- LP的任一可行解的目标值是DP的最优值下界; DP的任一可行解的目标是LP的最优值的上界;
- 在互为对偶的两个问题中,若一个问题可行且具有无界解,则另一个问题无可行解;
- 若原问题可行且另一个问题不可行,则原问题具有无界解。
最优准则定理:设X与Y分别是LP与DP的可行解,则X、Y是LP与DP的最优解当且仅当 CX = Yb
若互为对偶的两个问题其中一个有最优解,则另一个也有最优解,且最优值相同
由该性质还可推出另一结论:若LP与DP都有可行解,则两者都有最优解,若一个问题无最优解,则另一问题也无最优解。
**互补松弛定理:设X、Y分别为LP与DP的可行解,Xs和Ys是它的松弛变量的可行解,则X和Y是最优解当且仅当 YsX = 0和 YXs = 0 **
应用举例:已知线性规划maxz=3x1+4x2+x3maxz = 3x_1+4x_2+x_3maxz=3x1+4x2+x3
{x1+2x2+x3≤102x1+2x2+x3≤16xj≥0,j = 1,2,3
\begin{equation}
\begin{cases}
x_1 + 2x_2 + x_3 ≤10\\
2x_1 + 2x_2 + x_3 ≤ 16\\
x_j ≥ 0, & \text{j = 1,2,3}
\end{cases}
\end{equation}
⎩⎨⎧x1+2x2+x3≤102x1+2x2+x3≤16xj≥0,j = 1,2,3
的最优解是X=(6,2,0)TX = (6,2,0)^TX=(6,2,0)T,求对偶问题的最优解
解:写出对偶问题minw=10y1+16y2minw = 10y_1 + 16y_2minw=10y1+16y2
{y1+2y2≥32y1+2y2≥4y1+y2y1,y2≥0
\begin{equation}
\begin{cases}
y_1 + 2y_2 ≥ 3\\
2y_1 + 2y_2 ≥ 4\\
y_1 + y_2\\
y_1,y_2 ≥ 0
\end{cases}
\end{equation}
⎩⎨⎧y1+2y2≥32y1+2y2≥4y1+y2y1,y2≥0
因为X1≠0,X2≠0,所以对偶问题的第一二个约束的松弛变量=0,从而解得对偶问题的最优解为(1,1),最优值w=26
LP(max)的检验数的相反数对应于DP(min)的一组基本解
其中第j个决策变量xjx_jxj的检验数的相反数对应于DP中第j个松弛变量ySjy_{S_j}ySj的解,第i个松弛变量的检验数的相反数对应于第i个对偶变量yjy_jyj的解。反之,DP的检验数(注意:不乘负号)对应于LP的一组基本解
MATLAB代码实现
基于linprog求解器
[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub)
基于问题求解
prob = optimproblem('ObjectiveSense','max')
f = [3;-1;-1];
A = [1 -2 1;4 -1 -2];
b = [11;-3];
Aeq = [-2 0 1];
x = optimvar('x',3,'LowerBound',0);
prob.Objective = f'*x;
prob.Constraints.ineq = A*x<=b;
prob.Constraints.eq = Aeq*x == 1;
[sol,fval,flag,out] = solve(prob),fval
整数规划
求解纯整数规划的分枝定界法
分枝定界法的步骤:
1.求整数规划的松弛问题最优解;
2.若松弛问题的最优解满足整数要求,得到整数规划的最优解,否则转下一步;
3.任意选一个非整数解的变量xix_ixi,在松弛问题中加上约束xi≤[xi]x_i≤[x_i]xi≤[xi]及xi≥[xi]+1x_i≥[x_i]+1xi≥[xi]+1组成两个新的松弛问题,称为分枝。
新的松弛问题具有特征:当原问题是求最大值时,目标值是分枝问题的上界;当原问题是求最小值时,目标值是分枝问题的下界;
4.检查所有分枝的解及目标函数值:
- 若某分枝的解是整数并且目标函数值大于(max)等于其它分枝的目标值,则将其它分枝剪去不再计算
- 若还存在非整数解并且目标值大于(max)整数解的目标值,需要继续分枝,再检查,直到得到最优解。
求解0-1整数规划的隐枚举法
隐枚举法的步骤:
- 找出任意一可行解,目标函数值为Z
- 原问题求最大值时,则增加一个约束c1x1+c2x2+...+cnxn≥Zc_1x_1+c_2x_2+...+c_nx_n≥Zc1x1+c2x2+...+cnxn≥Z①
当求最小值时,上式改为小于等于约束 - 列出所有可能解,对每个可能解先检验式①,若满足再检验其它约束,若不满足式①,则认为不可行,若所有约束都满足,则认为此解是可行解,求出目标值
- 目标函数值最大(最小)的解就是最优解
分枝一隐枚举法求解BIP问题
将分枝定界法与隐枚举法结合起来用,得到分枝一隐枚举法。计算步骤如下:
- 将BIP问题的目标函数的系数化为非负,例如对于maxZ=2x1−3x2maxZ = 2x_1-3x_2maxZ=2x1−3x2,令x2=1−x2′x_2 = 1-x_2'x2=1−x2′,则原式变为maxZ=2x1+3x2′−3maxZ = 2x_1 + 3x_2' -3maxZ=2x1+3x2′−3,注意当变量作了代换后,约束条件中的变量也相应作代换。
- 变量重新排序:变量依据目标函数系数值按升排序;
- 求主枝:目标函数是max形式时令所有变量等于1,得到目标值的上界;目标函数是min形式时令所有变量等于0,得到目标值的下界;如果主枝的解满足所有约束条件则得到最优解,否则转下一步;
- 分枝与定界:从第一个变量开始依次取“1”或“0”,求极大值时其后面的变量等于“1”,求极小值时其后面的变量等于“0”,用分枝定界法搜索可行解和最优解。
停止分枝和需要继续分枝的原则:
- 当某一子问题是可行解时则停止分枝并保留;
- 不是可行解但目标值劣于现有保留分枝的目标值时停止分枝并剪枝;
- 后续分枝变量无论取“1”或“0”都不能得到可行解时停止分枝并剪枝;
- 当某一子问题不可行但目标值优于现有保留分枝的所有目标值,则要继续分枝
目标规划
按事先制定的目标顺序逐项检查,尽可能使得结果达到预定目标,即使不能达到目标也使得离目标的差距最小,这就是目标规划的求解思路,对应的解称为满意解,由目标构成的约束称为目标约束,目标约束具有更大的弹性,允许结果与所制定的目标值存在正或负的偏差;如果决策者要求结果一定不能有正或负的偏差,这种约束称为系统约束;
设d-为未达到目标值的差值,称为负偏差变量,d+为超过目标值的差值,称为正偏差变量,d- ≥ 0、d+ ≥ 0
规定:一个目标中的两个偏差变量d;、d+至少一个等于零,偏差变量向量的叉积等于零:d- × d+ = 0
一般目标规划是将多个目标函数写成一个由偏差变量构成的函数求最小值,按多个目标的重要性,确定优先等级,顺序求最小值
按决策者的意愿,事先给定所要达到的目标值当期望结果不超过目标值时,目标函数求正偏差变量最小;当期望结果不低于目标值时,目标函数求负偏差变量最小;当期望结果恰好等于目标值时,目标函数求正负偏差变量之和最小
目标规划的标准形式如下:
minz=∑k=1KPk(∑l=1Lwkl−dl−+wkl+dl+){∑j=1naijxj≤(=,≥)bi(i=1,⋯ ,m)∑j=1ncljxj+dl−−dl+=gl(l=1,⋯ ,L)xj≥0(j=1,⋯ ,n)dl−,dl+≥0(l=1,⋯ ,L)
min z=\sum_{k=1}^{K} P_{k}\left(\sum_{l=1}^{L} w_{kl}^{-}d_{l}^{-}+w_{kl}^{+}d_{l}^{+}\right) \\
\begin{equation}
\begin{cases}
\sum\limits_{j=1}^{n} a_{ij}x_{j}≤(=,≥) b_{i} & (i=1,\cdots, m)\\
\sum\limits_{j=1}^{n} c_{lj}x_{j}+d_{l}^{-}-d_{l}^{+}=g_{l}&(l=1,\cdots, L)\\
x_{j} ≥ 0 & (j=1,\cdots, n)\\
d_{l}^{-}, d_{l}^{+}\geq 0 &(l=1,\cdots, L)
\end{cases}
\end{equation}
minz=k=1∑KPk(l=1∑Lwkl−dl−+wkl+dl+)⎩⎨⎧j=1∑naijxj≤(=,≥)bij=1∑ncljxj+dl−−dl+=glxj≥0dl−,dl+≥0(i=1,⋯,m)(l=1,⋯,L)(j=1,⋯,n)(l=1,⋯,L)
其中PkP_kPk为第k级优先因子,glg_lgl为目标的预期目标值
例:车间计划生产甲、乙两种产品,每种产品均需经过A、B两道工序加工.工艺资料如下表所示
| 产品工序 | 产品甲 | 产品乙 | 每天加工能力(小时) |
|---|---|---|---|
| A | 2 | 2 | 120 |
| B | 1 | 2 | 100 |
| C | 2.2 | 0.8 | 90 |
| 产品售价(元/件) | 50 | 70 | |
| 产品利润(元/件) | 10 | 8 |
(1)车间如何安排生产计划,使得产值和利润都尽可能高
先列出线性多目标规划模型:
maxZ150x1+70x2maxZ=10x1+8x2{2x1+2x2≤120x1+2x2≤1002.2x1+0.8x2≤90x1、x2≥0
maxZ_1 50x_1 + 70x_2\\
maxZ = 10x_1 + 8x_2\\
\begin{equation}
\begin{cases}
2x_1 + 2x_2 ≤120\\
x_1 + 2x_2 ≤100\\
2.2x_1 + 0.8x_2 ≤90\\
x_1、x_2≥0
\end{cases}
\end{equation}
maxZ150x1+70x2maxZ=10x1+8x2⎩⎨⎧2x1+2x2≤120x1+2x2≤1002.2x1+0.8x2≤90x1、x2≥0
先分别求产值最大和利润最大的线性规划最优解:
产值最大的最优解:X1X_1X1 = (20,40),Z1Z_1Z1 = 3800
利润最大的最优解:X2X_2X2 = (30,30),Z2Z_2Z2 = 540
目标确定为产值和利润尽可能达到3800和540,得到目标规划数学模型:
minZ=d1−+d2−{50x1+70x2+d1−−d1+=380010x1+8x2+d2+−d2+=5402x1+2x2≤120x1+2x2≤1002.2x1+0.8x2≤90x1、x2、d1−、d1+、d2−、d2+≥0
minZ= d_1^- + d_2^-\\
\begin{equation}
\begin{cases}
50x_1 + 70x_2 + d_1^- - d_1^+ = 3800\\
10x_1 + 8x_2 + d_2^+ - d_2^+ = 540\\
2x_1 + 2x_2 ≤120\\
x_1 + 2x_2 ≤100\\
2.2x_1 + 0.8x_2 ≤90\\
x_1、x_2、d_1^-、d_1^+、d_2^-、 d_2^+≥0
\end{cases}
\end{equation}
minZ=d1−+d2−⎩⎨⎧50x1+70x2+d1−−d1+=380010x1+8x2+d2+−d2+=5402x1+2x2≤120x1+2x2≤1002.2x1+0.8x2≤90x1、x2、d1−、d1+、d2−、d2+≥0
(2)如果认为利润比产值重要,怎样决策?
解决方法:给d2d_2d2赋一个比d1d_1d1的系数大的权系数,如minZ=d1−+2d2−minZ = d_1^-+2d_2^-minZ=d1−+2d2−,约束条件不变
这个权系数的大小依据重要程度给定,或者根据同一优先级的偏差变量的关系给定
非线性规划
在一组等式或不等式的约束下,求一个函数的最大值(或最小值)问题,其中至少有一个非线性函数,这类问题称之为非线性规划问题。可概括为一般形式
minf(x)s.t.{hj(x)≤0,j = 1,...,qgi(x)=0,i = 1,...,p
minf(x)\\
\begin{equation}
s.t. \begin{cases}
h_j(x) ≤ 0, & \text{j = 1,...,q}\\
g_i(x) = 0, & \text{i = 1,...,p}\\
\end{cases}
\end{equation}
minf(x)s.t.{hj(x)≤0,gi(x)=0,j = 1,...,qi = 1,...,p
其中x=[x1,...xn]Tx = [x_1,...x_n]^Tx=[x1,...xn]T称为该模型的决策变量,f 称为目标函数,g() 和 h() 称为约束函数。另外,g() 称为等式约束,h() 称为不等式约束。
MATLAB中非线性规划的数学模型写成以下形式:
minf(x)s.t.{A⋅x≤b,Aeq⋅x=beq,c(x)≤0,ceq(x)=0lb≤x≤ub
minf(x)\\
\begin{equation}
s.t. \begin{cases}
A·x ≤ b, \\
Aeq·x = beq,\\
c(x) ≤ 0,\\
ceq(x) = 0\\
lb≤x≤ub
\end{cases}
\end{equation}
minf(x)s.t.⎩⎨⎧A⋅x≤b,Aeq⋅x=beq,c(x)≤0,ceq(x)=0lb≤x≤ub
代码实现:
[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,Ib,ub,nonlcon,options)
参数解释:
- x的返回值是决策向量x的取值,fval返回的是目标函数的取值
- 其中fun是用M文件定义的函数f(x)
- x0是x的初始值
- A,b,Aeq,beq定义了线性约束Ax≤b,Aeq·x=beq,如果没有线性约束,则A = [ ],b= [ ],Aeq = [ ],beq = [ ]
- 如果上界和下界没有约束,即x无下界也无上界,则 Ib = [ ],ub = [ ],也可以写成Ib的各分量都为-inf,ub的各分量都为inf
- nonlcon是用M文件定义的非线性向量函数c(x),ceq(x)
- options定义了优化参数,可以使用Matlab缺省的参数设置
无约束问题的数值解
fminunc
[x,fval]=fminunc(fun,x0,options)
参数解释:
- 其中返回值x是所求得的极小值点,返回值fval是函数的极小值。
- fun是一个M函数:
- 当fun只有一个返回值时,它的返回值是函数f(x)
- 当fun有两个返回值时,它的第二个返回值是f(x)的梯度向量
- 当fun有三个返回值时,它的第三个返回值是f(x)的二阶导数阵(Hessian阵)。
- x0是向量x的初始值
- options是优化参数,可以使用缺省参数。
例:求函数f(x)=100(x2−x12)2+(1−x1)2f(x) = 100(x_2 - x_1^2)^2 + (1-x_1)^2f(x)=100(x2−x12)2+(1−x1)2的极小值
使用函数梯度作为优化参数的解法
fun3.m文件
function [f,g] = fun3(x);
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;
g = [-400*x(1)*(x(2)-x(1)^2) - 2*(1-x(1));200*(x(2) - x(1)^2)]; %g为梯度向量
end
主程序文件:
clc,clear
options = optimset('GradObj','on');
[x,y] = fminunc('fun3',rand(1,2),options)
使用二阶导数作为优化参数的解法
fun4.m文件
function [f,df,d2f]=fun4(x);
f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
df=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1));200*(x(2)-x(1)^2)];
d2f=[-400*x(2)+1200*x(1)^2+2,-400*x(1)-400*x(1),200];
end
主程序文件:
clc,clear
options =optimset('GradObj','on','Hessian','on');
[x,y] = fminunc('fun4',rand(1,2),options)
fminsearch
[x,fval]=fminsearch(fun,x0,options)
例:求多元函数f(x,y)=x3−y3+3x2+3y2−9xf(x,y) = x^3 - y^3 + 3x^2 + 3y^2 - 9xf(x,y)=x3−y3+3x2+3y2−9x的极值
解:
clc,clear
f = @(x) x(1)^3 - x(2)^3 + 3*x(1)^2 + 3*x(2)^2 - 9*x(1) %将
g = @(x) - f(x)
[xy1,z1] = fminunc(f,rand(2,1)) %求极小值点
[xy2,z2] = fminsearch(g,rand(2,1)) %求极大值点
求函数的零点和方程组的解
例:求多项式f(x)=x3−x2+2x−3f(x) = x^3 - x^2 + 2x -3f(x)=x3−x2+2x−3的零点
使用roots方法求解
clc,clear
xishu = [1 -1 2 -3]; %多项式是用向量定义的,系数从高次幂到低次幂排列
x0 = roots(xishu)
使用符号求解
syms x
x0 = solve(x^3 - x^2 + 2*x - 3) %求函数零点的符号解
x0 = vpa(x0,5) %化成小数格式的数据
solve函数
单方程求解:S = solve(eq, var)
求解单个方程eq=0,指定变量var。若未指定var,则默认对findsym(eq)识别的变量求解。
方程组求解:Y = solve(eqns, vars)
求解方程组eqns,指定变量vars。结果以结构体形式返回,字段名对应变量名。
例:求如下方程的解
{x2+y−6=0y2+x−6=0
\begin{equation}
\begin{cases}
x^2 + y - 6 = 0\\
y^2 + x - 6 = 0
\end{cases}
\end{equation}
{x2+y−6=0y2+x−6=0
解:
syms x y
[x,y] = solve(x^2 + y - 6, y^2 + x-6)
fsolve函数
x =fsolve(fun,xθ)
[x,fval,exitflag]=fsolve(fun,x0,options)
参数解释:
- fun:函数,用于定义方程(组)
- |x0:计算初值
- x:求解结果(方程的根)
- fval:将求解结果x带入方程(组)fun,对应的值,即fun(x)
- exitflag:返回方程组求解结果的状态
- options:方程的求解设置
函数特点:
- fsolve可以求解方程(组)的实数根和复数根
- fsolve采用迭代的数值算法,速度快
- 给定不同的初值,可以求得不同的根(局部寻根),初值给的不好,可能导致求解失败
对于solve中的例子,求数值解的程序如下:
f = @(x) [x(1)^2 + x(1) - 6; x(2)^2 + x(1) - 6];
xy = fsolve(f, rand(2,1)) %只能求得给定初始值附近的一组解
约束极值问题
二次规划
matlab中二次规划的数学模型可表述如下:
min12xTHx+fTx,{Ax≤b,Aeq⋅x=beq,lb≤x≤ub
min \frac{1}{2} x^T Hx + f^Tx,\\
\begin{equation}
\begin{cases}
Ax ≤ b,\\
Aeq·x = beq,\\
lb ≤ x ≤ ub
\end{cases}
\end{equation}
min21xTHx+fTx,⎩⎨⎧Ax≤b,Aeq⋅x=beq,lb≤x≤ub
这里H是实对称矩阵,f,b,beq,lb,ub是列向量,A ,Aeq,是相应维数的矩阵
Matlab中求解二次规划的命令是
[x,fval]=quadprog(H,f,A,b,Aeq,beq,Ib,ub,x0,options)
例:求解二次规划模型如下:
max−x12−0.3x1x2−2x22+98x1+277x2s.t.{x1+x2≤100,x1−2x2≤0,x1,x2≥0
max -x_1^2 - 0.3x_1x_2 - 2x_2^2 + 98x_1 + 277x_2\\
s.t.\begin{equation}
\begin{cases}
x_1 + x_2 ≤ 100,\\
x_1 - 2x_2 ≤ 0,\\
x_1,x_2 ≥0
\end{cases}
\end{equation}
max−x12−0.3x1x2−2x22+98x1+277x2s.t.⎩⎨⎧x1+x2≤100,x1−2x2≤0,x1,x2≥0
解:
将以上二次规划模型用标准矩阵表述
max[x1,x2][−1−0.15−0.15−2][x1x2]+[98,277][x1x2],
max [x_1,x_2]
\begin{bmatrix}
-1 & -0.15 \\
-0.15 & -2
\end{bmatrix}
\begin{bmatrix}
x_1\\
x_2
\end{bmatrix}
+[98,277]
\begin{bmatrix}
x_1\\
x_2
\end{bmatrix},
max[x1,x2][−1−0.15−0.15−2][x1x2]+[98,277][x1x2],
s.t.{[111−2][x1x2]≤[1000],x1,x2≥0 s.t.\begin{equation} \begin{cases} \begin{bmatrix} 1 & 1\\ 1 & -2 \end{bmatrix} \begin{bmatrix} x_1\\ x_2 \end{bmatrix} ≤ \begin{bmatrix} 100\\ 0 \end{bmatrix},\\ x_1,x_2≥0 \end{cases} \end{equation} s.t.⎩⎨⎧[111−2][x1x2]≤[1000],x1,x2≥0
代码实现:
clc,clear
h = [-1,-0.15;-0.15,-2];
f=[98;277];a=[1,1;1,-2];b=[100;0];
prob=optimproblem('ObjectiveSense','max');
x=optimvar('x',2,'LowerBound',0);
prob.Objective =x'*h*x+f'*x;
prob.Constraints.con =a*x<=b;
[sol,fval,flag,out]=solve(prob)
sol.x %显示最优解
fminbnd函数
求单变量非线性函数在区间上的极小值
[x,fval]=fminbnd(fun,x1,x2,options)
fminimax函数
[x,fval]=fminimax(fun,x0,A,b,Aeq,beq,Ib,ub,nonlcon,options)
图与网络
所谓的图,直观地讲就是在平面上n个点,把其中的一些点对用曲线或直线连接起来,不考虑点的位置与连线曲直长短,这样形成一个关系结构就是一个图。记成G=(V,E),V是以上述点为元素的顶点集,E是以上述连线为元素的边集。
如果各条边都加上方向,则称为有向图,否则称为无向图。如果有的边有方向,有的边无方向,则称为混合图。如果任两顶点间最多有一条边,且每条边的两个端点皆不重合的图,称为简单图。
如果图的两顶点间有边相连,则称此两顶点相邻,每一对顶点都相邻的图称为完全图,否则称为非完全图,完全图记为K∣V∣K_{|V|}K∣V∣。
若V = XUY,X∩Y = φ,|X|·|Y| ≠ 0,(这里 |X| 表示顶点集X中元素的个数),且X中无相邻的顶点对,Y中亦然,则称图G为二分图;特别地,若对任意u∈X,u与Y中每个顶点相邻,则称图G为完全二分图,记为K∣X∣,∣Y∣K_{|X|,|Y| }K∣X∣,∣Y∣
若 v 是边 e 的端点,则称v与e相关联,与顶点关联的边数称为该顶点的度,记为d(v),度为奇数的顶点称为奇顶点,度为偶数的顶点称为偶顶点。可以证明 d(v)=2E,即所有顶点的度数之和是边数的两倍,且由此可知奇顶点的总数是偶数。
道路是顶点和边交替构成的序列,形式为 P=v0,e1,v1,e2,v2,…,ek,vkP=v_0,e_1,v_1,e_2,v_2,…,e_k,v_kP=v0,e1,v1,e2,v2,…,ek,vk,其中:
- 顶点序列 v0,v1,…,vkv_0,v_1,…,v_kv0,v1,…,vk 表示路径上的节点;
- 边序列 e1,e2,…,eke_1,e_2,…,e_ke1,e2,…,ek 表示连接相邻顶点的边;
- v0v_0v0称为起点,vkv_kvk称为终点,其余顶点为内点
道路的长度定义为边的数量 k。若道路中所有顶点均不重复(除起点和终点可能相同外),则称为轨道(简单道路);若所有边均不重复,则称为迹(Trail)
起点与终点重合的道路称为回路;起点与终点重合的轨道称为圈
图中任两顶点之间都存在道路的图,称为连通图。图中含有所有顶点的轨道称为Hamilton轨,闭的Hamilton轨称为Hamilton圈;含有Hamilton圈的图称为Hamilton图。
最短路径问题
shortestpath方法
P=shortestpath(G,s,t,'Method',algorithm)
参数解释:
- G:输入图对象
- s:源节点
- t:相标结点
- algorithm最短路径算法
auto(默认值):会自动选择算法。unweighted:广度优先计算,将所有边权重都视为1,速度最快。positive:Dijkstra算法,要求所有边的权重均为非负数。mixed(仅适用于有向图):Bellman-Ford算法,要求图没有负循环。mixed速度慢于positive,但mixed更为通用,因为它允许某些边权重为负数。
例:求该图中v1到v11的最短路径

解:
clc,clear,close all,a=zeros(11);
a(1,2)=2;a(1,3)=8;a(1,4)=1;
a(2,3)=6;a(2,5)=1;
a(3,4)=7;a(3,5)=5;a(3,6)=1;a(3,7)=2;
a(4,7)=9;
a(5,6)=3;a(5,8)=2;a(5,9)=9;
a(6,7)=4;a(6,9)=6;
a(7,9)=3;a(7,10)=1;
a(8,9)=7;a(8,11)=9;
a(9,10)=1;a(9,11)=2;a(10,11)=4;
s=cellstr(strcat('v',int2str([1:11]'))); %顶点字符串
G=graph(a,s,'Upper'); %利用邻接矩阵的上三角元素构造无向图
[p,d]=shortestpath(G,1,11) %各求最短路径和最短距离
h=plot(G,'EdgeLabel',G.Edges.Weight); %画无向图
highlight(h,p,'EdgeColor','r','LineWidth',2) %最短路径加粗
可得最短路径为:

选址问题
例:已知有6个村庄,各村的小学生人数如下表所示,各村庄间的距离如下图所示。现在计划建造一所医院和一所小学,则医院建在哪个村庄才能使最远村庄的人到医院看病所走的路最短?小学建在哪个村庄使得所有学生上学走的总路程最短?

解:
clc,clear,w=zeros(6);
w(1,[2,3])=[2,7];w(2,[3:5])=[4,6,8];
w(3,[4,5])=[1,3];w(4,[5,6])=[1,6];
w(5,6)=3;
G=graph(w,'Upper');
d=distances (G) %用 Dijkstra算法求所有顶点对的距高
md=max(d) %求各列的最大值
c=[50 40 60 20 70 90];
s=c*d %计算学生上学走的路程和
[ms,ind] = min(s) %求最小值及对应的编号
writematrix([d;md;s],'data4_7.xlsx') %计算结果写入Excel表
最后输出的xlsx表中内容为:
| 0 | 2 | 6 | 7 | 8 | 11 |
|---|---|---|---|---|---|
| 2 | 0 | 4 | 5 | 6 | 9 |
| 6 | 4 | 0 | 1 | 2 | 5 |
| 7 | 5 | 1 | 0 | 1 | 4 |
| 8 | 6 | 2 | 1 | 0 | 3 |
| 11 | 9 | 5 | 4 | 3 | 0 |
| 11 | 9 | 6 | 7 | 8 | 11 |
| 2130 | 1670 | 1070 | 1040 | 1050 | 1500 |
3万+

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



