第一讲 从LINGO实例分析入手.docx

上传人:b****8 文档编号:10628654 上传时间:2023-02-22 格式:DOCX 页数:18 大小:61.08KB
下载 相关 举报
第一讲 从LINGO实例分析入手.docx_第1页
第1页 / 共18页
第一讲 从LINGO实例分析入手.docx_第2页
第2页 / 共18页
第一讲 从LINGO实例分析入手.docx_第3页
第3页 / 共18页
第一讲 从LINGO实例分析入手.docx_第4页
第4页 / 共18页
第一讲 从LINGO实例分析入手.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

第一讲 从LINGO实例分析入手.docx

《第一讲 从LINGO实例分析入手.docx》由会员分享,可在线阅读,更多相关《第一讲 从LINGO实例分析入手.docx(18页珍藏版)》请在冰豆网上搜索。

第一讲 从LINGO实例分析入手.docx

第一讲从LINGO实例分析入手

利用LINGO开发高级模型

第一讲从LINGO实例分析入手

一、实例分析:

运输模型

1.问题简述

假设WirelessWidget(WW)公司有6个仓库向8个销售商供应小装饰品,每个仓库的供应量是有限的,而每个销售商的需求又必须得到满足.因此,WW公司要决定每个仓库出多少货能满足每个销售商而运输成本又最低.

分析:

因为每个仓库都可以出货给每个销售商,所以共有48条运输路线,故而需要对每条路线定义一个变量来表示这条路线的运输量.

2.数据

销售商需求表:

存货数据表:

销售商号(V)

销售商需求量

1

35

2

37

3

22

4

32

5

41

6

32

7

43

8

38

仓库号(WH)

货物量

1

60

2

55

3

51

4

43

5

41

6

52

运输成本($)

V1

V2

V3

V4

V5

V6

V7

V8

WH1

6

2

6

7

4

2

5

9

WH2

4

9

5

3

8

5

8

2

WH3

5

2

1

9

7

4

3

3

WH4

7

6

7

3

9

2

7

1

WH5

2

3

9

5

7

2

6

5

WH6

5

5

2

2

8

1

4

3

3.目标函数

建立模型的笫一步是建立目标函数--WW公司的运输成本最低.如果用

VOLUME_I_J表示从I仓库到J销售商运送的商品数量,得到如下形式:

MIN=6*VOLUME_1_1+2*VOLUME_1_2+……

+4*VOLUME_6_7+3*VOLUME_6_8;

但是,现实生活中更多的情况是销售墒数以万计,用上形式就不可取了,所以,我们可用如下数学表达式:

与上式类似,LINGO的模型语言可以用下列简单而容易理解的表达式表示目标函数:

MIN=@SUM(LINKS(I,J):

COST(I,J)*VOLUME(I,J));

上式表示将所有路线(LINK)上的运输货物(VOLUME)成本(COST)的和最小化.

4.约束条件

在建立目标函数后,下一步是用表达式表示约束条件.在该模型中有两类约束条件:

笫一类用于表示需求约束,即满足每个销售商的供货需求;另一类为能力约束,表示保证每个仓库的货物运出量不会超过其供货能力.

需求约束为:

相应的LINGO模型语言如下:

@FOR(VENDORS(J):

@SUM(WAREHOUSES(I):

VOLUME(I,J))=DEMAND(J));

上面的LINGO表达式覆盖了8个需求约束,表示对所有销售商来说,各个仓库出货量之和等于销售商的需求量.

同样,能力约束为:

相应的LINGO模型语言如下:

@FOR(WAREHOUSES(I):

@SUM(VENDORS(J):

VOLUME(I,J))<=CAPACITY(I));

对于每个仓库而言,销售商的需求量之和一定小于等于该仓库的总存货量.

5.完整模型

MODEL:

MIN=@SUM(LINKS(I,J):

COST(I,J)*VOLUME(I,J));

@FOR(VENDORS(J):

@SUM(WAREHOUSES(I):

VOLUME(I,J))=DEMAND(J));

@FOR(WAREHOUSES(I):

@SUM(VENDORS(J):

VOLUME(I,J))<=CAPACITY(I));

END

但是,我们还需要在上述模型的集合部分和数据部分定义数据.

6.定义集合

在实践中建立模型时,会发现存在一个或多个包含相关对象的集合,例如工厂、消费者、运输车辆和雇员均为集合.通常,如果一个约束条件针对某个集合中的一员,则往往适用于集合中的其它成员.这一简单的概念就是LINGO模型语言的核心.LINGO允许在集合域中定义相关对象的集合.集合域以“SETS:

”开始,并且自占一行;以“ENDSETS”结束,同样也自占一行.定义集合成员后,就可以用LINGO的集合循环函数(例如:

@FOR,@SUM,@MIN,@MAX)对集合所有成员进行操作.

在该模型实例中,需要建立下面三个集合:

1)仓库;

2)销售商;

3)从仓库到销售商的运输路线.

定义上三个集合的模型集合域如下:

SETS:

WAREHOUSES/WH1WH2WH3WH4WH5WH6/:

CAPACITY;

VENDORS/V1V2V3V4V5V6V7V8/:

DEMAND;

LINKS(WAREHOUSES,VENDORS):

COST,VOLUME;

ENDSETS

笫二行语句说明WAREHOUSES集合有WH1WH2WH3WH4WH5WH6六个元素,每个元素有一个属性为CAPACITY.第三行是八个销售商的集合,每个元素有一个属性为DEMAND.

最合一个集合称为LINKS,代表48条运输路线.每条路线都有单位运价COST和运输量VOLUME两个属性.定义这个集合使用的语法不同于前面的两集合.LINKS集合是由WAREHOUSES和VENDORS两个集合派生出来的,其48个元素分别取自两个集合的元素组成的所有序对.如表:

LINKS集合示意元素

元素索引

运输路线

1

WH1→V1

2

WH1→V2

3

WH1→V3

……

……

47

WH6→V7

48

WH6→V8

7.输入数据

LINGO用到的数据可以放在模型的数据域中.在该实例中,数据域如下所示:

DATA:

CAPACITY=605551434152;

DEMAND=3537223241324338;

COST=62674259

49538582

52197433

76739271

23957265

55228143;

ENDDATA

与集合域一样,数据域以“DATA:

”开始,自占一行;以“ENDDATA”结束,也自占一行.WAREHOUSES集合的CAPACITY属性和VENDORS集合的DEMAND属性的赋值方式较为直接,而对二维集合LINKS的COST属性进行赋值相对比较复杂.当LINGO在数据域中对一个多维数列进行初始化时,首先对处于外层的集合按递增的原则进行索引.在此例中,首先对COST(WH1,V1)进行初始化,之后是COST(WH1,V2)至COST(WH1,V8),然后是COST(WH2,V1),依此类推.

此外,LINGO还可以从外部数据源引入数剧,例如文本文件、电子表格和数据库等.建立OLE与Excel连接可达到上述目的.

将集合域、目标函数、约束条件和数据域放在一起就形成了完整的模型,并且添加一些注解以增强模型的可读性.完整的模型为:

MODEL:

!

运输问题;

!

集合域;

SETS:

WAREHOUSES/WH1WH2WH3WH4WH5WH6/:

CAPACITY;

VENDORS/V1V2V3V4V5V6V7V8/:

DEMAND;

LINKS(WAREHOUSES,VENDORS):

COST,VOLUME;

ENDSETS

!

目标函数;

MIN=@SUM(LINKS(I,J):

COST(I,J)*VOLUME(I,J));

!

需求约束;

@FOR(VENDORS(J):

@SUM(WAREHOUSES(I):

VOLUME(I,J))=DEMAND(J));

!

能力约束;

@FOR(WAREHOUSES(I):

@SUM(VENDORS(J):

VOLUME(I,J))<=CAPACITY(I));

!

数据域;

DATA:

CAPACITY=605551434152;

DEMAND=3537223241324338;

COST=62674259

49538582

52197433

76739271

23957265

55228143;

ENDDATA

END

即:

MODEL:

!

运输问题;

!

集合域;

SETS:

WAREHOUSES/WH1WH2WH3WH4WH5WH6/:

CAPACITY;

VENDORS/V1V2V3V4V5V6V7V8/:

DEMAND;

LINKS(WAREHOUSES,VENDORS):

COST,VOLUME;

ENDSETS

!

目标函数;

MIN=@SUM(LINKS(I,J):

COST(I,J)*VOLUME(I,J));

!

需求约束;

@FOR(VENDORS(J):

@SUM(WAREHOUSES(I):

VOLUME(I,J))=DEMAND(J));

!

能力约束;

@FOR(WAREHOUSES(I):

@SUM(VENDORS(J):

VOLUME(I,J))<=CAPACITY(I));

!

数据域;

DATA:

CAPACITY=605551434152;

DEMAND=3537223241324338;

COST=62674259

49538582

52197433

76739271

23957265

55228143;

ENDDATA

END

8.求解模型

建立完模型后就可以求解,以找到每个仓库运输货物的最优方案.选择LINGO菜单中的Solve命令求解模型.

如果不需要LINGO输出完整的结果报告,选择LINGO菜单中Options命令下的Interface页中Terseoutput即可.这样LINGO在结果窗口中就只显示迭代次数和模型的目标值.

为了获得一个仅含有非零的VOLUME的报告,可以选择LINGO菜单中的Solution命令,就会出现如下对话框:

在AttributeorRowName字段中点击下拉按钮选择VOLUME,并选中NonzerosOnly复选框.这样,单击OK按钮后,得到如下的结果报告:

运行完整结果:

Globaloptimalsolutionfoundatiteration:

20

Objectivevalue:

664.0000

 

VariableValueReducedCost

CAPACITY(WH1)60.000000.000000

CAPACITY(WH2)55.000000.000000

CAPACITY(WH3)51.000000.000000

CAPACITY(WH4)43.000000.000000

CAPACITY(WH5)41.000000.000000

CAPACITY(WH6)52.000000.000000

DEMAND(V1)35.000000.000000

DEMAND(V2)37.000000.000000

DEMAND(V3)22.000000.000000

DEMAND(V4)32.000000.000000

DEMAND(V5)41.000000.000000

DEMAND(V6)32.000000.000000

DEMAND(V7)43.000000.000000

DEMAND(V8)38.000000.000000

COST(WH1,V1)6.0000000.000000

COST(WH1,V2)2.0000000.000000

COST(WH1,V3)6.0000000.000000

COST(WH1,V4)7.0000000.000000

COST(WH1,V5)4.0000000.000000

COST(WH1,V6)2.0000000.000000

COST(WH1,V7)5.0000000.000000

COST(WH1,V8)9.0000000.000000

COST(WH2,V1)4.0000000.000000

COST(WH2,V2)9.0000000.000000

COST(WH2,V3)5.0000000.000000

COST(WH2,V4)3.0000000.000000

COST(WH2,V5)8.0000000.000000

COST(WH2,V6)5.0000000.000000

COST(WH2,V7)8.0000000.000000

COST(WH2,V8)2.0000000.000000

COST(WH3,V1)5.0000000.000000

COST(WH3,V2)2.0000000.000000

COST(WH3,V3)1.0000000.000000

COST(WH3,V4)9.0000000.000000

COST(WH3,V5)7.0000000.000000

COST(WH3,V6)4.0000000.000000

COST(WH3,V7)3.0000000.000000

COST(WH3,V8)3.0000000.000000

COST(WH4,V1)7.0000000.000000

COST(WH4,V2)6.0000000.000000

COST(WH4,V3)7.0000000.000000

COST(WH4,V4)3.0000000.000000

COST(WH4,V5)9.0000000.000000

COST(WH4,V6)2.0000000.000000

COST(WH4,V7)7.0000000.000000

COST(WH4,V8)1.0000000.000000

COST(WH5,V1)2.0000000.000000

COST(WH5,V2)3.0000000.000000

COST(WH5,V3)9.0000000.000000

COST(WH5,V4)5.0000000.000000

COST(WH5,V5)7.0000000.000000

COST(WH5,V6)2.0000000.000000

COST(WH5,V7)6.0000000.000000

COST(WH5,V8)5.0000000.000000

COST(WH6,V1)5.0000000.000000

COST(WH6,V2)5.0000000.000000

COST(WH6,V3)2.0000000.000000

COST(WH6,V4)2.0000000.000000

COST(WH6,V5)8.0000000.000000

COST(WH6,V6)1.0000000.000000

COST(WH6,V7)4.0000000.000000

COST(WH6,V8)3.0000000.000000

VOLUME(WH1,V1)0.0000005.000000

VOLUME(WH1,V2)19.000000.000000

VOLUME(WH1,V3)0.0000005.000000

VOLUME(WH1,V4)0.0000007.000000

VOLUME(WH1,V5)41.000000.000000

VOLUME(WH1,V6)0.0000002.000000

VOLUME(WH1,V7)0.0000002.000000

VOLUME(WH1,V8)0.00000010.00000

VOLUME(WH2,V1)1.0000000.000000

VOLUME(WH2,V2)0.0000004.000000

VOLUME(WH2,V3)0.0000001.000000

VOLUME(WH2,V4)32.000000.000000

VOLUME(WH2,V5)0.0000001.000000

VOLUME(WH2,V6)0.0000002.000000

VOLUME(WH2,V7)0.0000002.000000

VOLUME(WH2,V8)0.0000000.000000

VOLUME(WH3,V1)0.0000004.000000

VOLUME(WH3,V2)11.000000.000000

VOLUME(WH3,V3)0.0000000.000000

VOLUME(WH3,V4)0.0000009.000000

VOLUME(WH3,V5)0.0000003.000000

VOLUME(WH3,V6)0.0000004.000000

VOLUME(WH3,V7)40.000000.000000

VOLUME(WH3,V8)0.0000004.000000

VOLUME(WH4,V1)0.0000004.000000

VOLUME(WH4,V2)0.0000002.000000

VOLUME(WH4,V3)0.0000004.000000

VOLUME(WH4,V4)0.0000001.000000

VOLUME(WH4,V5)0.0000003.000000

VOLUME(WH4,V6)5.0000000.000000

VOLUME(WH4,V7)0.0000002.000000

VOLUME(WH4,V8)38.000000.000000

VOLUME(WH5,V1)34.000000.000000

VOLUME(WH5,V2)7.0000000.000000

VOLUME(WH5,V3)0.0000007.000000

VOLUME(WH5,V4)0.0000004.000000

VOLUME(WH5,V5)0.0000002.000000

VOLUME(WH5,V6)0.0000001.000000

VOLUME(WH5,V7)0.0000002.000000

VOLUME(WH5,V8)0.0000005.000000

VOLUME(WH6,V1)0.0000003.000000

VOLUME(WH6,V2)0.0000002.000000

VOLUME(WH6,V3)22.000000.000000

VOLUME(WH6,V4)0.0000001.000000

VOLUME(WH6,V5)0.0000003.000000

VOLUME(WH6,V6)27.000000.000000

VOLUME(WH6,V7)3.0000000.000000

VOLUME(WH6,V8)0.0000003.000000

RowSlackorSurplusDualPrice

1664.0000-1.000000

20.000000-4.000000

30.000000-5.000000

40.000000-4.000000

50.000000-3.000000

60.000000-7.000000

70.000000-3.000000

80.000000-6.000000

90.000000-2.000000

100.0000003.000000

1122.000000.000000

120.0000003.000000

130.0000001.000000

140.0000002.000000

150.0000002.000000

9.总结

总而言之,LINGO有两种类型的集合,即基本集合和衍生集合.基本集合的元素代表模型中的基本对象,不能被分解,它可以用显式列表或隐式列表进行定义.当使用显式列表时,必须逐个地输入集合中的每个元素;使用隐式列表时,只要输入笫一个和最后一个集合元素就可以,LINGO会自动生成中间的元素.衍生集合则是由其他的成员集合构成,这些成员集合可看作是衍生集合的父集合,成员集合可以是衍生集合也可以是基本集合.衍生集合又可分为稠密集合和稀疏集合.稠密集合中含有父集合元素的全部组合(有时称为笛卡儿乘积或者父集合的交叉).稀疏集合是稠密集合的一个子集,可直接列出其元素或通过元素过滤器产生.元素过滤方法就是通过判断集合元素是否满足某个逻辑条件来清楚、简洁地列出稀疏集合的所有元素.

二、LINGO语言的其他特征

1.约束条件的命名

LINGO允许在模型中对约束条件进行命名.好处:

首先,使用了约束名的结果报告便于阅读;其次,LINGO的很多错误信息都通过名字指向约束.如果不对约束命名,要找出产生错误的源头将很困难.

LINGO并没有要求一定要对约束条件命名,如果不对其命名,LINGO将会用内部索引自动对约束命名.这样内部索引与定义约束条件的顺序不大相同,这就使得对结果报告和错误信息的理解变得比较困难.因此,最好在建立模型时对所有的约束进行命名.

命名约束条件十分简单,只要在一个约束开始处插入一个用方括号括起来的名字即可.值得注意的是,名字必须以字母A→Z开头,后面可以是任意字符,包括字母、数字(0→9)或下画线(--),长度不能超过32个字符.

举例说明:

命名模型的目标为OBJECTIVE:

[OBJECTIVE]MIN=X;

将运输模型的需求约束命名为DEMAND_ROW:

@FOR(LINKS(I,J):

[DEMAND_ROW]

@SUM(SOURCES(I):

SHIP(I,J))>=DEMAND(J));

为了进一步解释这些名称,这里特地更改了运输问题程序,增加了粗红体的约束名称,如下所示:

MODEL:

!

TITLE运输问题;

!

运输问题;

!

集合域;

SETS:

WAREHOUSES/WH1WH2WH3WH4WH5WH6/:

CAPACITY;

VENDORS/V1V2V3V4V5V6V7V8/:

DEMAND;

LINKS(WAREHO

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1