如何在lingo中使用集合1

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例题1. 在lingo 中输入下列线性规划模型,并求解

∑∈⋅=A j i j i x j i d z ),(),(),( min

s.t. 1),1(≥∑∈V

j j x ,

,

},10,,2,1{,0),(x ,),(,

1,1),(V V A V V

i i i j i x j j i x V

i ⨯==∈=>=∑∈ 为非负实数

所有

的数值如下表:d d=0 8 5 9 12 14 12 16 17 22

8 0 9 15 16 8 11 18 14 22

5 9 0 7 9 11 7 12 12 17

9 15 7 0 3 17 10 7 15 15

12 16 9 3 0 8 10 6 15 15

14 8 11 17 8 0 9 14 8 16

12 11 7 10 10 9 0 8 6 11

16 18 12 7 6 14 8 0 11 11

17 14 12 15 15 8 6 11 0 10

22 22 17 15 15 16 11 11 10 0;

分析:这个模型输入的难点,在于变量的数量太多,足足有100个。约束条件也比较多,有没有什么方便的输入方法?下面介绍lingo 中集合的建立

新建lingo 文件

输入下面内容

model :

sets :

V/1..10/;!创建集合V;

A(V,V):d,x;!创建集合A 是V 乘V.而d,x 是与A 同结构的,即d ,x 分别是10*10矩阵; endsets

min =@sum (A(i,j):d(i,j)*x(i,j));!创建目标函数;

@sum (V(j):x(1,j))>=1; !第一个约束条件;

@for (V(j)|j#gt#1:

!i#gt#1为逻辑判断语句表示i>1是返回真值,但这里不能直接写i>1,因为">"是关系运算符不是逻辑运算符;

@sum (V(i):x(i,j))=1;); !利用循环函数表达:当i>1(即i 从2到10)时,

{x(i,j):j=1..10}的和等于1;

@for(V(i):x(i,i)=0;);

data:

d=0 8 5 9 12 14 12 16 17 22

8 0 9 15 16 8 11 18 14 22

5 9 0 7 9 11 7 12 12 17

9 15 7 0 3 17 10 7 15 15

12 16 9 3 0 8 10 6 15 15

14 8 11 17 8 0 9 14 8 16

12 11 7 10 10 9 0 8 6 11

16 18 12 7 6 14 8 0 11 11

17 14 12 15 15 8 6 11 0 10

22 22 17 15 15 16 11 11 10 0; !输入d的数值; enddata

end

这个模型如果按照常规输入是什么样子呢?

Lingo也提供这样的功能

点lingo菜单

选generate点display model

得到下面的界面(部分截图)

运行结果(部分截图)

这个报告很不简洁,因为我们只需要显示x中非零部分,其他信息都不是我们关心的。有什么办法可以使得报告更简洁?

点lingo菜单,选solution,做如下设置,可以使得报告更加简洁

设置完后结果是

练习1. 求下列线性规划模型

∑∈=A

j i j i x j i d z ),(),(*),( max

s.t. V i i b j i x V

j ∈<∑∈),(),(

),(j i x 为非负实数,(i,j)∈A

这里V={1,2,3,…,7},V V A ⨯=.

b=49 38 49 44 58 50 47;

d=1 2 3 1 2 1 2

2 3 4 1 2 2 3

4 1 1 2 1

5 1

1 2 2 2 3 1 1

2 1 2

3 5 3 1

2 2 2 1

3 2 4

1 1 1 1

2 1 1;

参考答案

例题2.一家公司需要决定四个季度的帆船生产量,下四个季度的需求分别为40,60,75,25条,需要按时满足,每个季度生产能力是40条,每条生产费用400美元。如果加班,每条船的生产费为450美元。每个季度末,每条船的库存费用为20美元。假定生产提前期为0,库存为10条,如何安排生产使得总费用最小?

创建lingo文件,输入

运行结果

注1:如果创建一个集合包含的元素较多,例如月份,只需

Sets:

Month/1..12/

endsets

而不需要把1到12都罗列出来.

注2:上面的程序由三部分组成(集合段,目标和约束段,数据段),但一般lingo程序可以由五部分组成(新增“初值设定“和”计算”两部分)

(1)集合段sets开始,endsets结束

(2)目标函数(min=或max=)和约束段(一些等式或不等式,或逻辑判断语句)(3)数据段data开始,enddata结束

(4)初始段,用于初值设定,init开始,endinit结束,对集合对属性(数组)定义初值(因为求解算法一般是迭代算法,用户如果能给出一个比较好的迭代初值,对提高算法的效果是有益处的)

(5)计算段,以calc开始,endcalc结束,作用在于对一些原始数据进行计算处理。为什么要设计这个段呢?因为在实际问题中,可能出现输入的原始数据不能再模型中直

接使用,需要进行“预处理”。

相关文档
最新文档