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表示变量名。到这里相当于分别定义了 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

其中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,相当于计算 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));

第一句表示目标函数为 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. 如何定义 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. 如何表示多个约束
    ∑ 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);

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

其中两个井号之间的是逻辑运算符,以下是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

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

  • 25
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 变量声明 在Lingo中,可以使用var来声明变量,例如: `var myVariable` 这会声明一个名称为myVariable的变量。 2. 变量赋值 可以使用等号将值分配给变量,例如: `myVariable = "Hello World"` 这会将字符串"Hello World"赋值给myVariable。 3. 数据类型 Lingo支持许多不同的数据类型,包括字符串、数字、布尔值、数组和对象。 4. 字符串 在Lingo中,字符串可以使用双引号或单引号来表示,例如: `myString = "Hello"` 或者 `myString = 'World'` 5. 数字 数字可以是整数或浮点数,例如: `myNumber = 10` 或 `myNumber = 3.14` 6. 布尔值 布尔值只有两个可能的值:true或false,例如: `myBoolean = true` 或 `myBoolean = false` 7. 数组 数组是一组值的集合,可以使用方括号来创建,例如: `myArray = [1, 2, 3, 4]` 8. 对象 对象是一组属性和方法的集合,可以使用大括号来创建,例如: ``` myObject = { name: "John", age: 30, sayHello: function() { alert("Hello!"); } } ``` 9. 函数 函数是一段可重复使用的代码,它接受参数并返回值。可以使用function关键字来声明函数,例如: ``` function myFunction(param1, param2) { return param1 + param2; } ``` 10. 控制流 Lingo支持if语句、for循环、while循环和switch语句等控制流结构。 11. 注释 注释是对代码的解释和说明,Lingo支持单行注释和多行注释。单行注释以两个斜杠(//)开头,多行注释以/*开头,以*/结尾。例如: ``` // This is a single-line comment /* This is a multi-line comment */ ``` 以上就是Lingo基础语法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值