lingo课设.docx
- 文档编号:23608362
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:21
- 大小:40.84KB
lingo课设.docx
《lingo课设.docx》由会员分享,可在线阅读,更多相关《lingo课设.docx(21页珍藏版)》请在冰豆网上搜索。
lingo课设
Lingo中集合的介绍
函数的介绍
钢管运输问题要点:
集合的抽象描述,动态规划问题,铁路网与公路网分开考虑。
LINGO在数学建模中的应用
一、LINGO的简介
LINGO是LinearINteractiveandGeneralOptimizer的缩写,即“交互式的线性和通用优化求解器”,可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等。
其特色在于可以允许决策变量是整数(即整数规划,包括0-1整数规划),方便灵活,而且执行速度非常快。
Lingo实际上还是最优化问题的一种建模语言,包括许多常用的函数可供使用者建立优化模型时调用,并提供与其他数据文件(如文本文件、Excel电子表格文件、数据库文件等)的接口,易于方便地输入、求解和分析大规模最优化问题。
它的线性、非线性和整数规划求解程序已经被全世界数千万的公司用来做最大化利润和最小化成本的分析。
应用的范围包含生产线规划、运输、财务金融、投资分配、资本预算、混合排程、库存管理、资源配置等等
二、Lingo的优点
1、简单的模型表示
Lingo可以将线性、非线性和整数问题迅速得予以公式表示,并且容易阅读、了解和修改。
2、方便的数据输入和输出选择
Lingo建立的模型可以直接从数据库或工作表获取资料。
同样地,Lingo可以将求解结果直接输出到数据库或工作表。
3、强大的求解引擎
Lingo内建的求解引擎有线性、非线性(convexandnonconvex)、二次、二次限制和整数最佳化。
4、模型交互地或创建工程应用
Lingo提供完全互动的环境供您建立、求解和分析模型。
Lingo也提供DLL和OLE界面可供使用者由撰写的程序中呼叫。
5、广泛的文件和HELP功能
Lingo提供的所有工具和文件可使你迅速入门和上手。
Lingo使用者手册有详细的功能定义
三、lingo功能介绍
一、LINGO的类型函数:
1、数学函数:
三角函数和常规的数学函数
2、金融函数:
LINGO提供的两种金融函数
3、概率函数:
LINGO提供了大量概率相关的函数
4、变量界定函数:
这类函数用来定义变量的取值范围
5、集操作函数:
这类函数为对集的操作提供帮助
6、集循环函数:
遍历集的元素,执行一定的操作的函数
7、数据输入输出函数:
这类函数允许模型和外部数据源相联系,进行数据的输入输出
8、辅助函数:
各种杂类函数
二、Lingo的运算符介绍:
基本运算符:
包括算术运算符、逻辑运算符和关系运算符
1、算术运算符
算术运算符是针对数值进行操作的。
LINGO提供了5种二元运算符:
^ 乘方
﹡ 乘
/ 除
﹢ 加
﹣ 减
LINGO唯一的一元算术运算符是取反函数“﹣”。
这些运算符的优先级由高到底为:
高 ﹣(取反)
^
﹡/
低 ﹢﹣
运算符的运算次序为从左到右按优先级高低来执行。
运算的次序可以用圆括号“()”来改变。
2、逻辑运算符
在LINGO中,逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集成员被包含,哪些被排斥。
在创建稀疏集时用在成员资格过滤器中。
LINGO具有9种逻辑运算符:
#not# 否定该操作数的逻辑值,#not#是一个一元运算符
#eq# 若两个运算数相等,则为true;否则为flase
#ne#若两个运算符不相等,则为true;否则为flase
#gt#若左边的运算符严格大于右边的运算符,则为true;否则为flase
#ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase
#lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase
#le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase
#and# 仅当两个参数都为true时,结果为true;否则为flase
#or#仅当两个参数都为false时,结果为false;否则为true
这些运算符的优先级由高到低为:
高#not#
#eq##ne##gt##ge##lt##le#
低#and##or#
3、关系运算符
LINGO有三种关系运算符:
=、<=、>=
LINGO中还能用“<”表示小于等于关系,“>”表示大于等于关系。
LINGO并不支持严格小于和严格大于关系运算符。
运算符的优先级相同。
三、lingo的函数介绍
3.1、标准数学函数:
@abs(x)返回x的绝对值
@sin(x)返回x的正弦值,x采用弧度制
@cos(x)返回x的余弦值
@tan(x)返回x的正切值
@exp(x)返回常数e的x次方
@log(x)返回x的自然对数
@lgm(x)返回x的gamma函数的自然对数
@sign(x)如果x<0返回-1;否则,返回1
@floor(x)返回x的整数部分。
当x>=0时,返回不超过x的最大整数;当x<0时,返回不低于x的最大整数。
@smax(x1,x2,…,xn)返回x1,x2,…,xn中的最大值
@smin(x1,x2,…,xn)返回x1,x2,…,xn中的最小值
3.2、集合循环函数:
1、@FOR(集合元素的循环函数):
对集合setname的每个元素独立地生成表达式,表达式由expression_list描述(通常是优化问题的约束)。
2、@MAX(集合属性的最大值函数):
返回集合setname上的表达式的最大值。
3、@MIN(集合属性的最小值函数):
返回集合setname上的表达式的最小值。
4、@PROD(集合属性的乘积函数):
返回集合setname上的表达式的积。
5、@SUM(集合属性的求和函数):
返回集合setname上的表达式的和。
集合上的元素(下标)进行循环操作的函数,一般用法如下:
@function(setname[(set_index_list)[|condition]]:
expression_list);
其中:
function集合函数名,FOR、MAX、MIN、PROD、SUM之一;
Setname集合名;
set_index_list集合索引列表(不需使用索引时可以省略);
Condition用逻辑表达式描述的过滤条件(通常含有索引,无条件时可以省略);
expression_list一个表达式(对@FOR函数,可以是一组表达式。
3.3、变量定界函数:
@bin(x)限制x为0或1
@bnd(L,x,U)限制L≤x≤U
@free(x)取消对变量x的默认下界为0的限制,即x可以取任意实数
@gin(x)限制x为整数
在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。
@free取消了默认的下界为0的限制,使变量也可以取负值。
@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束
3.4、集合操作函数
1、@WRAP(I,N)此函数对N<1无定义;当I位于区间[1,N]内时直接返回I;一般地,返回J=I-K*N,其中J位于区间[1,N],K为整数。
即
2、WRAP(I,N)=@MOD(I,N)。
当@MOD(I,N)=0时@WRAP(I,N)=N.。
函数可以用来防止集合的索引值越界。
用户在编写LINGO程序时,应注意避免LINGO模型求解时出现集合的索引值越界的错误。
3.5、输入输出函数
1、ILE(filename)当前模型引用其他ASCII码文件中的数据或文本时可以采用该语句(但不允许=\嵌套使用),其中filename为存放数据的文件名,该文件中记录之间用“~”
1、DBC提供LINGO与ODBC(OpenDataBaseConnection,开放式数据库连接)的接口。
2、@OLE提供LINGO与OLE(ObjectLinkingandEmbeding)接口。
3、@POINTER(N)在Windows下使用LINGO的动态连接库DLL,直接从共享的内存中传送数据。
4、@TEXT(['filename'])用于数据段中将解答结果送到文本文件filename中,当省略filename时,结果送到标准的输出设备(通常就是屏幕)。
filename中可以带有文件路径,没有指定路径时表示在当前目录,如果这个文件已经存在,将会被覆盖。
3.6、其他函数
1、@IF(logical_condition,true_result,false_result)当逻辑表达式logical_condition的结果为真时,返回true_result,否则返回false_result。
2、@in(set_name,primitive_index_1[,primitive_index_2,…])如果元素在指定集中,返回1;否则返回0。
四、LINGO软件与外部文件的接口
一、通过文件输入输出数据
通过文件输入输出数据可以将LINGO程序和程序处理的数据分离开来。
通过文本文件输入数据:
@FILE(filename)
通过文本文件输出数据:
@TEXT(['filename'])
通过文本文件输入数据时:
1、@FILE函数通常可以在集合段和数据段使用,但不允许嵌套使用。
2、调用格式:
@FILE(filename)
3、filename为存放数据的文件名(可以包含完整的路径名,或表示在当前目录下寻找这个文件)
4、数据文件中记录之间必须用“~”分开
通过文本文件输出数据时:
1、@TEXT函数通常只在数据段使用,调用格式:
@TEXT(['filename']),它用于数据段中将解答结果送到文本文件filename中,
2、当省略filename时,结果送到标准的输出设备(通常就是屏幕)
3、Filename可以使用相对路径或绝对路径,若文件已经存在,则覆盖原文件
相关实例:
MODEL:
SETS:
MYSET/@FILE(myfile.ldt)/:
@FILE(myfile.ldt);
ENDSETS
MIN=@SUM(MYSET(I):
ORDERED(I)*COST(I));
@FOR(MYSET(I):
ORDERED(I)>NEED(I);ORDERED(I) DATA: COST=@FILE(myfile.ldt); NEED=@FILE(myfile.ldt); SUPPLY=@FILE(myfile.ldt); ENDDATA END 数据文件myfile.ldt的内容: Seattle,Detroit,Chicago,Denver~ COST,NEED,SUPPLY,ORDERED~ 12,28,15,20~ 1600,1800,1200,1000~ 1700,1900,1300,1100 每调用一次@FILE(myfile.ldt)就输入一个数据记录。 如输入数据发生变化,则只要修改数据文件myfile.ldt中的内容,程序不变,实现数据与程序分离 二、通过电子表格文件传递数据 2.1、在LINGO中使用电子表格文件的数据时,可将LINGO模型嵌入、链接到电子表格文件中。 实际应用中,可能有大量数据是存放在各种电子表格中的(如EXCEL表格)。 LINGO系统与EXCEL文件传递数据的函数的一般用法是通过@OLE函数。 @OLE函数的调用格式: @OLE(spreadsheet_file[,range_name_list]) 输入数据: “属性(或变量)=@OLE(...)” 输出数据: “@OLE(...)=属性(或变量)” 一般步骤: 1、首先,建立相应的EXCEL数据文件mydata.xls,并定义相应的数据单元 2、数据单元定义方法: 选择EXCEL的菜单命令“插入|名称|定义”,才弹出 对话框中输入单元名称 2.2、将LINGO模型嵌入、链接到电子表格文件中一般步骤: 1、打开EXCEL文件 2、菜单命令“插入|对象” 3、选择“新建|LINDODocument”,建立一个空的LINGO文件对象,且在EXCEL中出现LINGO菜单 4、输入LINGO程序内容,即可在EXCEL中运行LINGO程序 三、LINGO与数据库交换数据 不同的数据库有不同的数据库管理系统(DBMS: DataBaseManagementSystem);在WINDOWS环境下可以用ODBC(OpenDataBaseConnectivity)进行连接。 LINGO中可以使用函数@ODBC,格式为: @ODBC(['data_source'[,'table_name'[,'col_1'[,'col_2'...]]]]) 其中data_source是数据库名, table_name是数据表名, col_1,col_2,...是数据列名(数据域名)。 四、LINGO中的集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。 LINGO允许把这些相联系的对象聚合成集(sets)。 一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。 下面简单介绍一下如何创建集,并用数据初始化集的属性。 4.1、为什么使用集 集是LINGO建模语言的基础,是程序设计最强有力的基本构件。 借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。 4.2、什么是集 集是一群相联系的对象,这些对象也称为集的成员。 一个集可能是一系列产品、卡车或雇员。 每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。 属性值可以预先给定,也可以是未知的,有待于LINGO求解。 例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。 LINGO有两种类型的集: 原始集(primitive set)和派生集(derivedset)。 一个原始集是由一些最基本的对象组成的。 一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。 4.3、模型的集部分 集部分是LINGO模型的一个可选部分。 在LINGO模型中使用集之前,必须在集部分事先定义。 集部分以关键字“sets: ”开始,以“endsets”结束。 一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。 一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。 4.3.1定义原始集 定义一个原始集的语法: setname[/member_list/][: attribute_list]; 注意: 用“[]”表示该部分内容可选。 下同,不再赘述。 Setname是选择用来标记集的名字,最好具有较强的可读性。 集名字必须严格符合标准命名规则: 以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉伯数字(0,1,…,9)组成的总长度不超过32个字符的字符串,且不区分大小写。 注意: 该命名规则同样适用于集成员名和属性名等的命名。 Member_list是集成员列表。 如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。 如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。 ①当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁开,允许混合使用。 例4.1可以定义一个名为students的原始集,它具有成员John、Jill、Rose和Mike,属性有sex和age: sets: students/JohnJill,RoseMike/: sex,age; endsets ②当隐式罗列成员时,不必罗列出每个集成员。 可采用如下语法: setname/member1..memberN/[: attribute_list]; 这里的member1是集的第一个成员名,memberN是集的最末一个成员名。 LINGO将自动产生中间的所有成员名。 LINGO也接受一些特定的首成员名和末成员名,用于创建一些特殊的集。 列表如下: 隐式成员列表格式 示例 所产生集成员 1..n 1..5 1,2,3,4,5 StringM..StringN Car2..car14 Car2,Car3,Car4,…,Car14 DayM..DayN Mon..Fri Mon,Tue,Wed,Thu,Fri MonthM..MonthN Oct..Jan Oct,Nov,Dec,Jan MonthYearM..MonthYearN Oct2001..Jan2002 Oct2001,Nov2001,Dec2001,Jan2002 ③集成员不放在集定义中,而在随后的数据部分来定义。 例4.2 ! 集部分; sets: students: sex,age; endsets ! 数据部分; data: students,sex,age=John116 Jill014 Rose017 Mike113; enddata 注意: 开头用感叹号(! ),末尾用分号(;)表示注释,可跨多行。 在集部分只定义了一个集students,并未指定成员。 在数据部分罗列了集成员John、Jill、Rose和Mike,并对属性sex和age分别给出了值。 集成员无论用何种字符标记,它的索引都是从1开始连续计数。 在attribute_list可以指定一个或多个集成员的属性,属性之间必须用逗号隔开。 LINGO内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些问题,然后再借助于LINGO求解器求解。 因此,集属性的值一旦在模型中被确定,就不可能再更改。 在LINGO中,只有在初始部分中给出的集属性值在以后的求解中可更改。 这与前面并不矛盾,初始部分是LINGO求解器的需要,并不是描述问题所必须的。 4.3.2定义派生集 定义一个派生集的语法: setname(parent_set_list)[/member_list/][: attribute_list]; setname是集的名字。 parent_set_list是已定义的集的列表,多个时必须用逗号隔开。 如果没有指定成员列表,那么LINGO会自动创建父集成员的所有组合作为派生集的成员。 派生集的父集既可以是原始集,也可以是其它的派生集。 例4.3 sets: product/AB/; machine/MN/; week/1..2/; allowed(product,machine,week): x; endsets LINGO生成了三个父集的所有组合共八组作为allowed集的成员。 列表如下: (A,M,1)、A,M,2)、A,N,1)、(A,N,2)、(B,M,1)、(B,M,2)、(B,N,1)、(B,N,2) 成员列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集。 如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集成为稀疏集。 同原始集一样,派生集成员的声明也可以放在数据部分。 一个派生集的成员列表有两种方式生成: ①显式罗列;②设置成员资格过滤器。 当采用方式①时,必须显式罗列出所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集。 使用前面的例子,显式罗列派生集的成员: allowed(product,machine,week)/AM1,AN2,BN1/; 如果需要生成一个大的、稀疏的集,那么显式罗列就很讨厌。 幸运地是许多稀疏集的成员都满足一些条件以和非成员相区分。 我们可以把这些逻辑条件看作过滤器,在LINGO生成派生集的成员时把使逻辑条件为假的成员从稠密集中过滤掉。 例4.4 sets: students/John,Jill,Rose,Mike/: sex,age; linkmf(students,students)|sex(&1)#eq#1#and#sex(&2)#eq#0: friend; linkmf2(linkmf)|friend(&1,&2)#ge#0.5: x; endsets data: sex,age=116 014 017 013; friend=0.30.50.6; enddata 用竖线(|)来标记一个成员资格过滤器的开始。 #eq#是逻辑运算符,用来判断是否“相等”,&1可看作派生集的第1个原始父集的索引,它取遍该原始父集的所有成员;&2可看作派生集的第2个原始父集的索引,它取遍该原始父集的所有成员;&3,&4,……,以此类推。 注意如果派生集B的父集是另外的派生集A,那么上面所说的原始父集是集A向前回溯到最终的原始集,其顺序保持不变,并且派生集A的过滤器对派生集B仍然有效。 因此,派生集的索引个数是最终原始父集的个数,索引的取值是从原始父集到当前派生集所作限制的总和。 五、部分函数应用实例 例1、给定一个直角三角形,求包含该三角形的最小正方形。 解: 如图所示。 求最小的正方形就相当于求如下的最优化问题: LINGO代码如下: model: sets: object/1..3/: f; endsets data: a,b=3,4; enddata f (1)=a*@sin(x); f (2)=b*@cos(x); f(3)=a*@cos(x)+b*@sin(x); min=@smax(f (1),f (2),f(3)); @bnd(0,x,1.57); End 例2、产生序列{1,4,9,16,25} model: sets: number/1..5/: x; endsets @for(number(I): x(I)=I^2); end 例3、求向量[5,1,3,4,6,10]前5个数的和。 model: data: N=6; enddata sets: number/1..N/: x; endsets data: x=5134610; enddata s=@sum(number(I)|I#le#5: x); end 例4、求向量[5,1,3,4,6,10]前5个数的最小值,后3个数的最大值。 model: data: N=6; enddata sets: number/1..N/: x; endsets data: x=5134610; enddata minv=@min(number(I)|I#le#5: x); maxv=@max(number(I)|I#ge#N-2: x); end 例5、分段函数在LINGO中的实现: 某公司用两种原油(A和B)混合加工成两种汽油(甲和乙)。 甲、乙两种汽油含原油A的最低比例分别为50%和60%,每吨售价分别为4800元和5600元。 该公司现有原油A和B的库存量分别为500吨和1000吨,还
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lingo