1. Lingo入门

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

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

@free@sub@slb

2. 在LINGO中使用集合


@SUM@SUM(QUARTERS(i): 400*RP(i) +450*OP(i) +20*INV(i) )@SUM@FORINV(1)=10+RP(1)+OP(1)-DEM(1);i#GT#1i#GT#1#GT#

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

SETS:ENDSETS@SUM@FORDATA:ENDDATAINIT:ENDINITCALC: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))<=e(i););
@for(supply:@free(X);@free(Y););
END
  1. 定义了三个集合,其中LINK在前两个集合DEMAND 和SUPPLY的基础上定义
  2. 在程序开头用TITLE语句对这个模型取了一个标题“LOCATION PROBLEM;并且对目标行([OBJ])和两类约束(DEMAND_CON、SUPPLY_CON)分别进行了命名(请特别注意这里约束命名的特点)。
  3. INGO对数据是按列赋值的
    语句的实际赋值顺序是X=(5,2), Y=(1,7), 而不是X=(5,1), Y=(2,7)
    等价写法:
    “X=5,2; Y=1,7;”
    解得: 这里写图片描述

2.3 稠密集合与稀疏集合

包含了两个基本集合构成的所有二元有序对的派生集合称为稠密集合(简称稠集)。有时候,在实际问题中,一些属性(数组) 只在笛卡儿积的一个真子集合上定义,这种派生集合称为稀疏集合(简称疏集)。
例 (最短路问题) 在纵横交错的公路网中,货车司机希望找到一条从一个城市到另一个城市的最短路. 下图表示的是公路网, 节点表示货车可以停靠的城市,弧上的权表示两个城市之间的距离(百公里). 那么,货车从城市S出发到达城市T,如何选择行驶路线,使所经过的路程最短?
这里写图片描述
此例中可把从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的最优行驶路线的路长:
这里写图片描述
这里写图片描述
本例的LINGO求解:
这里写图片描述

MODEL:
SETS:
    CITIES /S,A1,A2,A3,B1,B2,C1,C2,T/:L;  !属性L(i)表示城市S到城市i的最优行驶路线的路长;
    ROADS(CITIES,CITIES)/     !派生集合ROADS表示的是网络中的道路(弧);
    S,A1 S,A2 S,A3                     !由于并非所有城市间都有道路直接连接,所以将弧直接列出;
    A1,B1 A1,B2 A2,B1 A2,B2 A3,B1 A3,B2
    B1,C1 B1,C2 B2,C1 B2,C2
    C1,T C2,T/:D;    !属性D(i,j)是城市i到j的直接距离(已知);
ENDSETS
DATA:
D= 6 3 3
   6 5 8 6 7 4
   6 7 8 9
   5 6;
L=0, , , , , , , ,;   !因为L(S)=0;
ENDDATA
@for(CITIES(i)|i#GT#@index(S):
L(i)=@MIN(ROADS(j,i): L(j)+D(j,i)););
END

运行结果:这里写图片描述

  1. “CITIES”(城市):一个基本集合(元素通过枚举给出)
  2. “ROADS”(道路):由CITIES导出的一个派生集合(请特别注意其用法),由于只有一部分城市之间有道路相连,所以不应该把它定义成稠密集合,将其元素通过枚举给出,这就是一个稀疏集合。
  3. 从模型中还可以看出:这个LINGO程序可以没有目标函数,这在LINGO中,可以用来找可行解(解方程组和不等式组)。

2.4 集合的使用小结

setname [/member_list/] [: attribute_list]setname(parent_set_list) [/member_list/] [: attribute_list]

3. 运算符和函数


3.1 逻辑运算符

#AND##OR##NOT##EQ##NE##GT##GE##LT##LE#

3.2 基本的数学函数

@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)

3.3 集合循环函数

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

@function(setname[(set_index_list)[|condition]]:expression_list);
@FOR@MAX@MIN@PROD@SUM

3.4 集合操作函数

@INDEX( [set_name,] primitive_set_element)
SETS:
   GIRLS /DEBBIE, SUE, ALICE/;
   BOYS /BOB, JOE, SUE, FRED/;
ENDSETS
@INDEX(SUE)@INDEX(GIRLS,SUE)@INDEX(BOYS, SUE)@IN( set_name, primitive_index_1 ,[primitive_index_2 ...])&1&2&1&2
   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));
@WRAP(I,N)@WRAP(I,N)= @MOD(I,N)@MOD(I,N)=0@WRAP(I,N)=N@SIZE (set_name)

3.5 变量定界函数

@BND(L, X, U)
@BIN(X)
@FREE(X)
@GIN(X)

3.6 概率相关函数

@PSN(X)
@PSL(X)
@PPS(A,X)
@PPL(A,X)
@PBN(P,N,X)
@PHG(POP,G,N,X)
@PEL(A,X)
@PEB(A,X)
@PFS(A,X,C)
@PFD(N,D,X)
@PCX(N,X)
@PTD(N,X)
@QRAND(SEED)
@RAND(SEED)

3.7 文件输入输出函数

@FILE(filename)
@ODBC
@OLE
@POINTER( N)
@TEXT(['filename'])

3.8 结果报告函数

@ITERS()
@TEXT() = @ITERS();

将迭代次数显示在屏幕上。

@NEWLINE(n)
@STRLEN(string)@STRLEN(123)
@NAME(var_or_row_refernce)
@WRITE(obj1[, …, objn])@NEWLINE@WRITE
DATA:
   @TEXT() = @WRITE('A is', A, ', B is', B, ', A/B is', A/B);
ENDDATA

其中A,B是该模型中的变量,在屏幕上输出A,B以及A/B的值(增加了一些字符串,使结果读起来更方便)。假设计算结束时A=10,B=5,则输出为:

    A is 10,B is 5, A/B is 2
@WRITEFOR( setname[ ( set_index_list) [ | condition]]: obj1[,…, objn])@WRITE
DATA:
  @TEXT()=@WRITEFOR(ROAD(I,J)| X(I,J) #GT# 0:‘从仓库', WH(I),
          '到顾客',C(J),'供货 ', X(I,J),'件 ',@NEWLINE(1));
ENDDATA

对应的输出效果示意如下:
从仓库 WH1 到顾客 C1 供货 2件
…………………..
从仓库 WH3 到顾客 C3 供货21件

@FORMAT( value, format_descriptor)@WRITE@WRITEFFOR@FORMAT
@DUAL( variable_or_row_name)@DUAL(variable)@DUAL(row)
DATA:
   @TEXT() = @WRITEFOR( SET1( I): X( I), @DUAL( X( I), @NEWLINE( 1));
ENDDATA
@RANGED( variable_or_row_name)
@RANGEU( variable_or_row_name)

3.9 其他函数

@IF(logical_condition, true_result, false_result)
@WARN('text', logical_condition )
@USER(user_determined_arguments)

4. LINGO的主要菜单命令


这里写图片描述