概述
采用优化方法时,要明确4个要素,决策变量,目标函数,约束条件是什么。下面进行阐述3种类型的优化处理以及matlab代码。
线性规划问题
用matlab处理一般的线性规划问题的标准型为:
min z=
∑
j
=
1
n
c
j
x
i
sum_{j=1}^nc_jx_i
∑j=1ncjxi
s.t.
∑
j
=
1
n
a
i
j
x
i
≤
b
j
sum_{j=1}^na_{ij}x_ileq b^j
∑j=1naijxi≤bj
也就是说标准形式应该满足,目标函数必须是
≤
leq
≤的形式,约束条件也应该是
≤
leq
≤的形式。如果目标函数
是
max z=
∑
j
=
1
n
c
j
x
i
A
x
≥
b
sum_{j=1}^nc_jx_i Axgeq b
∑j=1ncjxiAx≥b
可以转化为
m
i
n
z
=
∑
j
=
1
n
c
j
x
i
−
A
x
≤
−
b
min z=sum_{j=1}^n c_jx_i -Ax leq -b
minz=∑j=1ncjxi−Ax≤−b形式。
在MATLAB中基本的函数形式是
[c,favl]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS),返回值是最有解的一组向量x.解释如下:
A,b对应不等式的约束
Aeq,beq对应等式的约束
LB,UB分别是变量x的上界和下界
X0是变量的初始值,OPTIONS是控制参数(一般不用管)
例子:
m
i
n
z
=
2
x
1
+
3
x
2
+
x
3
min z=2x_1+3x_2+x_3
minz=2x1+3x2+x3
s
.
t
.
=
{
x
1
+
4
x
2
+
2
x
3
≥
8
3
x
1
+
2
x
2
≥
6
x
1
,
x
2
,
x
3
≥
0
s.t.=left{ begin{array}{rcl} x_1+4x_2+2x_3geq 8 \ 3x_1+2x_2geq 6 & \ x_1,x_2,x_3geq0 & end{array} right.
s.t.=⎩⎨⎧x1+4x2+2x3≥83x1+2x2≥6x1,x2,x3≥0代码如下:
>> c=[2;3;1];
>> a=[1,4,2;3,2,0];
>> b=[8;6];
>> [x,y]=linprog(c,-a,-b,[],[],zeros(3,1))
Optimal solution found.
x = 2.0000
0
3.0000
y = 7
非线性规划问题
如果目标函数或者约束条件里面有非线性函数,则此种规划问题就是非线性规划问题。在MATLAB中的主要命令是
X
=
f
m
i
n
c
o
n
(
f
u
n
,
X
0
,
A
,
B
,
A
e
q
,
B
e
q
,
L
B
,
U
B
,
N
o
n
l
c
o
n
,
O
P
T
I
O
N
S
)
X=fmincon(fun,X0,A,B,Aeq,Beq,LB,UB,Nonlcon,OPTIONS)
X=fmincon(fun,X0,A,B,Aeq,Beq,LB,UB,Nonlcon,OPTIONS)
解释如下:
X为返回的最优解
fun是在m文件中定义的目标函数
Aeq.Beq线性等式约束
A,B线性不等式约束
LB,UB是变量x的上下界
Nonlcon是在m文件中定义的非线性约束函数
OPTIONS为优化参数
例子如下:
m
i
n
f
(
x
)
=
x
1
2
+
x
2
2
+
8
min f(x)=x_1^2+x_2^2+8
minf(x)=x12+x22+8
s
.
t
.
=
{
x
1
2
−
x
2
≥
0
−
x
1
+
x
2
2
+
2
=
6
x
1
,
x
2
≥
0
s.t.=left{ begin{array}{rcl} x_1^2-x_2geq 0 \ -x_1+x_2^2+2= 6 & \ x_1,x_2geq0 & end{array} right.
s.t.=⎩⎨⎧x12−x2≥0−x1+x22+2=6x1,x2≥0代码如下:
在fun1.m中写入目标函数:
function f=fun1(x)
f=x(1)^2+x(2)^2+8;
在在fun2.m中写入非线性约束函数
注:如果有多个不等式约束,g则是一个向量,用g(1).g(2)……存储
function [g,h]=fun2(x)
g=-x(1)^2+x(2); %g存储不等式约束
h=-x(1)-x(2)^2+2; %h存储等式约束
主程序命令:
>> edit fun1.m
>> edit fun2.m
>> [x,y]=fmincon('fun1',rand(2,1),[],[],[],[],zeros(2,1),[],'fun2',optimset)
>> Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.<stopping criteria details>
x = 1.0000
1.0000
y = 10.0000
x是最优解,y是最优值
整数规化
如果在规划问题中要求变量为整数,则称为整数规划。常见的整数规划问题算法有以下几类:
- 分支定界法:用于整数线性规划
- 割平面法:用于整数线性规划
- 隐枚举法:用于求解0-1整数规划问题
- 匈牙利法:用于解决0-1规划问题中的指派问题
- 蒙特卡罗算法:用于各种整数规划中
下面主要对蒙特卡罗算法和隐枚举法进行阐述:
蒙特卡罗算法:
蒙特卡罗算法又称为随机取样法,顾名思义,就是利用产生随机数进行估测准确值。
比如:
m
a
x
z
=
x
(
1
)
2
+
x
(
2
)
2
+
3
x
(
3
)
2
+
4
x
(
4
)
2
+
2
x
(
5
)
−
8
x
(
1
)
−
2
x
(
2
)
−
3
x
(
3
)
−
x
(
4
)
−
2
x
(
5
)
max z=x(1)^2+x(2)^2+3x(3)^2+4x(4)^2+2x(5)-8x(1)-2x(2)-3x(3)-x(4)-2x(5)
maxz=x(1)2+x(2)2+3x(3)2+4x(4)2+2x(5)−8x(1)−2x(2)−3x(3)−x(4)−2x(5)
s
.
t
.
=
{
0
≤
x
i
≤
99
i
=
1
,
2
,
…
…
x
(
1
)
+
x
(
2
)
+
x
(
3
)
+
x
(
4
)
+
x
(
5
)
≤
400
x
(
1
)
+
2
∗
x
(
2
)
+
2
x
(
3
)
+
x
(
4
)
+
6
∗
x
(
5
)
≤
800
2
∗
x
(
1
)
+
x
(
2
)
+
6
∗
x
(
3
)
≤
200
x
(
3
)
+
x
(
4
)
+
5
∗
x
(
5
)
≤
200
s.t.=left{ begin{array}{rcl} 0leq x_ileq 99&i=1,2,……\ x(1)+x(2)+x(3)+x(4)+x(5)leq 400\ x(1)+2*x(2)+2x(3)+x(4)+6*x(5)leq 800 & \ 2*x(1)+x(2)+6*x(3)leq200\ x(3)+x(4)+5*x(5) leq 200\ end{array} right.
s.t.=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧0≤xi≤99x(1)+x(2)+x(3)+x(4)+x(5)≤400x(1)+2∗x(2)+2x(3)+x(4)+6∗x(5)≤8002∗x(1)+x(2)+6∗x(3)≤200x(3)+x(4)+5∗x(5)≤200i=1,2,……代码如下:
首先建立.m文件
function [f,g]=mengte(x);
f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5);
g(1)=sum(x)-400;
g(2)=x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800;
g(3)=2*x(1)+x(2)+6*x(3)-200;
g(4)=x(3)+x(4)+5*x(5)-200;
再编写如下程序求解
rand('state',sum(clock));
p0=0;
tic
for i=1:10^5
x=99*rand(5,1);
x1=floor(x);
x2=ceil(x);
[f,g]=mengte(x1);
if sum(g<=0)==4
if p0<=f
x0=x1;p0=f;
end
end
[f,g]=mengte(x2);
if sum(g<=0)==4
if p0<=f
x0=x2;
p0=f;
end
end
end
x0,p0
toc
结果是:X=x0=(20,92,10,98,11),z=po=47180,用时1.451812 秒。(这也是采用蒙特卡洛算法的好处之一,快!)
最后
以上就是傲娇大白为你收集整理的数学建模之优化问题的全部内容,希望文章能够帮你解决数学建模之优化问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复