数学建模条记—— 整数规划和0-1规划

[复制链接]
发表于 2026-1-25 23:13:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
整数规划和0-1规划

1. 模子原理

1.1 根本概念

在规划题目中,有些最优解大概是分数或小数,但对于某些具体题目,常要求某些变量(全部或部分)的解必须是整数。比方,当变量代表的是呆板的台数,工作的人数或装货的车数等。为了满意整数的要求,初看起来似乎只要把已得的非整数解舍入化整就可以了。现实上化整后的数不见得是可行解和最优解,以是应该有特别的方法来求解整数规划。在整数规划中,假如全部变量都限定为整数,则称为纯整数规划;假如仅一部分变量限定为整数,则称为肴杂整数规划。整数规划的一种特别情况是0-1规划,它的变数仅限于0或1。
整数规划:

  • 线性整数规划
    matlab可举行求解,在线性规划的根本上,参加决议变量取整数的条件
  • 非线性整数规划
    无特定算法,只能用近似算法,如蒙特卡罗模仿,智能算法
  • 0-1规划
    特别的整数规划,matlab中也只能求解线性0-1规划,对于非线性0-1规划也只能求近似解
1.2 线性整数规划求解

                               [                      x                      ,                      f                      v                      a                      l                      ]                      =                      i                      n                      t                      l                      i                      n                      p                      r                      o                      g                      (                      f                      ,                      i                      n                      t                      c                      o                      n                      ,                      A                      ,                      b                      ,                      A                      e                      q                      ,                      b                      e                      q                      ,                      l                      b                      ,                      u                      b                      ,                      x                      0                      )                          [x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0)               [x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0)
此中:


  •                                    f                              f                  f——目的函数的系数变量(必须是求最小值情势下的)
  •                                    i                         n                         t                         c                         o                         n                              intcon                  intcon——                                   i                         n                         t                         c                         o                         n                              intcon                  intcon中的值指示决议变量x中应取整数值的分量
  •                                    A                         ,                         b                              A,b                  A,b——不等式束缚条件的变量系数矩阵和常数项矩阵(必须是                                   ≤                              \le                  ≤情势)
  •                                    A                         e                         q                         ,                         b                         e                         q                              Aeq,beq                  Aeq,beq——等式束缚条件的变量系数矩阵和常数项矩阵
  •                                    l                         b                         ,                         u                         b                              lb,ub                  lb,ub——决议变量的最小取值和最大取值
                               i                      n                      t                      c                      o                      n                          intcon               intcon的用法:决议变量假如有三个:                                       x                         1                              ,                               x                         2                              ,                               x                         3                                  x_1,x_2,x_3               x1​,x2​,x3​;若                                       x                         1                                  x_1               x1​和                                       x                         2                                  x_2               x2​是整数,则                              i                      n                      t                      c                      o                      n                      =                      [                      1                      ,                      3                      ]                          intcon=[1,3]               intcon=[1,3]
1.3 线性0-1规划的求解

仍然利用                              i                      n                      t                      l                      i                      n                      p                      r                      o                      g                          intlinprog               intlinprog函数求解,只必要限定                              l                      b                          lb               lb和                              u                      b                          ub               ub即可
比方:三个决议变量:                                       x                         1                              ,                               x                         2                              ,                               x                         3                                  x_1,x_2,x_3               x1​,x2​,x3​,                                       x                         1                                  x_1               x1​和                                       x                         3                                  x_3               x3​是0-1变量,                                       x                         2                                  x_2               x2​不限定,则                              i                      n                      t                      c                      o                      n                      =                      [                      1                      ,                      3                      ]                      ,                      l                      b                      =                      [                      0                      ;                      −                      i                      n                      f                      ;                      0                      ]                      ,                      u                      b                      =                      1                      ;                      +                      i                      n                      f                      ;                      1                          intcon=[1,3],lb=[0;-inf;0],ub=1;+inf;1               intcon=[1,3],lb=[0;−inf;0],ub=1;+inf;1
2. 范例例题

2.1 背包题目

   有10件资物要从中地运送到乙地。每件货品的重量(单元:吨)和利润(单元:元)如下表所示
  物品12345678910重量(t)6345123542利润 (元)54020018035060150280450320120  由于只有一辆最大载重为30t的货车能用来运送货品,以是只能选择部分货品举行运送,要求以为运送哪些货品,使得这些货品的总利润最大
  记
                                              x                            i                                  =                                   {                                                                                             1                                           ,                                           运送了第                                           i                                           件货品                                                                                                                                       0                                            没有运送第                                           i                                           件货品                                                                                                                                                         ,                         i                         =                         1                         ,                         2                         ,                         …                         ,                         10                               x_i=\begin{cases}1,\text{运送了第}i\text{件货品}\\0\text{ 没有运送第}i\text{件货品}&\end{cases},i=1,2,\ldots,10                   xi​={1,运送了第i件货品0 没有运送第i件货品​​,i=1,2,…,10
记
                                    记                                   w                            i                                  体现第                         i                         件物品的重量,                                    p                            i                                  体现第                         i                         件物品的利润                               \text{记}w_i\text{体现第}i\text{件物品的重量, }p_i\text{体现第}i\text{件物品的利润}                   记wi​体现第i件物品的重量, pi​体现第i件物品的利润
则有
                                    m                         a                         x                                    ∑                                       i                               =                               1                                      10                                            p                            i                                            x                            i                                          s                         .                         t                         .                                   {                                                                                                             ∑                                                               i                                                 =                                                 1                                                              10                                                                          w                                              i                                                                          x                                              i                                                          ≤                                           30                                                                                                                                                       x                                              i                                                          ∈                                           {                                           0                                           ,                                           1                                           }                                                                                                    max\:\sum_{i=1}^{10}p_ix_i\\s.t.\begin{cases}\sum_{i=1}^{10}w_ix_i\leq30\\x_i\in\{0,1\}\end{cases}                   maxi=1∑10​pi​xi​s.t.{∑i=110​wi​xi​≤30xi​∈{0,1}​
转化后得
                                    m                         i                         n                          −                                   ∑                                       i                               =                               1                                      10                                            p                            i                                            x                            i                                          s                         .                         t                         .                                   {                                                                                                             ∑                                                               i                                                 =                                                 1                                                              10                                                                          w                                              i                                                                          x                                              i                                                          ≤                                           30                                                                                                                                                       x                                              i                                                          ∈                                           {                                           0                                           ,                                           1                                           }                                                                                                    min\:-\sum_{i=1}^{10}p_{i}x_{i}\\s.t.\begin{cases}\sum_{i=1}^{10}w_ix_i\leq30\\x_i\in\{0,1\}\end{cases}                   min−i=1∑10​pi​xi​s.t.{∑i=110​wi​xi​≤30xi​∈{0,1}​
2.2 指派题目

已知5名游泳候选人的百米结果怎么选拔队员构成                              4                      ×                      100                          4\times100               4×100米肴杂泳接力队伍
  蝶泳仰泳蛙泳自由泳 甲66.875.68758.6乙57.26666.453丙7867.884.659.4丁7074.269.657.2戊67.47183.862.4 候 选 人 :                               i                      =                      1                      ,                      2                      ,                      3                      ,                      4                      ,                      5                          i= 1, 2, 3, 4, 5               i=1,2,3,4,5
泳姿:                              j                      =                      1                      ,                      2                      ,                      3                      ,                      4                          j=1,2,3,4               j=1,2,3,4
                                        x                                   i                            j                                       =                               {                                                                                     1                                        ,                                        队员                                        i                                        参加第                                        j                                        种泳姿                                                                                                                            0                                        ,                                        队员                                        i                                        不参加第                                        j                                        种泳姿                                                                                         x_{ij}=\left\{\begin{array}{l}1,\text{队员}i\text{参加第}j\text{种泳姿}\\0,\text{队员}i\text{不参加第}j\text{种泳姿}\end{array}\right.               xij​={1,队员i参加第j种泳姿0,队员i不参加第j种泳姿​
                                        t                                   i                            j                                           t_{ij}               tij​:队员                              i                          i               i参加第                              j                          j               j种泳姿的耗时
建模如下:
                                                                                                                                               m                                     i                                     n                                                               ∑                                                       j                                           =                                           1                                                      4                                                                ∑                                                       i                                           =                                           1                                                      5                                                                t                                                       i                                           j                                                                              x                                                       i                                           j                                                                                                                                                                                                         s                                     .                                     t                                     .                                                   {                                                                                                                                                 ∑                                                                               j                                                             =                                                             1                                                                              4                                                                                              x                                                                               i                                                             j                                                                                              ≤                                                       1                                                       ,                                                       i                                                       =                                                       1                                                       ,                                                       2                                                       ,                                                       3                                                       ,                                                       4                                                       ,                                                       5                                                                                                                                    (每个人只能入选4种泳姿之一)                                                                                                                                                                                     ∑                                                                               i                                                             =                                                             1                                                                              5                                                                                              x                                                                               i                                                             j                                                                                              =                                                       1                                                       ,                                                       j                                                       =                                                       1                                                       ,                                                       2                                                       ,                                                       3                                                       ,                                                       4                                                                                                                                    (每种泳姿有且仅有1人参加)                                                                                                                                                                                     x                                                                               i                                                             j                                                                                              ∈                                                       {                                                       0                                                       ,                                                       1                                                       }                                                                                                                                                                      \begin{aligned}&min\quad\sum_{j=1}^4\sum_{i=1}^5t_{ij}x_{ij}\\&s.t.\begin{cases}\sum_{j=1}^4x_{ij}\leq1,i=1,2,3,4,5&\text{(每个人只能入选4种泳姿之一)}\\\sum_{i=1}^5x_{ij}=1,j=1,2,3,4&\text{(每种泳姿有且仅有1人参加)}\\x_{ij}\in\{0,1\}\end{cases}\end{aligned}                   ​minj=1∑4​i=1∑5​tij​xij​s.t.⎩                      ⎨                      ⎧​∑j=14​xij​≤1,i=1,2,3,4,5∑i=15​xij​=1,j=1,2,3,4xij​∈{0,1}​(每个人只能入选4种泳姿之一)(每种泳姿有且仅有1人参加)​​
3. matlab代码实现

3.1 背包题目

  1. %% 背包问题(货车运送货物的问题)
  2. clc
  3. clear
  4. c=-[540 200 180 350 60 150 280 450 320 120]; % 目标函数的系数矩阵
  5. intcon=1:10; %整数变量的位置
  6. A=[6 3 4 5 1 2 3 5 4 2]; %线性不等式约束系数矩阵
  7. Aeq=[]; % 线性不等式约束
  8. beq=[]; % 线性不等式约束
  9. b=30; %线性不等式约束的常系数向量
  10. lb=zeros(10,1); %约束变量的范围下限
  11. ub=ones(10,1); %约束变量的范围上限
  12. % 调用intlinprog()函数进行求解
  13. [x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
  14. fval=-fval
复制代码
输出:
  1. Running HiGHS 1.6.0: Copyright (c) 2023 HiGHS under MIT licence terms
  2. Presolving model
  3. 1 rows, 10 cols, 10 nonzeros
  4. 1 rows, 7 cols, 7 nonzeros
  5. Objective function is integral with scale 0.1
  6. Solving MIP model with:
  7.    1 rows
  8.    7 cols (6 binary, 1 integer, 0 implied int., 0 continuous)
  9.    7 nonzeros
  10.         Nodes      |    B&B Tree     |            Objective Bounds              |  Dynamic Constraints |       Work      
  11.      Proc. InQueue |  Leaves   Expl. | BestBound       BestSol              Gap |   Cuts   InLp Confl. | LpIters     Time
  12.          0       0         0   0.00%   -2650           inf                  inf        0      0      0         0     0.0s
  13. T       0       0         0   0.00%   -2650           -2410              9.96%        0      0      0         1     0.0s
  14. Solving report
  15.   Status            Optimal
  16.   Primal bound      -2410
  17.   Dual bound        -2410
  18.   Gap               0% (tolerance: 0.01%)
  19.   Solution status   feasible
  20.                     -2410 (objective)
  21.                     0 (bound viol.)
  22.                     0 (int. viol.)
  23.                     0 (row viol.)
  24.   Timing            0.01 (total)
  25.                     0.00 (presolve)
  26.                     0.00 (postsolve)
  27.   Nodes             1
  28.   LP iterations     1 (total)
  29.                     0 (strong br.)
  30.                     0 (separation)
  31.                     0 (heuristics)
  32. 找到最优解。
  33. Intlinprog 在根节点处停止,因为目标值在最优值的间隙容差范围内,options.AbsoluteGapTolerance = 1e-06。intcon 变量是
  34. 容差范围内的整数,options.ConstraintTolerance = 1e-06。
  35. x =
  36.      1
  37.      1
  38.      0
  39.      1
  40.      0
  41.      1
  42.      1
  43.      1
  44.      1
  45.      1
  46. fval =
  47.        -2410
  48. fval =
  49.         2410
复制代码
3.2 指派题目

  1. %% 指派问题(选择队员去进行游泳接力比赛)
  2. clear;clc
  3. % 双下标要转化为单下标:x11(x1),x12(x2),...,x24(x8),...,x54(x20)
  4. % 目标函数的系数矩阵(先列后行的写法)
  5. c=[66.8 75.6 87 58.6 57.2 66 66.4 53 78 67.8 84.6 59.4 70 74.2 69.6 57.2 67.4 71 83.8 62.4]';
  6. % 整数变量的位置
  7. intcon=1:20;
  8. % 线性不等式约束的系数矩阵和常数项向量
  9. A=[1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ;
  10.    0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ;
  11.    0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 ;
  12.    0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 ;
  13.    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 ];
  14. b=[1;1;1;1;1];
  15. % 线性等式约束的系数矩阵和常数项向量
  16. Aeq=[eye(4),eye(4),eye(4),eye(4),eye(4)];
  17. beq=[1;1;1;1];
  18. % 约束变量的范围下限
  19. lb=zeros(20,1);
  20. % 约束变量的范围上限
  21. ub=ones(20,1);
  22. % 约束变量的范围上限
  23. % 调用intlinprog()函数进行求解
  24. [x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
  25. reshape(x,4,5)'
复制代码
输出:
  1. %% 指派问题(选择队员去进行游泳接力比赛)
  2. clear;clc
  3. % 双下标要转化为单下标:x11(x1),x12(x2),...,x24(x8),...,x54(x20)
  4. % 目标函数的系数矩阵(先列后行的写法)
  5. c=[66.8 75.6 87 58.6 57.2 66 66.4 53 78 67.8 84.6 59.4 70 74.2 69.6 57.2 67.4 71 83.8 62.4]';
  6. % 整数变量的位置
  7. intcon=1:20;
  8. % 线性不等式约束的系数矩阵和常数项向量
  9. A=[1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ;
  10.    0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ;
  11.    0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 ;
  12.    0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 ;
  13.    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 ];
  14. b=[1;1;1;1;1];
  15. % 线性等式约束的系数矩阵和常数项向量
  16. Aeq=[eye(4),eye(4),eye(4),eye(4),eye(4)];
  17. beq=[1;1;1;1];
  18. % 约束变量的范围下限
  19. lb=zeros(20,1);
  20. % 约束变量的范围上限
  21. ub=ones(20,1);
  22. % 约束变量的范围上限
  23. % 调用intlinprog()函数进行求解
  24. [x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
  25. reshape(x,4,5)'
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表