Lingo_1. 0/1规划

这篇博客介绍了如何使用LINGO软件解决一个0/1规划问题,具体是一个8名同学匹配成4个调查队以最大化效率的案例。通过解析问题,设置目标函数和约束条件,利用LINGO求解得到全局最优值为30,并展示了如何查看最优解的详细信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 0/1规划

LINGO 提供了另一种定义稀疏集合的方法,这就是“元素过滤”法, 能够从构成派生集合的父集合的笛卡儿积中系统地过滤下来一些真正的元素。

问题:

某班 8 名同学准备分成 4 个调查队(每队两人)前往 4 个地区进行社会调查。假设这 8 名同学两两之间组队的效率如表 4-3 所示(由于对称性,只列出了上三角部分),问如何组队 可以使总效率最高?
这里写图片描述
这是一个典型的匹配(MATCHING)问题。把上面的效率矩阵记为 BENEFIT,用 MATCH (Si,Sj)=1 表示同学 Si,Sj 组成一队,而 0 表示不组队。由于对称性,只需考虑 i 小于j 共 32 个 0-1 变量。
显然,目标函数为 BENEFIT(Si,Sj)* MATCH(Si,Sj)之和;约束条件是每 个同学只能(而且必须在)某一组,即对于任意 i 有:只要 MATCH 属性的某个下标为 i 就加 起来,此和=1。显然,这是一个 0-1 线性规划。

1.1解析:

model:
    sets:
        students/s1..s8/;
        parts(students, students)| &2 #gt# &1:
            benefit, match;
    endsets

    data:
        benefit = 
            9 3 4 2 1 5 6
              1 7 3 5 2 1
                4 4 2 9 2
                1 5 5 6
                  8 7 6
                    2 3
                        4;
    enddata

[objective] max = @sum(parts(i, j): benefit(i ,j) * match(i, j));
@for(students(i):[constraints]
    @sum(parts(j,k) | j #eq# i #or# k #eq# i: match(j,k))=1);
    @for(parts(i,j): @bin(match(i,j)));
end

其中 STUDENTS 集合的元素列表“S1..S8”等价于写成“S1 S2 S3 S4 S5 S6 S7 S8”, 它没有相关的属性列表,主要用于表示下标集合。我们看到在派生集合 PAIRS 的定义中,增加了过滤条件,即逻辑关系式“&2#GT#&1”,意思是第 2 个父集合的元素的索 引值(用“&2”表示)大于第 1 个父集合的元素的索引值(用“&1”表示)。

1.2结果:

选择菜单命令“LINGO|SOLVE”运行这个程序,可以得到全局最优值=30。

 Global optimal solution found.
  Objective value:                              32.00000
  Objective bound:                              32.00000
  Infeasibilities:                              0.000000
  Extended solver steps:                               0
  Total solver iterations:                             0

  Model Class:                                      PILP

  Total variables:                     28
  Nonlinear variables:                  0
  Integer variables:                   28

  Total constraints:                    9
  Nonlinear constraints:                0

  Total nonzeros:                      84
  Nonlinear nonzeros:                   0

                                Variable           Value        Reduced Cost
                        BENEFIT( S1, S2)        9.000000            0.000000
                        BENEFIT( S1, S3)     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值