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

- 首先找到已知的参量
- 各类型的包装的厚度: t i ( i = 1 … 7 ) t_i(i=1\dots7) ti(i=1…7)。
- 各类型的包装的重量: w i ( i = 1 … 7 ) w_i(i=1\dots7) wi(i=1…7)。
- 各类型包装的件数: n i ( i = 1 … 7 ) n_i(i=1\dots7) ni(i=1…7)。
- 平板车的空间: 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=1…7)
- 第二辆车上装载的各类型包装的数量: y i ( i = 1 … 7 ) y_i(i=1\dots7) yi(i=1…7)
- 明确问题的要求:
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×Space−i=1∑7tixi−i=1∑7tiyi} - 列出各限定方程:
- x i + y i ≤ n i ( i = 1 … 7 ) x_i+y_i\leq n_i(i=1\dots7) xi+yi≤ni(i=1…7)
- ∑ i = 1 7 w i ( x i + y i ) ≤ 40000 \displaystyle \sum^{7}_{i=1}w_i(x_i+y_i)\leq40000 i=1∑7wi(xi+yi)≤40000
- ∑ i = 1 7 t i x i ≤ 1020 \displaystyle \sum^{7}_{i=1}t_ix_i\leq1020 i=1∑7tixi≤1020
- ∑ i = 1 7 t i y i ≤ 1020 \displaystyle \sum^{7}_{i=1}t_iy_i\leq1020 i=1∑7tiyi≤1020
- ∑ 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=5∑7ti(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=1…9)进行 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=1…9)。
问题1
- 明确问题的要求:
- m i n ∑ i = 1 9 x i min \displaystyle \sum_{i=1}^{9}x_i mini=1∑9xi(保证课程的学习数量最少)
- 列出各限定方程:
- 首先保证满足数学两门,运筹学三门,计算机两门。
- ∑ i = 1 5 x i ≥ 2 \displaystyle\sum_{i=1}^{5}x_i\geq2 i=1∑5xi≥2
- 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+x9≥3
- x 4 + x 6 + x 7 + x 9 ≥ 2 x_4+x_6+x_7+x_9\geq2 x4+x6+x7+x9≥2
- 再保证先修课的要求。⭐️这里采取的方法是:如果 x a x_a xa是 x b x_b xb的先修课,则 x a ≥ x b x_a\geq x_b xa≥xb。
- x 3 ≤ x 1 x_3\leq x_1 x3≤x1
- x 3 ≤ x 2 x_3\leq x_2 x3≤x2
- x 4 ≤ x 7 x_4\leq x_7 x4≤x7
- x 5 ≤ x 1 x_5\leq x_1 x5≤x1
- x 5 ≤ x 2 x_5\leq x_2 x5≤x2
- x 6 ≤ x 7 x_6\leq x_7 x6≤x7
- x 8 ≤ x 5 x_8\leq x_5 x8≤x5
- x 9 ≤ x 1 x_9\leq x_1 x9≤x1
- x 9 ≤ x 2 x_9\leq x_2 x9≤x2
- 首先保证满足数学两门,运筹学三门,计算机两门。
- 下面给出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=1∑9scorei∗xi}。
- 增加的条件:
- ∑ i = 1 9 x i = 6 \displaystyle \sum_{i=1}^{9}x_i=6 i=1∑9xi=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=1…14,j=1…5)。(参加记为1,未参加记为0)。
- 参加全能的队员: y i ( i = 1 … 14 ) y_i(i=1\dots14) yi(i=1…14)。(这里保证参加过全能的队员不再出现在参加过单项的队员中,并且参加记为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=1…14,j=1…5)。
- 明确问题的要求
明显最好的参赛结果就是尽可能的得到一个较高的分数。
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=1∑14j=1∑5xij×scoreij+54i=1∑14yi(j=1∑5scoreij)} - 列出各限定方程
- 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=1∑5xij≥1(i=1…14)(保证每个人至少参加一项比赛)。
- ∑ i = 1 14 y i = 3 \displaystyle\sum_{i=1}^{14}y_i=3 i=1∑14yi=3(保证参加全能比赛的人数必须为3人)。
- ∑ j = 1 14 x i j ≤ 6 ( i = 1 … 5 ) \displaystyle \sum_{j=1}^{14}x_{ij}\leq6(i=1\dots5) j=1∑14xij≤6(i=1…5)(保证每一个单项比赛参加的人数都不超过6人)。
- ∑ i = 1 5 x i j ≤ 3 ( j = 1 … 14 ) \displaystyle \sum_{i=1}^{5}x_{ij}\leq3(j=1\dots14) i=1∑5xij≤3(j=1…14)(保证每个参加单项比赛的人最多参加3项)。