LINGO使用介绍

本文详细介绍了LINGO模型的结构,包括集合部分、目标与约束、数据部分和初始化部分,强调了编写模型时的注意事项。此外,还列举了LINGO内部的数学函数和集合函数,以及变量界定函数的使用方法。通过一个实际的数据文件示例,展示了如何构建和求解优化问题。数据文件data.txt提供了任务分配问题的具体数据,模型通过设置约束和目标函数来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.LINGO模型以MODEL开始,以END结束;中间为语句,分为四大部分.

①.集合部分(SETS)

这部分以"SETS:"开始,以"END SETS"结束
作用:定义必要的变量,便于后面进行编程与计算,在LINGO中称为集合(SET)及其元素和属性。

分为两类:
a.原始集合
定义为:SETNAME/member list(or 1…n)/:attribute,attribute,etc
b.导出集合(引用其它集合定义的集合)
定义为:SETNAME(set1,set2,etc):attribute,attribute,etc
如:

Person/1..10/:A;
Task/1..12/:B;
Link(Person,Task):X

②.目标与约束

这部分定义了目标函数、约束条件等。一般要用到LINGO的内部函数。
求解优化问题时,该部分是必须的。

③.数据部分(DATA)

这部分以“DATA:”开始,以“END DATA:”结束。
其作用是对集合的属性(数组)输入必要的数值

④.初始化部分(INIT)

这部分以“INIT:“开始,以“END INIT:”结束
作用在于对集合的属性(数组)定义初值

2.编写LINGO注意事项

a. 所有的语句除"MODEL、END、SETS、ENDSETS、DATA、ENDDATA 、 INIT、ENDINIT "外,必须以一个;结尾
b.LINGO求解非线性规划时已约定各变量非负

3.LINGO内部函数使用

LINGO建立优化模型时可以引用大量内部函数,这些函数以**@**符号开头

3.1 常用数学函数
@ABS(X) 返回变量X的绝对数值.
@SIN( X) 返回X的正弦值,X的单位为弧度
@COS(X) 返回X的余弦值,X的单位为弧度
@TAN( X)返回X的正切值,X的单位为弧度
@EXP(X)返回指数函数值,其中e=2.72828…
@LOG( X) 返回变量X的自然对数值
@FLOOR(X)向0靠近返回X的整数部分.
@LGM( X) 返回Γ函数的自然对数值.
@SIGN( X) 返回变量X的符号值,当X<0时为-1;当X>0时为1.
@SMAX( X1, X2,…, XN)返回一列值X1, X2,…, XN的最大值.
@SMIN( X1, X2,…, XN)返回一列值X1, X2,…, XN的最小值.

3.2集合函数
用法如下:
set_operator (set_name|condition:expression)

其中set_operator是集合函数名,
set_name是数据集合名,
|condition部分是条件,用逻辑表达式描述(无条件时可省略)
expression部分是表达式

逻辑表达式中可以三种逻辑算符#AND#(与),#OR#(或),#NOT#(非)
和六种关系算符
#EQ#(等于),#NE#(不等于),#GT#(大于),
#GE#(大于等于),#LT#(小于),#LE#(小于等于)。

常见的集合函数如下:
常见的集合函数如下:
@FOR (set_name:constraint_expressions)对集合(set_name)的每个元素独立地生成约束,约束由约束表达(constraint_expressions)描述.
@MAX(set_name:expression)返回集合上表达式(expression)的最大值.
@MIN(set_name:expression)返回集合上的表达式(expression)最小值.
@SUM(set_name:expression)返回集合上的表达式(expression)的和.
@SIZE(set_name)返回数据集set_name中包含元素的个数.
@IN(set_name,set_element)如果数据集set_name中包含元素set_element则返回1,否则返回0.

3.3 变量界定函数
变量函数对变量的取值范围附加限制,共有四种.
@BND(L,X,U)限制L≤X≤U
@BIN(X)限制X为0或1.
@FREE(X)取消对X的符号限制(可取任意实数值).
@GIN(X)限制X为整数值.

示例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
采用数据文件方式程序:
model:
sets:
person/1…4/;
task/1…4/;
assign(person,task):a,x;
endsets
data:
a=@file(data.txt);
enddata
min=@sum(assign:a*x);
@for(person(i):@sum(task(j):x(i,j))=1);
@for(task(j):@sum(person(i):x(i,j))=1);
@for(assign(i,j):@bin(x(i,j)));
end
同时在LINGO目录下建立文本文件
data.txt,数据如下:
1100,800,1000,700
600,500,300,800
400,800,1000,900
1100,1000,500,700

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值