lingo基础入门Day 9

lingo基础入门Day 9

文章目录

  • lingo基础入门Day 9
      • lingo模型的构成
        • 用lingo可以写两种模型:
        • 多数专业模型由三段构成:
        • 完整的专业模型构成
      • 标题
        • 语法格式:
      • 集合段
        • 语法格式:
      • 数据段
        • 语法格式:
      • 初始段
        • 代码实现:
      • 计算段
        • 代码实现:
        • 模型的建立:
      • 约束段
        • 代码实现:
      • 总结

lingo模型的构成

用lingo可以写两种模型:

  • 简单模型
  • 基于集合的专业模型

多数专业模型由三段构成:

  • 结合定义段,简称集合段
  • 数据定义段,简称数据段
  • 目标函数与约束条件段,简称约束段

完整的专业模型构成

在一个模型中只有约束段是必须的,其他部分包括(标题、model:和end)都是可选的

各个段的位置是任意的,没有先后之分。

标题

语法格式:

MODEL:
TITLE 生产计划;

END
  • 标题没有固定的位置,可以输入约束条件的地方都可以输入标题。
  • 一般将标题放在第二行
  • 模型的标题必须以关键字title开始,以分号结束
  • title和分号之间的所以文字都被看做是模型的标题。

集合段

语法格式:

SETS:

ENDSETS
  • 集合应当先定义后使用
  • 一个模型可以没有集合段,可以有一个集合段也可以有多个集合段。
  • 集合段的位置在模型中是任意的,唯一的约束是在使用之前定义集合及其属性。

数据段

语法格式:

DATA:

ENDDATA
  • 数据段是数据和模型的其他部分分割开来。这有利于模型的维护和规模的控制。
  • 在数据段中,可以输入集合的元素,还可以给集合的属性赋值。
  • 一个模型可以没有数据段,可以有一个或多个数据段
  • 数据段的位置也是任意的。

赋值语句统一格式:

  • 对象列表 = 值列表;
  • 在数据段给对象赋值后,在模型求解过程中始终保持不变,因此是常量
  • 给标量赋值:
DATA:
	PIRCE = 2.68;
	A B C=8 3.75 6.4;
	X,Y,Z=1,2,300;
ENDDATA

给一个向量赋值:

 MODEL:
 
 SETS:
 	ITEM/1..5/:A,B;
 ENDSETS
 
 DATA:
  A=10 20 30 40 50;
  B=2 4 6 8 10;
 ENDDATA
 
 END

给同一个集合上的多个向量赋值:

SETS:
	ITEM/1..5/:A,B;
ENDSETS

DATA:
A B =
10 2
20 4
30 6
40 8
50 10
ENDDATA

给集合及其属性同时赋值:

在等号左边的对象列表中最多只能有一个是集合,此时对象列表中的其他对象必须是定义在该集合上的属性。

如果模型中的参数在建模时候不确定,希望在求解模型是从键盘输入,那么你可以采用下面的格式:

变量 = ?;

DATA:
	RATE = ?;
ENDDATA

只给向量部分分量赋值:

SETS:
ITEM/1..5/:A;
ENDSETS

DATA:
A= 10, , , , ;
ENDDATA

此时一个逗号都不能省略,否则lingo认为给向量输入数据的格式不正确。

未赋值的分量由lingo在求解模型的时候自行确定。

初始段

代码实现:

INIT;

ENDINIT
  • 出时段用来在非线性模型中给决策变量赋予一定的初始值,求解器能够以此为起点更快找到最优解。
  • 在初始值中赋予初值的变量在求解的过程中可以被求解器自由改变
  • 初始段在线性模型中不起任何作用。

举例demo:

MODEL:
INIT:
	X=0.99;
	Y=0.06;
ENDINIT

X^2+Y^2<=1;
Y <= @LOG(X);

END

计算段

代码实现:

CALC:


ENDCALC

如果在建模时所得到的数据还需要进一步处理才能用于建模,则可以在计算段进行处理

lingo先执行计算段中的语句,再求解模型。

MODEL:
DATA:
X,Y,Z = 8, 2, 5;
ENDDATA
CALC:
AVG = X+Y+Z;
AVG = AVG/3;
ENDCALC

END
  • 在计算段中主要的表达式是赋值表达式。
  • 在计算段中还可以使用集合遍历函数。

举例:

在一个有10个城市的TSP问题中,原始数据只有各城市在地图上的坐标,而模型计算时需要各个城市之间的距离矩阵。这就需要用到计算段来进行处理。

模型的建立:

MODEL:

SETS:
	CITY/1..10/:U,A,B;
	LINK(CITY,CITY):DIST,X;
ENDSETS

DATA:
 A B=
 1304 2312
 3639 1315
 4177 1399
 3488 1535
 3362 1561
 6425 5166
 9122 6161
 6164 2535;
ENDDATA

CALC:
	@FOR(CITY(I)):
		@FOR(CITY(J):DIST(I,J)=
			@SQPT(
				@SQR(A(I)-A(J))
				+
				@SQR(B(I)-B(J)))
		)
	);

@SUM(ROAD(I,J)|I #EQ# A: X(I,J))=1;
@SUM(ROAD(I,J)|J #EQ# G: X(I,J))=1;
@FOR(CITY(I)|I #NE# A #AND# I #NE# G:
	@SUM(ROAD(I,J):X(I,J))=@SUM(ROAD(K,J):X(K,I))
);
	@FOR(ROAD: @BIN(X));
END

约束段

代码实现:

MODEL:

END

约束段是模型的默认组成部分,没有起始标志,也没有结束标志。

目标函数被lingo看作是一个约束条件

模型可以没有目标函数,遇到这种情况,lingo将会求出满足全部约束条件的可行解,所以可以用来求解方程组。

总结

本小节主要讲了lingo的整体组成,包括标题、集合段、数据段、初始段、计算段、约束段的使用方法以及使用场景。

你可能感兴趣的:(lingo入门,lingo,线性规划,动态规划,算法,建模)