如何在lingo中使用集合

合集下载

LINGO软件的使用方法

LINGO软件的使用方法

2
2
答案
model: max=98*x1+277*x2-x1^2 -0.3*x1*x2-2*x2^2; x1+x2<100; x1<2*x2; @gin(x1); @gin(x2); end ※@gin()是调用的整数函数
第三节 在LINGO中使用集合
• 例题:某公司要决定下四个季度帆船生 产量。下四个季度需求量分别是40条, 60条,75条,25条。每季度生产能力40 条,生产费用400美元/条,如果加班生产 费用450美元/条,每季度库存费20美元/ 条。假定生产提前期为0,初始库存10条, 问如何安排生产总费用最小?
显式列举法 元素列表 隐式列举法
第四节 运算符及其优先级
• 算术运算符:+,-,*,/,^ • 逻辑运算符: #AND#,#OR#.#NOT#,#EQ#,#NE#,#GT#,# GE#,#LT#,#LE#,TRUE,FALSE • 关系运算符:<(即<=),=,>(即>=)
优先级
优先级 表: 最高 运算符 #NOT#,-(负号) ^ *,/ +,-(减号) #EQ#,#NE#,#GT#,#GE#, #LT#,#LE# #AND#,#OR# <,=,>
集合循环函数
• 用法:@function(setname:expression_list); • 具体如下:@for @sum @max @min
变量界定函数
• • • • @BND(L,X,U)-限制L<=X<=U @BIN(X)-限制X为0或1 @FREE(X)-取消对X的符号限制 @GIN(X)-限制X为整数
• • • • • • • • • 以model:开始,以end结束。 不区分大小写。 目标函数为max=。 语句以;结束。 数与变量之间的乘号不能省。 约束S.t.省略不写。 <与<=,>与>=是等价的。 非负约束可以不输入。 说明语句以!开头。

LINGO教程(精)

LINGO教程(精)

LINGO中的集集是一群相联系的对象,这些对象也称为集的成员。

一个集可能是一系列产品、卡车或雇员。

每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。

属性值可以预先给定,也可以是未知的,有待于LINGO求解。

例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。

LINGO有两种类型的集:原始集(primitive set)和派生集(derived set)。

一个原始集是由一些最基本的对象组成的。

一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。

1 模型的集部分集部分是LINGO模型的一个可选部分。

在LINGO 模型中使用集之前,必须在集部分事先定义。

集部分以关键字“sets:”开始,以“endsets”结束。

一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。

一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。

2 定义原始集为了定义一个原始集,必须详细声明:·集的名字·可选,集的成员·可选,集成员的属性定义一个原始集,用下面的语法:setname[/member_list/][:attribute_list];注意:用“[]”表示该部分内容可选。

下同,不再赘述。

Setname是你选择的来标记集的名字,最好具有较强的可读性。

集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉伯数字(0,1,…,9)组成的总长度不超过32个字符的字符串,且不区分大小写。

注意:该命名规则同样适用于集成员名和属性名等的命名。

Member_list是集成员列表。

如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。

如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。

LINGO使用说明(比较简单)

LINGO使用说明(比较简单)

Lingo介绍Lingo是美国LINDO系统公司(Lindo Symtem Inc)开发的求解数学规划系列软件中的一个(其他软件为LINGDO,GINO,What’s Best 等),它的主要功能是求解大型线性、非线性和整数规划问题,目前的版本是lingo11.0。

lingo分为Demo、solve suite、hyper、industrial、extended等六类不同版本,只有Demo版本是免费的,其他版本需要向LINDO系统公司(在中国的代理商)购买,Lingo的不同版本对模型的变量总数、非线性变量个数、整型变量个数和约束条件的数量做出不同的限制(其中extended版本无限制)。

Lingo的主要功能特色为:(1)既能求解线性规划,也有较强的求解非线性规划的能力;(2)输入模型简练直观;(3)运行速度快、计算能力强;(4)内置建模语言,提供几十种内部函数,从而能以较少语句,较直观的方式描述较大规模的优化模型;(5)将集合的概念引入编程语言,很容易将实际问题转换为Lingo 语言;(6)能方便地与excel、数据库等其他软件交换数据。

学校图书馆40本《lingo和excel在数学建模中的应用》,袁新生、邵大宏、郁时炼主编,科学出版社Lingo 程序设计简要说明在数学建模中会遇到如规划类的题型,在这种模型中总存在着一个目标,并希望这个目标的取值尽可能的大或小,同时与这个目标有关的一系列变量之间存在一些约束。

在构造出目标函数和约束条件的表达式后,我们需要对求出这个最值和各变量的取值。

一般我们用LINGO 来对模型进行求解,本文将通过举一个简单的例子,围绕这个例子逐步学习LINGO 的使用。

LINGO 只是一个求解工具,我们主要的任务还是模型的建立!当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。

LINGO使用教程

LINGO使用教程
!学生集:性别属性 sex,1 表示男性,0 表示女性;年龄属性 age. ; students/John,Jill,Rose,Mike/:sex,age; !男学生和女学生的联系集:友好程度属性 friend,[0,1]之间的数。 ; linkmf(students,students)|sex(&1) #eq# 1 #and# sex(&2) #eq# 0: friend; !男学生和女学生的友好程度大于 0.5 的集; linkmf2(linkmf) | friend(&1,&2) #ge# 0.5 : x; endsets data: sex,age = 1 16
§6 LINGO的命令行命令
§7 综合举例
作者 胡志兴
LINGO 教程
LINGO 是用来求解线性和非线性优化问题的简易工具。LINGO 内置了一种建立最优化模 型的语言,可以简便地表达大规模问题,利用 LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门
当你在 windows 下开始运行 LINGO 系统时,会得到类似下面的一个窗口:
·集的名字 ·父集的名字 ·可选,集成员 ·可选,集成员的属性 可用下面的语法定义一个派生集:
setname(parent_set_list)[/member_list/][:attribute_list]; setname 是集的名字。parent_set_list 是已定义的集的列表,多个时必须用逗号隔开。如 果没有指定成员列表,那么 LINGO 会自动创建父集成员的所有组合作为派生集的成员。派 生集的父集既可以是原始集,也可以是其它的派生集。
data: students,sex,age= John 1 16 Jill 0 14 Rose 0 17 Mike 1 13;

Lingo的基本用法

Lingo的基本用法

LINGO的基本用法一.集合的基本用法集合(set)及其属性(attribute)的概念基本集合与派生集合集合名[/元素列表/][:属性列表];集合名(父集合列表)[/元素列表/][:属性列表];稠密集合与稀疏集合元素过滤法基本集合的隐式列举法:数字型 1..n字符数字型Car101..Car208日期型MON..FRI月份型OCT..JAN年月型OCT2007..JAN2008二.模型结构(1)集合段从“sets:”到“endsets”(2)数据输入段从“data:”到“enddata”属性=常数列表(3)目标和约束段MIN=表达式(4)计算段从“calc:”到“endcalc”,对原始数据的计算处理(5)初始段从“init:”到“endinit”,定义迭代初值用属性=常数列表(6)注释从感叹号到分号三.函数基本数学函数@ABS(X) @COS(X) @EXP(X) @FLOOR(X)@LGM(X) @LOG(X) @MOD(X,Y) @POW(X,Y)@SIGN(X) @SIN(X) @SMAX(list) @SMIN(list)@SQR(X) @SQRT(X) @TAN(X)其中@LGM(X) =ln(X-1)!集合循环函数@FOR @MIX @MIN @PROD@SUM用法:集合函数名(集合名(集合索引列表)|条件:表达式组)集合操作函数@IN @IN(集合名,集合元素名,…集合元素名)@INDEX @INDEX(集合名,集合元素名)@WRAP @WRAP(i,N),循环计数@SIZE @SIZE(集合名)变量定界函数@BND(L,X,U) @BIN(X) @FREE(X) @GIN(X) 分别对变量取值限制:上下界,0-1值,取消非负限制,整数概率分布函数@PNS(X) 标准正态分布@PSL(X) 正态线性损失@PBN(P,N,X) 二项分布@PHG 超几何分布@PTD(N,X) t分布@PFD(N,D,X) F分布@PPS(A,X) 泊松分布@PPL(A,X) 泊松线性损失@PCX(N,X) X平方分布@RAND(seed) 随机数服务系统函数@PEL(A,X) @PFS(A,X,C) @PEB(A,X)文件输入输出函数@FILE(fn) @TEXT(…fn‟) @OLE结果报告函数@ITERS() 返回迭代次数@NEWLINE(n) 输出n个新行@STRLEN(string) 返回字符串的长度@NAME(reference) 返回变量名或行名@WRITE 用于数据段,输出变量,字符串或换行@WRITEFOR 是@WRITE在循环情况下的推广@FORMAT 以格式描述符方式输出数值@DUAL(varname) 返回解答中变量的判别数或结束行的影子价格@STATUS() 返回求解后的最后状态其他函数@IF @IF(条件,true结果,false结果)@WARN @WARN(‘text’,条件)@USER @USER(用户编写的函数dll或obj文件)四.文件传输通过文本文件传输数据@FILE和@TEXT通过Excel文件传输数据@OLE例题! 背包问题 Knapsack Problem! max z=sum(i=1~n)ci xi! st. sum ai xi <=b, xi=0/1;model:title背包问题;sets:wp/w1..w8/:a,c,x;endsetsdata:a=1 3 4 3 3 1 5 10; c=2 9 3 8 10 6 4 10; enddatamax=@sum(wp:c*x);@for(wp:@bin(x));@sum(wp:a*x)<=15;end!装箱问题!=======;model:title装箱问题;sets:wp/w1..w30/:w; xz/v1..v30/:y; links(wp,xz):x; endsetsdata:w=0.51,0.51,0.51,0.51,0.51,0.51,0.27,0.27,0.27,0.27,0.27,0.27,0.26,0.26,0.26,0.26,0.26,0.26,0.23,0.23,0.23,0.23,0.23,0.23,0.23,0.23,0.23,0.23,0.23,0.23;enddatamin=@sum(xz(i):y(i));C=1;@for(links:@bin(x));@for(xz:@bin(y));@for(wp(i):@sum(xz(j):x(i,j))=1);@for(xz(j):@sum(wp(i):w(i)*x(i,j))<=C*y(j)); end@for(o(j):cun(2,j)= cun(1,j)+x(2,j)-he(2,j) ;z2= @sum(o(j): cun(2,j));@for(o(j):cun(3,j)= cun(2,j)+x(3,j)-he(3,j) ;z3= @sum(o(j): cun(3,j));@for(o(j):cun(4,j)= cun(3,j)+x(4,j)-he(4,j) ;z4= @sum(o(j): cun(4,j));@for(o(j):cun(5,j)= cun(4,j)+x(5,j)-he(5,j) ;z5= @sum(o(j): cun(5,j));@for(o(j):cun(6,j)= cun(5,j)+x(6,j)-he(6,j) ;z6= @sum(o(j): cun(6,j));食品加工一项食品加工业,对几种粗油精炼,然后加以混合成为成品食用油。

LINGO软件的集合功能

LINGO软件的集合功能

二、集合循环函数
集合循环函数遍历整个集合进行操作。 其语法为: @function(setname[(set_index_list)[|c onditional_qualifier]]:expression_list); @function相应于下面罗列的五个集合循环 函数之一: @for, @sum, @prod, @min, @max
10
原始集合定义方法
隐式成员列表格式 示例
1..n 1..5
所产生集合成员
1, 2, 3, 4, 5
StringM..StringN
DayM..DayN MonthM..MonthN
Car2..Car14
Mon..Fri Oct..Jan
Car2, Car3, Car4, …, Car14
Mon, Tue, Wed, Thu, Fri Oct, Nov, Dec, Jan
MonthYearM..Month Oct2001..Jan YearN 2002
Oct2001, Nov2001, Dec2001, Jan2002
11
原始集合定义方法
3. 集合成员不放在集合定义中,而在随后的数 据部分来定义。例如:
12
原始集合定义方法
注意: 开头用感叹号(!),末尾用分号(;)表示 注释,可跨多行。 在集合部分只定义了一个集合students, 并未指定成员。在数据部分罗列了集合成员 John、Jill、Rose和Mike,并对属性sex和 age分别给出了值。 集合成员无论用何种字符标记,它的索引 都是从1开始连续计数。在attribute_ list可以 指定一个或多个集合成员的属性,属性之间必须 用逗号隔开。 13
派生集合定义方法

LINGO教程

LINGO教程
INV ( I ) INV ( I 1) RP( I ) OP( I ) DEM ( I ), I 1,2,3,4
INV (0) 10
MIN
I 1, 2, 3, 4
{400 RP(I ) 450OP(I ) 20 INV (I )}
加上变量的非负约束
26
LINGO 教 程
用DEM,RP,OP,INV分别表示需求量、正常生产的产量、 加班生产的产量、库存量,则DEM,RP,OP,INV对每个 季度都应该有一个对应的值,也就说他们都应该是一 个由4个元素组成的数组,其中DEM是已知的,而 25RP,OP,INV是未知数。
LINGO 教 程
问题的模型(可以看出是LP模型 ) 目标函数是所有费用的和 约束条件主要有两个: 1)能力限制: RP ( I ) 40, I 1,2,3,4 2)产品数量的平衡方程:
23
LINGO 教 程
1. LINGO入门 2.在LINGO中使用集合
3. 运算符和函数
2.在LINGO中使用集合 4. LINGO的主要菜单命令 5. LINGO命令窗口 6.习题
24
LINGO 教 程
集合的基本用法和LINGO模型的基本要素
例 SAILCO公司需要决定下四个季度的帆船生产量。下 理解LINGO建模语言最重要的是理解集合(Set)及其 四个季度的帆船需求量分别是40条,60条,75条,25条, 属性(Attribute)的概念。 这些需求必须按时满足。每个季度正常的生产能力是40 条帆船,每条船的生产费用为400美元。如果加班生产, 每条船的生产费用为450美元。每个季度末,每条船的 库存费用为20美元。假定生产提前期为0,初始库存为 10条船。如何安排生产可使总费用最小?

lingo入门教程 --- 集合运用

lingo入门教程 --- 集合运用

lingo入门教程之二--- 集合运用lingo中的集合用法很多,这里主要通过几个例题来进行讲解对于每一个问题,都要先找到对应的目标函数,然后对相应值进行初始化,然后找到约束条件等进行求解例1:SAILCO公司需要决定下四个季度的帆船生产量。

下四个季度的帆船需求量分别是40条,60条,75条,25条,这些需求必须按时满足。

每个季度正常的生产能力是40条帆船,每条船的生产费用为400美元。

如果加班生产,每条船的生产费用为450美元。

每个季度末,每条船的库存费用为20美元。

假定生产提前期为0,初始库存为10条船。

如何安排生产可使总费用最小?分析:用DEM,RP,OP,INV分别表示需求量、正常生产的产量、加班生产的产量、库存量,则DEM,RP,OP,INV对每个季度都应该有一个对应的值,也就说他们都应该是一个由4个元素组成的数组,其中DEM是已知的,而RP,OP,INV是未知数接下里这里例子会讲到关于集合的派生问题,这个跟c++里面的继承与派生比较相像例2:建筑工地的位置(用平面坐标a,b表示,距离单位:公里)及水泥日用量d(吨)下表给出。

有两个临时料场位于P (5,1), Q (2, 7),日储量各有20吨。

从A, B两料场分别向各工地运送多少吨水泥,使总的吨公里数最小。

两个新的料场应建在何处,节省的吨公里数有多大?例3:(最短路问题) 在纵横交错的公路网中,货车司机希望找到一条从一个城市到另一个城市的最短路.下图表示的是公路网,节点表示货车可以停靠的城市,弧上的权表示两个城市之间的距离(百公里).那么,货车从城市S出发到达城市T,如何选择行驶路线,使所经过的路程最短?分析:假设从S到T的最优行驶路线P 经过城市C1, 则P中从S到C1的子路也一定是从S到C1的最优行驶路线;假设P 经过城市C2, 则P中从S到C2的子路也一定是从S到C2的最优行驶路线.因此, 为得到从S到T的最优行驶路线, 只需要先求出从S到Ck(k=1,2)的最优行驶路线,就可以方便地得到从S到T的最优行驶路线. 同样,为了求出从S到Ck(k=1,2)的最优行驶路线, 只需要先求出从S到Bj(j=1,2)的最优行驶路线;为了求出从S到Bj(j=1,2)的最优行驶路线, 只需要先求出从S到Ai(i=1,2,3)的最优行驶路线. 而S到Ai(i=1,2,3)的最优行驶路线是很容易得到的(实际上, 此例中S到Ai(i=1,2,3)只有唯一的道路) .此例中可把从S到T的行驶过程分成4个阶段,即S→Ai(i=1,2或3),Ai→Bj(j=1或2),Bj→Ck(k=1或2),Ck→T. 记d(Y,X)为城市Y与城市X之间的直接距离(若这两个城市之间没有道路直接相连,则可以认为直接距离为∞),用L(X)表示城市S到城市X的最优行驶路线的路长:。

  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;
参考答案
model : sets :
V/1..7/:b;!创建集合V,而b 是与V 同结构的;
A(V,V):d,x ;!创建集合A 是V 乘V.而d,x 是与A 同结构的,即d ,x 分别是10*10矩阵; endsets
max=@sum(A(i ,j):d(i ,j )*x (i,j));!创建目标函数; @for(V (i):
@sum(V (j):x(i,j))<b(i);); !第一个约束条件; data:
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; !输入d的数值;
enddata
end
例题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结束,作用在于对一些原始数据进行计算处理。

为什么要设计这个段呢?因为在实际问题中,可能出现输入的原始数据不能再模型中直接使用,需要进行“预处理”。

练习2.用lingo求解下列问题
练习3.利用lingo的集合编写程序求解下列问题
练习4,利用lingo求解下列问题。

相关文档
最新文档