【数模/数学规划模型】

声明:文章参考数学建模清风的网课编写。

文章目录

      • 数学规划
      • 线性规化
      • 非线性规化
      • 整数规化
        • 0-1规化

数学规划

  • 什么是数学规划?
    数学规划研究:在给定的条件下(约束条件),如何按照某一横梁指标(目标函数)来寻求计划、管理工作的最优方案。
    即:求目标函数在一定约束条件下的极值问题。

  • 数学规划的一般形式
    一般形式:min or max f(x) s.t 不等式约束
    目标函数:
    m i n   z = 6 x 1 + 3 x 2 + 4 x 3 min \ z = 6x_{1} + 3x_{2} + 4x_{3} min z=6x1+3x2+4x3
    约束条件:
    { x 1 + 2 x 2 − 3 x 3 ⩽ 80 x 1 + x 2 + x 3 = 120 x 1 ⩾ 30 0 ⩽ x 2 ⩽ 50 x 3 ⩾ 20 \left\{\begin{matrix} x_{1} + 2x_{2} - 3x_{3} \leqslant 80 \\ x_{1} + x_{2} + x_{3} = 120 \\ x_{1} \geqslant 30 \\ 0 \leqslant x_{2} \leqslant 50 \\ x_{3} \geqslant 20 \end{matrix}\right. x1+2x23x380x1+x2+x3=120x1300x250x320

  • 数学规划的分类
    数学规划问题主要有线性规划,非线性规划和整数规划等。

线性规化

当目标函数和约束条件都为线性表达式时,那么此时的数学规划问题就是线性规划问题。1947年,美国数学家丹齐格提出解决数学规划问题的算法–单纯形。
目标函数:
m i n   z = 6 x 1 + 3 x 2 + 4 x 3 min \ z = 6x_{1} + 3x_{2} + 4x_{3} min z=6x1+3x2+4x3
约束条件:
{ x 1 + 2 x 2 − 3 x 3 ⩽ 80 x 1 + x 2 + x 3 = 120 x 1 ⩾ 30 0 ⩽ x 2 ⩽ 50 x 3 ⩾ 20 \left\{\begin{matrix} x_{1} + 2x_{2} - 3x_{3} \leqslant 80 \\ x_{1} + x_{2} + x_{3} = 120 \\ x_{1} \geqslant 30 \\ 0 \leqslant x_{2} \leqslant 50 \\ x_{3} \geqslant 20 \end{matrix}\right. x1+2x23x380x1+x2+x3=120x1300x250x320

使用matlab求解线性规划问题

  • matlab中线性规划的标准型
    m i n   C T X   ( C = ( c 1 c 2 c 3 c n ) , X = ( x 1 x 2 x 3 x n ) , n 是决策变量的个数 ) min \ C^{T} X \ \left ( C = \begin{pmatrix} c_{1} \\ c_{2}\\ c_{3}\\ c_{n}\end{pmatrix} ,X = \begin{pmatrix} x_{1}\\ x_{2}\\ x_{3}\\ x_{n}\end{pmatrix},n是决策变量的个数\right ) min CTX  C= c1c2c3cn ,X= x1x2x3xn ,n是决策变量的个数
    S . t . { A   x ≤ b   ( 不等式约束 ) A e q   x = b e q   ( 等式约束 ) l b ≤ x ≤ u b   ( 上下界约束 ) S.t.\left\{\begin{matrix} A \ x\le b \ (不等式约束)\\ Aeq \ x= beq \ (等式约束)\\ lb\le x\le ub \ (上下界约束) \end{matrix}\right. S.t. A xb (不等式约束)Aeq x=beq (等式约束)lbxub (上下界约束)

matlab求解线性规划问题时,对求解问题的输入加以格式上的规定。比如:

  1. 所求解的目标函数必须是最小值,为此如果得到一个求解最大值的目标函数时,需对目标函数乘-1,此时求解到的最小值再乘-1即为最大值。
    m a x   z ⟺ − m i n − z max \ z\Longleftrightarrow -min-z max zminz
  2. 所有的不等式必须为小于等于类型,此时如果你有一个大于等于类型的不等式时,可以对不等式两端同时乘-1以促使符号取反。例如以下两个公式是等价的:
    4 x 1 + 6 x 2 − 7 x 3 ≥ 17 − 4 x 1 − 6 x 2 + 7 x 3 ≤ − 17 4x_{1} + 6x_{2} -7x_{3} \ge 17 \\ -4x_{1} - 6x_{2}+7x_{3} \le -17 4x1+6x27x3174x16x2+7x317
    如果只有大于或小于时,只能采取加上或减去一个非常小的值,来得到符合精度要求的解
    4 x 1 − 7 x 2 + x 3 < 4 ⇒ 4 x 1 − 7 x 2 + x 3 ≤ 4 − 0.001 4x_{1} -7x_{2}+x_{3}<4\Rightarrow 4x_{1} -7x_{2}+x_{3}\le 4-0.001 4x17x2+x3<44x17x2+x340.001
    例1,例如这样一道包含了所有特殊条件的题目:
    m a x   z = 2 x 1 + 3 x 2 − 5 x 3 S . t { x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 max \ z = 2x_{1} +3x_{2}-5x_{3} \\ S.t\left\{\begin{matrix} x_{1} + x_{2}+x_{3} = 7\\ 2x_{1} - 5x_{2} + x_{3}\ge10 \\ x_{1} + 3x_{2} + x_{3} \le 12 \\ x_{1},x_{2},x_{3}\ge 0 \end{matrix}\right. max z=2x1+3x25x3S.t x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30
    其标准形式为:
    m a x   z ⟺ − m i n − z max \ z\Longleftrightarrow -min-z max zminz c = [ − 2 − 3 5 ] , x = [ x 1 x 2 x 3 ] , A = [ − 2   5   − 1 1   2   1 ] , b = [ − 10 12 ] , A e q = [ 1   1   1 ] , b e q = [ 7 ] , l b = [ 0 0 0 ] c = \begin{bmatrix} -2 \\ -3 \\ 5 \end{bmatrix}, x = \begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \end{bmatrix}, A = \begin{bmatrix} -2 \ 5 \ -1 \\ 1 \ 2 \ 1 \end{bmatrix}, b=\begin{bmatrix} -10\\ 12 \end{bmatrix}, Aeq = \begin{bmatrix} 1 \ 1 \ 1 \end{bmatrix}, beq = \begin{bmatrix} 7 \end{bmatrix}, lb = \begin{bmatrix} 0\\ 0\\ 0 \end{bmatrix} c= 235 ,x= x1x2x3 ,A=[2 5 11 2 1],b=[1012],Aeq=[1 1 1],beq=[7],lb= 000
  • 使用matlab命令求解线性规划问题

    [x, fval] = linprog(c, A, b, Aeq, beq, lb, ub, X0)
    
  1. 返回值x:表示取得最优值的一组x取值;
  2. 返回值fval:目标函数的最优值;
  3. 参数除X0外同上,X0表示迭代求解的初始值,一般不需要额外给出;
  4. 对于不存的约束条件,使用[]占位;
  5. 对于无上下界约束的变量可以使用+inf-inf分别表示无上界和无下界。

例如:
m a x   z = 2 x 1 + 3 x 2 − 5 x 3 S . t { x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 max \ z = 2x_{1} +3x_{2}-5x_{3} \\ S.t\left\{\begin{matrix} x_{1} + x_{2}+x_{3} = 7\\ 2x_{1} - 5x_{2} + x_{3}\ge10 \\ x_{1} + 3x_{2} + x_{3} \le 12 \\ x_{1},x_{2},x_{3}\ge 0 \end{matrix}\right. max z=2x1+3x25x3S.t x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30

matlab命令为:

% 目标函数系数
c = [-2; -3; 5];
% 不等式约束数
A = [-2 5 -1;
     1 3 1];
b = [-10; 12];

% 等式约束
Aeq = [1 1 1];
beq = 7;

% 上下界约束
lb = [0; 0; 0];

[x, fval] = linprog(c, A, b, Aeq, beq, lb);
fval = -fval;

求解结果为:

Optimal solution found.

x =
    6.4286
    0.5714
         0

fval =
   14.5714

非线性规化

当目标函数或约束条件为非线性表达式时,那么此时的数学规划问题就是非线性规划问题。非线性规划问题的求解通常困难得多,目前没有通用的算法。大多数算法采用选定决策变量的初始值后,通过搜索的方式寻求最优解。

目标函数:
m i n   z = x 1 + 3 x 2 + 4 x 3 min \ z = x_{1} + 3x_{2} + 4x_{3} min z=x1+3x2+4x3
约束条件:
{ x 1 + x 2 − x 3 ⩽ 80 x 1 + 7 x 2 + x 3 = 120 0 ⩽ x 2 2 ⩽ 50 x 1 , x 3 ⩾ 20 \left\{\begin{matrix} x_{1} + x_{2} - x_{3} \leqslant 80 \\ x_{1} + 7x_{2} + x_{3} = 120 \\ 0 \leqslant x_{2}^{2} \leqslant 50 \\ x_{1}, x_{3} \geqslant 20 \end{matrix}\right. x1+x2x380x1+7x2+x3=1200x2250x1,x320

使用matlab求解非线性规划问题

  • matlab中非线性规划的标准型
    m i n f ( x ) min f(x) minf(x) S . t . { A   x ≤ b , A e q   x = b e q   ( 线性约束 ) C ( x ) ≤ 0 , C e q ( x ) = 0   ( 非线性约束 ) l b ≤ x ≤ u b   ( 上下界约束 ) S.t.\left\{\begin{matrix} A \ x\le b, Aeq \ x= beq \ (线性约束)\\ C\left ( x \right ) \le 0, Ceq(x) = 0 \ (非线性约束)\\ lb\le x\le ub \ (上下界约束) \end{matrix}\right. S.t. A xb,Aeq x=beq (线性约束)C(x)0,Ceq(x)=0 (非线性约束)lbxub (上下界约束)
  1. 其中C(x)和Ceq(x)分别为非线性不等式约束和非线性等式约束。
  2. C(x)和Ceq(x)的右侧必须为零。当不为零时需要进行移项。
  3. 所求解的目标函数必须是最小值,为此如果得到一个求解最大值的目标函数时,需对目标函数乘-1,此时求解到的最小值再乘-1即为最大值。
    m a x   z ⟺ − m i n − z max \ z\Longleftrightarrow -min-z max zminz
  4. 所有的不等式必须为小于等于类型,此时如果你有一个大于等于类型的不等式时,可以对不等式两端同时乘-1以促使符号取反。例如以下两个公式是等价的:
    4 x 1 + 6 x 2 − 7 x 3 ≥ 17 − 4 x 1 − 6 x 2 + 7 x 3 ≤ − 17 4x_{1} + 6x_{2} -7x_{3} \ge 17 \\ -4x_{1} - 6x_{2}+7x_{3} \le -17 4x1+6x27x3174x16x2+7x317
    如果只有大于或小于时,只能采取加上或减去一个非常小的值,来得到符合精度要求的解。
    4 x 1 − 7 x 2 + x 3 < 4 ⇒ 4 x 1 − 7 x 2 + x 3 ≤ 4 − 0.001 4x_{1} -7x_{2}+x_{3}<4\Rightarrow 4x_{1} -7x_{2}+x_{3}\le 4-0.001 4x17x2+x3<44x17x2+x340.001
    例2,例如:
    m i n   f ( x ) = x 1 2 + x 2 2 + x 3 2 + 7 S . t . { x 1 2 − x 2 + x 3 2 ≥ 0 x 1 + x 2 2 + x 3 2 ≤ 20 − x 1 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 + x 2 + x 3 ≤ 5 x 1 , x 2 , x 3 ≥ 0 min \ f(x) = x_{1}^{2} + x_{2}^{2} + x_{3}^{2} + 7 \\ S.t.\left\{\begin{matrix} x_{1}^{2}-x_{2}+x_{3}^{2} \ge 0 \\ x_{1}+x_{2}^{2}+x_{3}^{2} \le20 \\ -x_{1}-x_{2}^{2}+2 = 0\\ x_{2}+2x_{3}^{2} = 3\\ x_{1} + x_{2} + x_{3}\le 5 \\ x_{1} , x_{2} , x_{3} \ge 0 \end{matrix}\right. min f(x)=x12+x22+x32+7S.t. x12x2+x320x1+x22+x3220x1x22+2=0x2+2x32=3x1+x2+x35x1,x2,x30
    其标准形式为:
    S . t . ( A = [ 1   1   1 ] , b = 5 , A e q = [ ] , b e q = [ ] , C ( x ) = [ − x 1 2 + x 2 − x 3 2 x 1 + x 2 2 + x 3 2 − 20 ] , C e q = [ − x 1 − x 2 2 + 2 x 2 + 2 x 3 2 − 3 ] , l b = [ 0 0 0 ] ) S.t.\begin{pmatrix} A = \begin{bmatrix} 1 \ 1 \ 1 \end{bmatrix}, b = 5, Aeq = [], beq = [],\\ C(x) = \begin{bmatrix} -x_{1}^{2}+x_{2}-x_{3}^{2} \\ x_{1}+x_{2}^{2}+x_{3}^{2} - 20 \end{bmatrix}, Ceq = \begin{bmatrix} -x_{1}-x_{2}^{2}+2 \\ x_{2}+2x_{3}^{2} - 3 \end{bmatrix}, \\ lb = \begin{bmatrix} 0\\ 0\\ 0 \end{bmatrix} \end{pmatrix} S.t. A=[1 1 1],b=5,Aeq=[],beq=[],C(x)=[x12+x2x32x1+x22+x3220],Ceq=[x1x22+2x2+2x323],lb= 000
  • 使用matlab命令求解非线性规划
    matlab求解非线性规划的函数
    [x, val] = fmincon(@fun, X0, A, b, Aeq, beq, lb, ub, @nonfun, option)
    
  1. @fun表示目标函数, 需要单独编写一个m文件储存目标函数。

    function f = func(x)
    	f = x(1) ^ 2 + x(2) + ... - x(n) ^ 4
    end
    

    其中,f为返回值,x为变量是一个向量。

  2. X0为初始值。不同于线性规划,非线性规划中的初始值选取非常重要,因为线性规划求解出的结果只是一个局部最优解。要想使结果尽可能可以采用以下几个方法:(1)给定不同的初始值,在里面找最优解;(2)先使用蒙特卡洛得到一个解,并使用这个解作为初始值求解。

  3. A, b, Aeq, beq, lb, ub同上。

  4. @nonlfun表示非线性约束条件函数。

    function [c, ceq] = nonlfunc(x)
    	c = [非线性不等式约束1,非线性不等式约束2...非线性不等式约束n]
    	c = [非线性等式约束1,非线性等式约束2...非线性等式约束n]
    end
    
  5. 当有的约束条件不存在时使用[]占位即可。

  6. option 求解算法的选择。matlab一共提供了4中不同的选项,各有各的实应条件以及优缺点,不妨使用不同的算法依次求解选取最优值。四种算法依次为:interior-point内点法(不主动修改选项的话为默认值)、sqp序列二次规划法、active-set有效集法和trust-region-reflective信赖域反射算法。
    更换求解算法的方法:

    option = optimoption('fmincon', 'Algorithm', '选择算法')
    % 可供选择的算法有 interior-point、sqp、active-set、trust-region-reflective
    

对于例2,matlab求解代码为:
func.m(目标函数)

% 目标函数 

function f = func(x)
    f = x(1)^2 + x(2)^2 + x(3)^2 + 7;
end

nonlfunc.m(非线性约束条件)

% 非线性约束条件

function [c,ceq] = nonlfunc(x)
    c = [-x(1)^2 + x(2) - x(3)^2;
         x(1) + x(2)^2 + x(3)^2 - 20];
    ceq = [-x(1) - x(2)^2 + 2;
           x(2) + 2*x(3)^2 - 3];
end

求解代码:

% 线性不等式约束
A = [1 1 1];
b = 5;

% 上下界约束
lb = [0 0 0]';

% 初始值选取 注意选取的初始值越合理(符合约束),得到的值越优求解速度越快
x0 = [1 1 1];

[x, fval] = fmincon(@func, x0, A, b, [], [], lb, [], @nonlfunc);

求解结果:

x =
    0.5522    1.2033    0.9478
    
fval =
    9.6511

可以看出针对此题的初始值的选取还是不错的,但是初始值选取运气并不总是非常好。需要采取一定的策略。例如,采用蒙特卡洛模拟:

% 随机组数
n = 10000000;

% 根据后两个约束条件进一步压缩随机数范围
x1 = unifrnd(0, 5, n, 1); % 生成n组[0, 5]之间的随机数
x2 = unifrnd(0, 5, n, 1);
x3 = unifrnd(0, 5, n, 1);

fmin = +inf;

for i = 1 : n
    xx = [x1(i) x2(i) x3(i)];
    if (xx(1)^2 - xx(2) + xx(3)^2 >=0 && xx(1) + xx(2)^2 + xx(3)^2 <=20)
        result = xx(1)^2 + xx(2)^2 + xx(3)^2 + 7;
        if result < fmin
            fmin = result;
            x0 = xx;
        end
    end
end

disp(x0); % 模拟得到的一组初值为0.0601    0.0043    0.0380
[x, fval] = fmincon(@func, x0, A, b, [], [], lb, [], @nonlfunc);

整数规化

整数规划是一类变量为整数的数学规划问题。分为整数线性规划整数非线性规划。目前,所流行的整数规划算法往往只能求解整数线性规划。

使用matlab求解整数规划问题–线性

[x, fval] = intlinprog(c, intcon, A, b, Aeq, beq, lb, ub)
  1. intlinprog不能指定初始值;
  2. 加入了intcon参数可以指定哪些参数必须是整数。例如决策变量有三个[x1, x2, x3],当intcon = [1, 3]表示决策变量1和决策变量3必须是整数。

例如:
m a x   z = 2 x 1 + 3 x 2 − 5 x 3 S . t { x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3   ∈ Z x 1 , x 2 , x 3 ≥ 0 max \ z = 2x_{1} +3x_{2}-5x_{3} \\ S.t\left\{\begin{matrix} x_{1} + x_{2}+x_{3} = 7\\ 2x_{1} - 5x_{2} + x_{3}\ge10 \\ x_{1} + 3x_{2} + x_{3} \le 12 \\ x_{1}, x_{2}, x_{3 \ \in Z} \\ x_{1},x_{2},x_{3}\ge 0 \end{matrix}\right. max z=2x1+3x25x3S.t x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x3 Zx1,x2,x30
matlab程序:

% 目标函数系数
c = [-2; -3; 5];
% 不等式约束数
A = [-2 5 -1;
     1 3 1];
b = [-10; 12];

% 等式约束
Aeq = [1 1 1];
beq = 7;

% 上下界约束
lb = [0; 0; 0];

[x, fval] = intlinprog(c, [1, 2, 3], A, b, Aeq, beq, lb);
fval = -fval;

求解结果:

x =
    7.0000
         0
         0
         
fval =
   14.0000

0-1规化

0-1规划是整数规划的特例,0-1规划的变量取值只能为0或1.

使用matlab求解01规划问题–线性

[x, fval] = intlinprog(c, intcon, A, b, Aeq, beq, lb, ub)

与求解线性整数规划相同,只需要修改上下界约束为:
l b = [ 0 0 0 0 ] , u b = [ 1 1 1 1 ] lb=\begin{bmatrix} 0\\ 0\\ 0\\ 0 \end{bmatrix}, ub=\begin{bmatrix} 1\\ 1\\ 1\\ 1 \end{bmatrix} lb= 0000 ,ub= 1111

使用整数线性01规划求解01背包问题(背包容量为30):

物品 1 2 3 4 5 6 7 8 9 10
重量 6 3 4 5 1 2 3 5 4 2
价值 540 200 180 350 60 150 280 450 320 120

matlab求解程序:

% 目标函数系数
c = [-540; -200; -180; -350; -60; -150; -280; -450; -320; -120];
% 不等式约束数
A = [6 3 4 5 1 2 3 5 4 2];
b = 30;

intcon = 1:10;

% 上下界约束
lb = zeros(10, 1);
ub = ones(10, 1);

[x, fval] = intlinprog(c, intcon, A, b, [], [], lb, ub);
fval = -fval;

求解结果:

x =
     1
     1
     0
     1
     0
     1
     1
     1
     1
     1
     
fval =
        2410

你可能感兴趣的:(数学建模,matlab,数学规划,数学建模)