第五天:整数规划(integer programming)

目录

·整数规划的简单介绍

·整数规划的Lingo求解

1.Lingo的简单使用

2.求解0-1整数规划问题

 ·指派问题的标准形式及其数学模型


·整数规划的简单介绍

根据决策变量是否完全为整数将整数规划划分为纯整数规划和混合整数规划,根据整数规划中的决策变量是否完全为0-1时可以将整数规划再次划分为纯0-1整数规划,混合0-1整数规划。

·整数规划的Lingo求解

在求解整数规划方面,Lingo更胜一筹,因此在这里采用了Lingo求解

Lingo只需在最后对决策变量使用@GIN函数就能对解进行整数限制,使用@BIN函数就能对解进行0-1限制。

1.Lingo的简单使用

例:

min(x_1+2*x_2+3*x_3)

-2*x_1+x_2+x_3<=9

-3*x_1+x_2+2*x_3>=4

4*x_1-2*x_2-3*x_3=-6

x_1<=0

x_2>=0

Lingo求解:

sets:
n/1..2/:x;
endsets
max = 3*x(1)-x(2);
3*x(1)-2*x(2)<=3;
5*x(1)+4*x(2)>=10;
2*x(1)+x(2)<=5;
@for(n:@gin(x));
end

代码分析:

Lingo程序大致由三部分sets,data,min/max组成

其中sets是设置变量的个数,如例1:n/1..2/:x;   表示设置一个n类型向量,其中向量名词为x,向量中元素个数为2。

data为数据集,对设置的变量进行赋值,当语句较多的时候使用。

min/max为目标函数段,其包括目标函数及其约束条件。

其中for循环意义不变多讲,gin函数是将决策变量约束为整数,bin函数将决策变量约束为0-1

运行结果:

 运行结果分析:

得到x_1=1,x_2=2,max=1

2.求解0-1整数规划问题

minf(x)=-9x_1-5x_2-6x_3-4x_4

6x_1+3x_2+5x_3+2x_4<=9

x_3+x_4<=1

-x_1+x_3<=0

-x_2+x_4<=0

x_i=0,1(i=1,2,3,4)

Lingo代码

sets:
n1/1..4/:x,c,b;
n2(n1,n1):A;
endsets

data:
c = -9,-5,-6,-4;
b = 9,1,0,0;
A = 6,3,5,2
    0,0,1,1
    -1,0,1,0
    0,-1,0,1;
enddata

min=@sum(n1:c*x);
@for(n1(i):@for(n1(j):A(i,j)*x(j)<=b(i)));
@for(n1:@bin(x));

代码运行结果:

 ·指派问题的标准形式及其数学模型

        假如现在有若干项工作需要分给若干对象来完成,要求在满足特定的指派要求条件下,使指派方案的总体效果最佳。

        指派问题的标准形式为:有n个指派对象及n件事,已知第i个指派对象做第j事的成本为c_{ij}(i,j=1,2..n),要求确定指派对象和事之间的一一对应的指派方案,使这n件事的成本最低。

        一般称c_{ij}为指派问题的系数矩阵。

        为了建立标准指派问题的数学模型,引入n^2个0-1变量:

当不指派第i个指派对象做第j件事时:x_{ij}=0

当指派第i个指派对象做第j件事时:x_{ij}=1

这样,指派问题的数学模型可以写作

min=\sum_{i=1}^n\sum_{j=1}^nc_{ij}x_{ij}

 \sum_{i=1}^nx_{ij}=1(j=1,2...n)

\sum_{j=1}^nx_{ij}=1(i=1,2...n)

x_{ij}=0x_{ij}=1(i,j=1,2...n)

模型中,约束条件表示每件事只能由一个指派对象去做且指派对象必须只做一件事。

例:某公司计划开办5家新商店,决定由5家建筑公司去承建。已知建筑公司A_i(i=1,2...5)对商店B_j(j=1,2...5)的报价(万元)为c_{ij}(i,j=1,2...5),如下表。如仅仅考虑节省费用,商业公司应当如何对5家建筑公司怎样进行分配建筑任务,使得总建造费用最小?

B_1B_2B_3B_4B_5
A_14871512
A_279171410
A_3691287
A_4A_46714610
A_56912106

 设0-1变量x_{ij},当A_i(i=1,2...5)对商店B_j(j=1,2...5)承建时,x_{ij}=1;否则x_{ij}=0

Lingo求解

sets:
n1/1..5/:a;
n2(n1,n1):x,c;
endsets

data:
c = 4,8,7,15,12
    7,9,17,14,10
    6,9,12,8,7
    6,7,14,6,10
    6,9,12,10,6;
enddata

min=@sum(n2:c*x);
@for(n1(j):@sum(n1(i):x(i,j))=1);
@for(n1(j):@sum(n1(i):x(j,i))=1);
@for(n2:@bin(x));

运行结果:

 

min=34

参考书籍:

 胡运权,郭耀煌.运筹学教程[M].北京:清华大学出版社,2018:122-140

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值