欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

你想看完一篇文章就学会Lingo吗?在这篇文章中可以让你做到

程序员文章站 2022-05-01 12:27:45
...

Lingo编程简介

很多人会问Lingo是干什么用的?Lingo可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,求解优化模型算法比MATLAB要简单,是求解优化模型的最佳选择。
(一)Lingo编程语言介绍
Lingo模型以MODEL开始以END结束,中间分为集合部分(SETS)、目标与约束部分、数据部分(DATA)、初始化部分(INIT)。

MODEL:
 SETS:
      !此处输入集合部分内容
 ENDSETS
 DATA:
      !此处输入数据部分内容
 ENDDATA
 INIT:
      !此处输入初始化部分内容
 ENDINIT
      !此处输入目标与约束部分内容
END

(1)集合部分(以SETS开始,ENDSETS结束):这部分作用是定义变量,Lingo中集合分为两类,一种是原始集合,另一种是导出集合。
原始集合定义格式:

SETNAME/member/:attribute,attrubute,atc;

导出集合定义格式:

SETSNAME(set1,set2,etc):attribute,attribute,atc;
!set1表示的是所对应原始集合的名字

二者关系:如果在程序中需要定义多维数组则需要定义导出集合,原始集合可以看做是导出集合的一个维度
eg:定义一个二维数组mark:

person/1..5/:a;
test/1..5/:b;
mark(person,test):x;

(2)目标与约束:该部分定义目标函数和约束条件。
(3)数据部分(以DATA开始,ENDDATA结束):该部分是对集合属性输入必要的数值。

attrubute=1,2,3,4,5;

(4)初始化部分(以INIT开始,ENDINIT结束):该部分的作用是对集合的属性定义初始值。

attrubute=1,2,3,4,5;

(二)Lingo常用的内部函数介绍
(1)常用的数学函数:
@ABS(X):返回变量X的绝对值
@COS(X):返回变量X的余弦值,X为弧度
@SIN(X):返回变量X的正弦值,X为弧度
@TAN(X):返回变量X的正切值,X为弧度
@EXP(X):返回变量X的指数函数值
@SMAX(X1,X2,X3…XN):返回一组数值的最大值
@SMIX(X1,X2,X3…XN):返回一组数值的最小值
@SIGN(X):返回变量X的符号值
@LOG(X):返回变量X的自然对数
(2)常用的集合函数:
@FOR(setname:expression):对集合setname的每一个元素产生expression描述的约束
@MAX(setname:expression):返回集合中的每个元素在expression表达式中的最大值
@MIN(setname:expression):返回集合中的每个元素在expression表达式中的最小值
@SUM(setname:expression):返回expression表达式对集合中每个元素作用后的和
集合函数用法如下:

function_name(setname|condition:expression)

function:函数名
setname:集合名
|condition:条件
expression:表达式
注:条件中包含逻辑表达式,即有逻辑运算符和关系运算符
逻辑运算符:#AND#(与)、#OR#(或)、#NOT#(非)
关系运算符:#EQ#(等于)、#NE#(不等于)、#GT#(大于)、#GE#(大于等于)、#LT#(小于)、#LE#(小于等于)
(3)常见的对变量取值范围增加限定的函数
@BND(A,X,B):限定变量X的范围为:A<=X<=B
@BIN(X):限定变量X是0或1,常用于0,1规划中
@GIN(X):限定变量X为整数
(三)Lingo实例:

注:Lingo不区分字母的大小写

MODEL:
SETS:
person/1..5/;
test/1..5/;
mark(person,test):x,y;
ENDSETS
DATA:
x=85,96,53,63,78,
  96,100,56,47,81,
  59,32,99,77,75,
  92,80,76,55,95,
  80,42,36,96,50;
ENDDATA
min=@SUM(mark:x*y);
@FOR(person(i):@sum(test(j):y(i,j))=1);
@FOR(test(j):@sum(person(i):y(i,j))=1);
@FOR(mark(i,j):@BIN(x(i,j)));
END

运行结果:
你想看完一篇文章就学会Lingo吗?在这篇文章中可以让你做到
你想看完一篇文章就学会Lingo吗?在这篇文章中可以让你做到

相关标签: Lingo