规划模型的典型例题

规划模型的典型例题

(1) 平板装货问题

有七种规格的包装箱要装到两辆平板车上。包装箱的宽和高是一样的,但厚度t (厘米)和重量w (公斤)是不同的。下表给出了每种包装箱的厚度,重量以及数量。
每辆平板车有10.2米的地方可用来装包装箱(象面包片那样), 载重为40吨。由于地区货运的限制,对C5,C6,C7类包装箱的总数有一个特别的限制:这三类包装箱所占空间(厚度)不能超过302.7厘米。
问题要求:设计一种装车方案,使剩余的空间最小。

  • 首先找到已知的参量
    • 各类型的包装的厚度: t i ( i = 1 … 7 ) t_i(i=1\dots7) ti(i=17)
    • 各类型的包装的重量: w i ( i = 1 … 7 ) w_i(i=1\dots7) wi(i=17)
    • 各类型包装的件数: n i ( i = 1 … 7 ) n_i(i=1\dots7) ni(i=17)
    • 平板车的空间: S p a c e = 1020 c m Space=1020cm Space=1020cm
    • 平板车的载重: W e i g h t = 40000 k g Weight=40000kg Weight=40000kg
    • 三类包装箱所占的空间上限: L i m i t = 302.7 Limit=302.7 Limit=302.7
  • 设出需要使用的变量:
    • 第一辆车上装载的各类型包装的数量: x i ( i = 1 … 7 ) x_i(i=1\dots7) xi(i=17)
    • 第二辆车上装载的各类型包装的数量: y i ( i = 1 … 7 ) y_i(i=1\dots7) yi(i=17)
  • 明确问题的要求:
    min ⁡ { 2 × S p a c e − ∑ i = 1 7 t i x i − ∑ i = 1 7 t i y i } \min\{2\times Space-\displaystyle \sum^{7}_{i=1}t_ix_i- \displaystyle \sum^{7}_{i=1}t_iy_i\} min{ 2×Spacei=17tixii=17tiyi}
  • 列出各限定方程:
    • x i + y i ≤ n i ( i = 1 … 7 ) x_i+y_i\leq n_i(i=1\dots7) xi+yini(i=17)
    • ∑ i = 1 7 w i ( x i + y i ) ≤ 40000 \displaystyle \sum^{7}_{i=1}w_i(x_i+y_i)\leq40000 i=17wi(xi+yi)40000
    • ∑ i = 1 7 t i x i ≤ 1020 \displaystyle \sum^{7}_{i=1}t_ix_i\leq1020 i=17tixi1020
    • ∑ i = 1 7 t i y i ≤ 1020 \displaystyle \sum^{7}_{i=1}t_iy_i\leq1020 i=17tiyi1020
    • ∑ i = 5 7 t i ( x i + y i ) ≤ 302.7 \displaystyle \sum^{7}_{i=5}t_i(x_i+y_i)\leq302.7 i=57ti(xi+yi)302.7
  • 下面给出Lingo的求解代码:
    model: !程序由model开始,由end结束;
    sets:  !sets开始设置变量,endsets结束变量设置;
    num/1..7/:t,w,n,x,y; !定义5个数组分别为t,w,n,x,y
    endsets
    data:  !数据设置由data开始,由enddata结束;
    t=48.7,52.0,61.3,72.0,48.7,52.0,64.0;
    w=2000,3000,1000,500,4000,2000,1000;
    n=8,7,9,6,6,4,8;
    enddata
    min=(1020-@sum(num:t*x))+(1020-@sum(num:t*y));!说明需要优化的为min;
    !以下是进行条件限制的量
    @sum(num:t*x)<=1020;
    @sum(num:t*y)<=1020;
    @sum(num:w*x)<=40000;
    @sum(num:w*y)<=40000;
    @for(num(i):x(i)+y(i)<=n(i));
    @sum(num(i)|i#ge#5#and#i#le#7:(x(i)+y(i))*t(i))<=302.7;
    @for(num:@gin(x));
    @for(num:@gin(y));
    end

(2) 选修课策略问题

某学校规定,运筹学专业的学生毕业时必须至少学习过两门数学课、三门运筹学课和两门计算机课。这些课程的编号、名称、学分、所属类别和先修课要求如下表所示。
问题:
1.毕业时学生最少可以学习这些课程中哪些课程?
2.如果某个学生既希望选修课程的数量少,又希望所获得的学分多,他可以选修哪些课程?

  • 找到已知参量:
    • 各个课程 x i ( i = 1 … 9 ) x_i(i=1\dots9) xi(i=19)进行 0 , 1 0,1 0,1参量的设定,选择为 1 1 1,未选择为 0 0 0
    • 各课程的学分 s c o r e i ( i = 1 … 9 ) score_i(i=1\dots9) scorei(i=19)

问题1

  • 明确问题的要求:
    • m i n ∑ i = 1 9 x i min \displaystyle \sum_{i=1}^{9}x_i mini=19xi(保证课程的学习数量最少)
  • 列出各限定方程:
    • 首先保证满足数学两门,运筹学三门,计算机两门。
      • ∑ i = 1 5 x i ≥ 2 \displaystyle\sum_{i=1}^{5}x_i\geq2 i=15xi2
      • x 3 + x 5 + x 6 + x 8 + x 9 ≥ 3 x_3+x_5+x_6+x_8+x_9\geq3 x3+x5+x6+x8+x93
      • x 4 + x 6 + x 7 + x 9 ≥ 2 x_4+x_6+x_7+x_9\geq2 x4+x6+x7+x92
    • 再保证先修课的要求。⭐️这里采取的方法是:如果 x a x_a xa x b x_b xb的先修课,则 x a ≥ x b x_a\geq x_b xaxb
      • x 3 ≤ x 1 x_3\leq x_1 x3x1
      • x 3 ≤ x 2 x_3\leq x_2 x3x2
      • x 4 ≤ x 7 x_4\leq x_7 x4x7
      • x 5 ≤ x 1 x_5\leq x_1 x5x1
      • x 5 ≤ x 2 x_5\leq x_2 x5x2
      • x 6 ≤ x 7 x_6\leq x_7 x6x7
      • x 8 ≤ x 5 x_8\leq x_5 x8x5
      • x 9 ≤ x 1 x_9\leq x_1 x9x1
      • x 9 ≤ x 2 x_9\leq x_2 x9x2
  • 下面给出Lingo的求解方程:
  model:
  sets:
  num/1..9/:x;
  endsets
  min=@sum(num(i):x(i));
  x(3)<=x(1);
  x(3)<=x(2);
  x(4)<=x(7);
  x(5)<=x(1);
  x(5)<=x(2);
  x(6)<=x(7);
  x(8)<=x(5);
  x(9)<=x(1);
  x(9)<=x(2);
  @sum(num(i)|i#ge#1#and#i#le#5:x(i))>=2;
  x(3)+x(5)+x(6)+x(8)+x(9)>=3;
  x(4)+x(6)+x(7)+x(9)>=2;
  @for(num:@bin(x));
  end

可以知道优化的结果为6,也就是最少上6门课。

问题2

  • 明确问题的要求:
    • max ⁡ { ∑ i = 1 9 s c o r e i ∗ x i } \max\{\displaystyle\sum_{i=1}^{9}score_i*x_i\} max{ i=19scoreixi}
  • 增加的条件:
    • ∑ i = 1 9 x i = 6 \displaystyle \sum_{i=1}^{9}x_i=6 i=19xi=6,保证选课的数量最少。
  • 下面给出Lingo的代码
  model:
  sets:
  num/1..9/:x,score;
  endsets
  data:
  score=5,4,4,3,4,3,2,2,3;
  enddata
  max=@sum(num(i):score(i)*x(i));
  @sum(num(i):x(i))=6;
  x(3)<=x(1);
  x(3)<=x(2);
  x(4)<=x(7);
  x(5)<=x(1);
  x(5)<=x(2);
  x(6)<=x(7);
  x(8)<=x(5);
  x(9)<=x(1);
  x(9)<=x(2);
  @sum(num(i)|i#ge#1#and#i#le#5:x(i))>=2;
  x(3)+x(5)+x(6)+x(8)+x(9)>=3;
  x(4)+x(6)+x(7)+x(9)>=2;
  @for(num:@bin(x));
  end

(3) 最优组队问题

某车间要参加单位举办的技术操作比赛,比赛设有5个单项和一个全能项目(同时参加5个单项),14人参加。
如果比赛规定:
(1)每个车间可派14人参加比赛,每人至少参赛一项;
(2)参加比赛的队员中必须有3人参加全能比赛,其余队员参加单项比赛,且参加每个单项比赛的队员数不得超过6人(不包括全能队员);
(3)参加全能的队员不能参加单项;
(4)参加单项比赛的队员至多可以参加3个单项;
(5)参加单项比赛的队员得分是其参加项目得分之和,参加全能比赛的队员得分是其参加项目得分和的4/5,车间的得分是车间所有参赛队员得分之和。
问如何安排参加比赛最好?

  • 找到已知各参量
    • 参加单项的队员: x i j ( i = 1 … 14 , j = 1 … 5 ) x_{ij}(i=1\dots14,j=1\dots5) xij(i=114,j=15)。(参加记为1,未参加记为0)。
    • 参加全能的队员: y i ( i = 1 … 14 ) y_i(i=1\dots14) yi(i=114)。(这里保证参加过全能的队员不再出现在参加过单项的队员中,并且参加记为1,未参加记为0)。
    • 队员各比赛的期望得分为 s c o r e i j ( i = 1 … 14 , j = 1 … 5 ) score_{ij}(i=1\dots14,j=1\dots5) scoreij(i=114,j=15)
  • 明确问题的要求
    明显最好的参赛结果就是尽可能的得到一个较高的分数。
    max ⁡ { ∑ i = 1 14 ∑ j = 1 5 x i j × s c o r e i j + 4 5 ∑ i = 1 14 y i ( ∑ j = 1 5 s c o r e i j ) } \max\{\displaystyle\sum_{i=1}^{14}\sum_{j=1}^{5}x_{ij}\times score_{ij}+\dfrac{4}{5}\sum_{i=1}^{14}y_i(\sum_{j=1}^{5}score_{ij})\} max{ i=114j=15xij×scoreij+54i=114yi(j=15scoreij)}
  • 列出各限定方程
    • y i + ∑ j = 1 5 x i j ≥ 1 ( i = 1 … 14 ) y_i+\displaystyle\sum_{j=1}^{5}x_{ij}\geq1(i=1\dots14) yi+j=15xij1(i=114)(保证每个人至少参加一项比赛)。
    • ∑ i = 1 14 y i = 3 \displaystyle\sum_{i=1}^{14}y_i=3 i=114yi=3(保证参加全能比赛的人数必须为3人)。
    • ∑ j = 1 14 x i j ≤ 6 ( i = 1 … 5 ) \displaystyle \sum_{j=1}^{14}x_{ij}\leq6(i=1\dots5) j=114xij6(i=15)(保证每一个单项比赛参加的人数都不超过6人)。
    • ∑ i = 1 5 x i j ≤ 3 ( j = 1 … 14 ) \displaystyle \sum_{i=1}^{5}x_{ij}\leq3(j=1\dots14) i=15xij3(j=114)(保证每个参加单项比赛的人最多参加3项)。

猜你喜欢

转载自blog.csdn.net/weixin_44618906/article/details/104238531