Constraint-Optimization

本文最后更新于:2023年6月19日 晚上

约束优化

matlab 有几种命令可以求解

  • linprog求一次线性规划

  • quadprog求二次规划问题

书上的方法是将二次规划问题改写成极小化标准形式,获得二次型黑塞矩阵(我没看懂),留一个坑
黑塞矩阵:是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。

一些概念重温


黑塞矩阵说白了应该就是对每个变量分别求两次偏导得到的对称正定矩阵。

linprog语法

x = linprog(f,A,b)``x = linprog(f,A,b,Aeq,beq)``x = linprog(f,A,b,Aeq,beq,lb,ub)``x = linprog(f,A,b,Aeq,beq,lb,ub,options)``x = linprog(problem)``[x,fval] = linprog(___)``[x,fval,exitflag,output] = linprog(___)``[x,fval,exitflag,output,lambda] = linprog(___)

详细描述

生产销售规划

%可以直接把系数及约束条件都直接用矩阵表示而不是再写一个函数
c = [12 8 22-1.5/0.8 16-1.5/0.75];
A = [1/3 1/4 1/2.4 1/3;4 2 6/0.8 16/3;1 0 1/0.8 0];
b = [50;480;100];
v1 = [0,0,0,0];
[x,fval] = linprog(-c,A,b,[],[],v1);
对应的式子就不写了…不过在设变量的时候尽量设多一点,否则有些量之间存在因果关系的在约束的时候有可能考虑不周。
灵敏度分析,则 LINGO 还会输出以下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
RANGES IN WHICH THE BASIS IS UNCHANGED:

OBJCOEFFICIENTRANGES VARIABLE CURRENT ALLOWABLE ALLOWABLE

COEF INCREASE DECREASE

X1 72.000000 24.000000 8.000000

X2 64.000000 8.000000 16.000000

RIGHTHANDSIDERANGES

ROW CURRENT ALLOWABLE ALLOWABLE

RHS INCREASE DECREASE

2 50.000000 10.000000 6.666667

3 480.000000 53.333332 80.000000

4 100.000000 INFINITY 40.000000

以上显示的是当前最优基(矩阵)保持不变的充分条件(RANGES IN WHICH THE BASIS IS UNCHANGED),包括目标函数中决策变量应的系数的变化范围(OBJ COEFFICIENT RANGES)和约束的右端项的变化范围(RIGHTHAND SIDE RANGES)两部分。
前一部分的输出行
X1 72.000000 24.000000 8.000000
表示决策变量 X1 当前在目标函数中对应的系数为 72,允许增加 24 和减少 8。也就是说,当该系数在区间[64,96]上变化时(假设其它条件均不变),当前最优基矩阵保持不变。对 X2 对应的输出行也可以类似地解释。由于此时约束没有任何改变,所以最优基矩阵保持不变意味着最优解不变(当然,由于目标函数中的系数发生变化,最优值还是会变的)。
后一部分的输出行
X2 50.000000 10.000000 6.666667
表示约束 2 当前右端项为 50,允许增加 10 和减少 6.666667。也就是说,当该系数在区间[43.333333,60]上变化时(假设其它条件均不变),当前最优基矩阵保持不变。对约束 3、约束 4 对应的输出行也可以类似地解释。由于此时约束已经改变,虽然最优基矩阵保持不变,最优解和最优值还是会变的。但是,由于最优基矩阵保持不变,所以前面的“DUAL PRICES”给出的约束的影子价格此时仍然是有效的。
题目的后几问是更细致的投资问题,答案使用了 Lagrange 乘子,这里我并不了解,先挖一个坑

quadprog语法

x = quadprog(H,f)``x = quadprog(H,f,A,b)``x = quadprog(H,f,A,b,Aeq,beq)``x = quadprog(H,f,A,b,Aeq,beq,lb,ub)``x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)

  • H 是目标函数 Hesse 矩阵

  • f 是目标函数线性项系数列向量 (线性项即单变量一次项)

  • A 是不等式约束系数矩阵(不等式都要化成左边 x 项常数

  • b 是不等式约束列向量

  • Aeq 是等式约束系数矩阵,如

  • beq 是等式约束列向量

  • lb 是 Lower bounds, specified as a real vector or real array. If the number of elements in x0 is equal to the number of elements in lb, then lb specifies that for all i.即下界列向量

  • ub 是上界列向量

x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)``x = quadprog(problem)``[x,fval] = quadprog(___)``[x,fval,exitflag,output] = quadprog(___)``[x,fval,exitflag,output,lambda] = quadprog(___)

实战–水库供水–Lingo 初探

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
model:
title TRanWater;
sets:
demand/1,2,3,4/:a,d;!四个小区,其实意味着a,d的范围是从14
supply/1,2,3/:b;!三个供应站
link(supply,demand):c,x;!这个意味着c和x是二维数组,即c(i,j)和x(i,j),其中i是supply的范围1~3j是demand范围1~4
endsets
data:
!demand;
a = 30,70,10,10;!基本用水;
d = 80,140,30,50;!最多用水;
!supply;
b = 100,120,100;%供应能力
c = 160,130,220,170
140,130,190,150
190,200,230,100000;!管理费;
enddata
[obj]max = @sum(link(i,j):450*x(i,j)-c(i,j)*x(i,j));!没搞懂这句话!!!!!;
@FOR(demand(j):[DEMAND_CONmin]@sum(supply(i):x(i,j))>=a(j););!约束条件一
@FOR(demand(j):[DEMAND_CONmax]@sum(supply(i):x(i,j))<=d(j););
@FOR(supply(i):[SUPPLY_CON]@sum(demand(j):x(i,j))<=b(i););
end
输出
Global optimal solution found.
Objective value: 88700.00
X( 1, 1) 0.000000 20.00000
X( 1, 2) 100.0000 0.000000
X( 1, 3) 0.000000 40.00000
X( 1, 4) 0.000000 20.00000
X( 2, 1) 30.00000 0.000000
X( 2, 2) 40.00000 0.000000
X( 2, 3) 0.000000 10.00000
X( 2, 4) 50.00000 0.000000
X( 3, 1) 50.00000 0.000000
X( 3, 2) 0.000000 20.00000
X( 3, 3) 30.00000 0.000000
X( 3, 4) 0.000000 99800.004444

实战 2–圈地模型

果然 lingo 求解多变量线性规划简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
model:
Max = 0.09*(L1*L2+L3*L4);
0.09*L1*L2>=1000;
0.09*L3*L4>=1000;
h1>=20;
h2>=20;
2*(h1*L1+h1*L2+h2*L3+h2*L4)<=100000;
end
完全直译即可。输出
Variable Value Reduced Cost
L1 1144.591 0.000000
L2 1144.591 0.000000
L3 105.4093 0.000000
L4 105.4093 0.000000
H1 20.00000 0.000000
H2 20.00000 0.000000

Row Slack or Surplus Dual Price
1 118907.9 1.000000
2 116907.9 0.000000
3 0.000000 -9.858541
4 0.000000 -11790.79
5 0.000000 -1085.854
6 0.000000 2.575329