数学建模之Lingo基础知识与应用

您所在的位置:网站首页 lingo求解最短路的结果分析报告 数学建模之Lingo基础知识与应用

数学建模之Lingo基础知识与应用

2024-07-06 19:54| 来源: 网络整理| 查看: 265

1. Lingo入门

安装:推荐微信公众号软件安装管家

(1) 界面分析: 这里写图片描述 (2) LINGO报告窗口 这里写图片描述 (3) 运行状态窗口 这里写图片描述 这里写图片描述 这里写图片描述 (4) 输出结果 这里写图片描述 基本用法注意事项:

LINGO中不区分大小写字母;变量和行名可以超过8个字符,但不能超过32个字符,且必须以字母开头。用LINGO解优化模型时已假定所有变量非负(除非用限定变量取值范围的函数@free或@sub或@slb另行说明)。变量可以放在约束条件的右端(同时数字也可放在约束条件的左端)。但为了提高LINGO求解时的效率,应尽可能采用线性表达式定义目标和约束(如果可能的话)。语句是组成LINGO模型的基本单位,每个语句都以分号结尾,编写程序时应注意模型的可读性。例如:一行只写一个语句,按照语句之间的嵌套关系对语句安排适当的缩进,增强层次感。 2. 在LINGO中使用集合

LP模型一个典型的输入方式: 这里写图片描述 1. @SUM(集合(下标):关于集合的属性的表达式) 本例中目标函数也可以等价地写成 @SUM(QUARTERS(i): 400*RP(i) +450*OP(i) +20*INV(i) ), “@SUM”相当于求和符号“∑”, “QUARTERS(i)”相当于“iQUARTERS”的含义。 由于本例中目标函数对集合QUARTERS的所有元素(下标) 都要求和,所以可以将下标i省去。 2. @FOR(集合(下标):关于集合的属性的约束关系式) 对冒号“:”前面的集合的每个元素(下标),冒号“:”后面的约束关系式都要成立 为了区别i=1和i=2,3,4,把i=1时的约束关系式单独写出,即“INV(1)=10+RP(1)+OP(1)-DEM(1);” ; 而对i=2,3,4对应的约束,对下标集合的元素(下标i)增加了一个逻辑关系式“i#GT#1”(这个限制条件与集合之间有一个竖线“|”分开,称为过滤条件)。 限制条件“i#GT#1”是一个逻辑表达式,意思就是i>1;“#GT#”是逻辑运算符号,意思是“大于(Greater Than的字首字母缩写)” 。

2.1 LINGO模型最基本的组成要素

一般来说,LINGO中建立的优化模型可以由五个部分组成,或称为五“段”(SECTION): (1)集合段(SETS):以“ SETS:” 开始, “ENDSETS”结束,定义必要的集合变量(SET)及其元素(MEMBER,含义类似于数组的下标)和属性(ATTRIBUTE,含义类似于数组)。 (2)目标与约束段:目标函数、约束条件等,没有段的开始和结束标记,因此实际上就是除其它四个段(都有明确的段标记)外的LINGO模型。 这里一般要用到LINGO的内部函数,尤其是与集合相关的求和函数@SUM和循环函数@FOR等。 (3)数据段(DATA):以 “DATA:” 开始, “ENDDATA”结束,对集合的属性(数组)输入必要的常数数据。 格式为:“attribute(属性) = value_list(常数列表);” 常数列表(value_list)中数据之间可以用逗号“,”分开,也可以用空格分开(回车等价于一个空格),如上面对DEM的赋值也可以写成“DEM=40 60 75 25;”。 (4)初始段(INIT):以“INIT: ”开始, “ENDINIT”结束,对集合的属性(数组)定义初值(因为求解算法一般是迭代算法,所以用户如果能给出一个比较好的迭代初值,对提高算法的计算效果是有益的)。 如果有一个接近最优解的初值,对LINGO求解模型是有帮助的。定义初值的格式为: “attribute(属性) = value_list(常数列表);” (5)计算段(CALC):以“CALC: ”开始, “ENDCALC”结束,对一些原始数据进行计算处理。 在实际问题中,输入的数据通常是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的“预处理”,得到模型中真正需要的数据。 例如上例,如果希望得到全年的总需求和季度平均需求,可以增加这个段:

CALC: T_DEM = @SUM(quarters: DEM); !总需求; A_DEM = T_DEM / @size(quarters); !平均需求; ENDCALC 2.2 基本集合与派生集合

这里写图片描述

MODEL: Title Location Problem; SETS: demand/1..6/:a,b,d; supply/1..2/:x,y,e; link(demand,supply):c; ENDSETS DATA: !locations for the demand(需求点的位置); a=1.25,8.75,0.5,5.75,3,7.25; b=1.25,0.75,4.75,5,6.5,7.75; !quantities of the demand and supply(供需量); d=3,5,4,7,6,11; e=20,20; ENDDATA INIT: !initial locations for the supply(初始点); x,y=5,1,2,7; ENDINIT !Objective function(目标); [OBJ] min=@sum(link(i,j):c(i,j)*((x(j)-a(i))^2+(y(j)-b(i))^2)^(1/2)); !demand constraints(需求约束); @for(demand(i):[DEMAND_CON]@sum(supply(j):c(i,j))=d(i);); !supply constraints(供应约束); @for(supply(i):[SUPPLY_CON]@sum(demand(j):c(j,i))= 0时返回+1)。 @SIN(X):正弦函数,返回X的正弦值(X的单位是弧度)。 @SMAX(list):最大值函数,返回一列数(list)的最大值。 @SMIN(list):最小值函数,返回一列数(list)的最小值。 @SQR(X):平方函数,返回X的平方(即X*X)的值。 @SQRT(X):开平方函数,返回X的正的平方根的值。 @TAN(X):正切函数,返回X的正切值(X的单位是弧度)。

3.3 集合循环函数

集合上的元素(下标)进行循环操作的函数, 一般用法如下:

@function(setname[(set_index_list)[|condition]]:expression_list);

其中: function 集合函数名,FOR、MAX、MIN、PROD、SUM之一; Setname 集合名; set_index_list 集合索引列表(不需使用索引时可以省略); Condition 用逻辑表达式描述的过滤条件(通常含有索引,无条件时可以省略); expression_list 一个表达式(对@FOR函数,可以是一组表达式。 五个集合函数名的含义: @FOR(集合元素的循环函数): 对集合setname的每个元素独立地生成表达式,表达式由expression_list描述(通常是优化问题的约束)。 @MAX(集合属性的最大值函数):返回集合setname上的表达式的最大值。 @MIN(集合属性的最小值函数):返回集合setname上的表达式的最小值。 @PROD(集合属性的乘积函数): 返回集合setname上的表达式的积。 @SUM(集合属性的求和函数):返回集合setname上的表达式的和。

3.4 集合操作函数 @INDEX( [set_name,] primitive_set_element) 给出元素primitive_set_element在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号)。省略set_name,LINGO按模型中定义的集合顺序找到第一个含有该元素的集合,并返回索引值。如果没有找到该元素,则出错。 注: Set_name的索引值是正整数且只能位于1和元素个数之间。例:定义一个女孩姓名集合(GIRLS)和男孩姓名集合(BOYS) : SETS: GIRLS /DEBBIE, SUE, ALICE/; BOYS /BOB, JOE, SUE, FRED/; ENDSETS

都有SUE,GIRLS在BOYS前定义,调用@INDEX(SUE)将返2,相当于@INDEX(GIRLS,SUE)。要找男孩中名为SUE的小孩的索引,应该使用@INDEX(BOYS, SUE),返3。 2. @IN( set_name, primitive_index_1 ,[primitive_index_2 ...]) 判断一个集合中是否含有某个索引值。如果集合set_name中包含由索引primitive_index_1, [ primitive_index_2 …]所对应元素,则返回1(逻辑值“真”),否则返回0(逻辑值“假”)。索引用“&1”、“&2”或@INDEX函数等形式给出,这里“&1”表示对应于第1个父集合的元素的索引值,“&2”表示对应于第2个父集合的元素的索引值。 例:定义一个集合STUDENTS(基本集合),派生出集合PASSED和FAILED,定义:

SETS: STUDENTS / ZHAO, QIAN, SUN, LI/:; PASSED( STUDENTS) /QIAN,SUN/:; FAILED( STUDENTS) | #NOT# @IN( PASSED, &1):; ENDSETS

如果集合C是由集合A,B派生的,例如:

SETS: A / 1..3/:; B / X Y Z/:; C( A, B) / 1,X 1,Z 2,Y 3,X/:; ENDSETS

判断C中是否包含元素(2,Y),则可以利用以下语句:

X = @IN( C, @INDEX( A, 2), @INDEX( B, Y));

对本例,结果是X=1(真)。 3. @WRAP(I,N) 此函数对N



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3