LINGO编程(基础)

五段程序架构

LINGO程序一般以“Model:”开始,“End”结束。在程序中若没有Model和End也能执行但最好还是写完整。每条语句之后要有一个分号。

Model:
	Title "Example";
	......
	......
End

集合段

集合段:以“SETSL:”开始,“ENDSETS”结束。

SETS:
	Car /1..2/ : a, b;
	Box /1..6/ : c, d;
	Link(Car, Box) : x;
ENDSETS

代码中Car表示集合名称,也是集合存储的数的类别名,后面的1到2表示两个两个变量下表分别为1和2,后面的a,b表示变量名。到这里相当于分别定义了a1,a2,b1,b2a_1, a_2, b_1, b_2a1,a2,b1,b2

第三句Link(Car, Box)表示同时用两种集合来定义变量,相当于定义了x11⋯x16,x21⋯x26x_{11} \cdots x_{16}, x_{21} \cdots x_{26}x11x16,x21x26下标的第一位对应Car集合类型,而第二位对应Box集合类型。

数据段

数据段,以"DATA:"开始,"ENDDATA"结束,数列中用逗号或空格隔开每个数。

DATA:
	a = 1, 2, 3, 4, 5, 6;
	b = 7 8 9 10 11;
	c = 12 13 14 15;
ENDDATA

其中a,b,c分别为集合段定义的变量,在DATA段把数据存储到变量里。

初始段

初始段,以“INIT:”开始,“ENDINIT”结束,对变量赋初值

INIT:
	x,y = 1, 2, 3, 4, 5, 6;
ENDINIT

相当于(x, y)分别为(1,2),(3,4),(5,6)(1, 2), (3, 4), (5, 6)(1,2),(3,4),(5,6)

计算段

计算段,以“CALC:”开始,“ENDCALC”结束。对原始数据进行计算,相当于对数据的预处理。

CALC:
	Total Number = @sum(Car:a * b);
ENDCALC

在这一步中使用了sum函数,调用函数时要加‘@’符号。sum函数中第一个参数Car(i)表示迭代的集合名,指定为Car则后面的i会分别从1枚举到2,相当于计算a1∗b1+a2∗b2a_1*b_1+a_2*b_2a1b1+a2b2

目标与约束段

目标与约束段:目标函数、约束条件等没有段的开始和结束标记,因此实际上就是除了其它四个段(都明确的段标记)外的LINGO模型。他是LINGO程序最重要的部分。

Min = @sum(box, c+d);
@for(Car : a + b < 10);
@for(Link:@bin(x));

第一句表示目标函数为f=∑ci+dif = \sum c_i+d_if=ci+di, Min表示使目标函数的值尽量小,下面的两句则是约束,具体的语法请看下面的实例。

一些实例

  1. 如何表示约束
    ∑x=1100xi≤90\sum_{x=1}^{100}x_i\leq 90x=1100xi90
SETS:
	s/1..100/ : x;
ENDSETS
@sum(s : x < 90); 
  1. 如何定义0−10-101变量集合
SETS:
	a/1..100/:;
	b/1..100/:;
	c(a, b): x;
ENDSETS
@for(c(i, j):@bin(x(i, j)));
  1. 如何表示多个约束
    ∑i=1100xij≥150\sum_{i=1}^{100}x_{ij} \geq 150i=1100xij150
SETS:
	a/1..100/:;
	b/1..100/:;
	c(a,b):x;
ENDSETS
@for(b(j):@sum(a(i):x(i,j)) > 150);

for的第一个参数b(j)表示在b集合类型的枚举元素,j相当于循环变量。这里与sum类似,j将从1枚举到100。
4. 过滤语句
∑2≤k≤40 k≠10xijk=100\sum_{2\leq k \leq40 \ k\neq10} x_{ijk}=1002k40 k=10xijk=100

SETS:
	a/1..20/:;
	b/1..30/:;
	c/1..40/:;
	d(a,b,c):x;
ENDSETS
@for(a(i):@for(b(j):@sum(c(k)|k #gt# 1 #and# k #ne# 10:x(i,j,k)=100)));

其中两个井号之间的是逻辑运算符,以下是LINGO的九种逻辑运算符

运算符说明
#not#逻辑非
#and#逻辑与
#or#逻辑或
#eq#判断是否相等
#ne#判断是否不相等
#gt#大于
#ge#大于等于
#lt#小于
#le#小于等于

过滤的时候在集合左边加‘|’然后跟上下标满足的条件即可。

  1. 上三角矩阵的建立
    ∑i=14∑j=i4cijxij \sum_{i=1}^{4}\sum_{j=i}^{4}c_{ij}x_{ij}i=14j=i4cijxij
SETS:
	month/1..4/:;
	link(month, month) | &2 #ge# &1:c, x;
ENDSETS
DATA:
	c = 70 72 74 76
	  	   71 73 75
	  	      80 82
	  	         76;
ENDDATA

&2 表示第二个下标,&1表示第一个下标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值