当前位置:   article > 正文

LINGO编程(基础)_lingo数列

lingo数列

五段程序架构

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

Model:
	Title "Example";
	......
	......
End
  • 1
  • 2
  • 3
  • 4
  • 5

集合段

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

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

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

第三句Link(Car, Box)表示同时用两种集合来定义变量,相当于定义了 x 11 ⋯ x 16 , x 21 ⋯ x 26 x_{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
  • 1
  • 2
  • 3
  • 4
  • 5

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

初始段

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

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

相当于(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
  • 1
  • 2
  • 3

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

目标与约束段

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

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

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

一些实例

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

for的第一个参数b(j)表示在b集合类型的枚举元素,j相当于循环变量。这里与sum类似,j将从1枚举到100。
4. 过滤语句
∑ 2 ≤ k ≤ 40   k ≠ 10 x i j k = 100 \sum_{2\leq k \leq40 \ k\neq10} x_{ijk}=100 2k40 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)));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

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

  1. 上三角矩阵的建立
    ∑ i = 1 4 ∑ j = i 4 c i j x i j \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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55669
推荐阅读
相关标签
  

闽ICP备14008679号