数学建模之优化问题

采用优化方法时,要明确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_i\leq b^j j=1naijxibj
也就是说标准形式应该满足,目标函数必须是 ≤ \leq 的形式,约束条件也应该是 ≤ \leq 的形式。如果目标函数

max z= ∑ j = 1 n c j x i A x ≥ b \sum_{j=1}^nc_jx_i Ax\geq b j=1ncjxiAxb
可以转化为 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=1ncjxiAxb形式。

在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_3\geq 8 \\ 3x_1+2x_2\geq 6 & \\ x_1,x_2,x_3\geq0 & \end{array} \right. s.t.=x1+4x2+2x383x1+2x26x1,x2,x30代码如下:

>> 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_2\geq 0 \\ -x_1+x_2^2+2= 6 & \\ x_1,x_2\geq0 & \end{array} \right. s.t.=x12x20x1+x22+2=6x1,x20代码如下:
在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.
x =    1.0000
    1.0000
y =   10.0000

x是最优解,y是最优值

整数规化

如果在规划问题中要求变量为整数,则称为整数规划。常见的整数规划问题算法有以下几类:

  1. 分支定界法:用于整数线性规划
  2. 割平面法:用于整数线性规划
  3. 隐枚举法:用于求解0-1整数规划问题
  4. 匈牙利法:用于解决0-1规划问题中的指派问题
  5. 蒙特卡罗算法:用于各种整数规划中
    下面主要对蒙特卡罗算法和隐枚举法进行阐述:

蒙特卡罗算法:
蒙特卡罗算法又称为随机取样法,顾名思义,就是利用产生随机数进行估测准确值。
比如:
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} 0\leq x_i\leq 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.=0xi99x(1)+x(2)+x(3)+x(4)+x(5)400x(1)+2x(2)+2x(3)+x(4)+6x(5)8002x(1)+x(2)+6x(3)200x(3)+x(4)+5x(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 秒。(这也是采用蒙特卡洛算法的好处之一,快!)

你可能感兴趣的:(数学建模足迹1)