LINGO简单使用

一. 前言

1.1 简介

img

LINGO is a comprehensive tool designed to make building and solving Linear, Nonlinear (convex & nonconvex/Global), Quadratic, Quadratically Constrained, Second Order Cone, Semi-Definite, Stochastic, and Integer optimization models faster, easier and more efficient. LINGO provides a completely integrated package that includes a powerful language for expressing optimization models, a full featured environment for building and editing problems, and a set of fast built-in solvers.

在当下各种近乎于浮夸的("大")数据处理工具面前, lingo可谓是一个另类的存在, 其官网上也没有各种高大上的宣传概念(动辄大数据, 神经网络..机器学习...), 是个相当相当低调的数学处理工具, 甚至其操作界面至今还维持上古时代vb的极简风格.

(但是, 需要注意, 这并不意味着这个软件的开发的停止..这个软件还持续更新, 当下版本20)

官方文档

p99HHTs.png

(图: 操作界面对于使用vba的用户可谓是相当亲切.)

专注解决以下数学问题:

  • 线性
  • 非线性(凹/凸/全局)
  • 二次
  • 二次约束
  • 二阶锥规划
  • 半确定
  • 随机

知乎-二阶锥规划

知乎-「Stochastic」与「Random」有何区别?

二. 基本使用

2.1 操作界面

p99Ljpt.png

除了求解器的设置之外, 没有任何其他的乱七八糟的设置...nice!

p99OV10.png

至繁归于至简

2.2 基本规范

  • LINGO数学规划模型, 通常包含包含三个基本部分: 目标函数, 决策变量, 约束条件.
  • 每个语句都必须要用一个英文状态下的分号结束 一个语句可以分几行输入.
  • 注释以英文状态的! 开始 必须以英文状态下的分号结束.
  • 变量不区分字母的大小写 必须以字母开头 可以包含数字和下划线 不超过32 个字符.
  • 程序只要定义好集合后, 其他语句的顺序是任意的.
  • 函数以@开头.
  • 默认所有的变量都是非负的.

2.2.1 段

  • 集合段: 用于定义数组型性变量SETS: …… ENDSETS.
  • 数据段: 用于变量赋值与数据传递DATA: ……ENDDATA.
  • 目标与约束段: 用于列出目标与约束唯一一个没有段的开始和结束标记.
  • 计算段: 用于数据初始整理计算CALC: …… ENDCALC.
  • 初始段: 用于变量赋初值迭代寻优INIT: ……ENDINIT.
  • 子模型段: 用于表达子模型进行调用@SUBMODEL mymodel:可执行语句( 约束+目标) ENDSUBMODEL.

2.3 集合

语法结构
sets:
集合名称1/成员列表1/: 属性1_1 属性1_2 … 属性1_n1;
集合名称2/成员列表2/: 属性2_1 属性2_2 … 属性2_n2;
派生集合名称( 集合名称1 集合名称2) : 属性3_1 … 属性3_n3;
endsets

sets:
    product/A B/;
    machine/M N/;
    week/1…2/;
    allowed(product,machine,week):x;
endsets

集合 name/n1…n4/:a;

  • name是集合名 n1…n4表示集合内到四个成员

  • a是集合属性

  • 集合定义以语句" sets:" 开始 " endsets" 结束 " endsets" 单独成一行 后面不加标点符号

  • !举例;
    sets:!集合段; 
    s/1..100/: x;
    endsets
    !目标与约束段
    @sum(s(i):x(i))<90;!循环求和函数
    
  • 缺省属性的集合: work/w1w2w3/;

  • 初始集合: name work

  • 派生集合: links(name,work):b;

    • links成员取name和work的所有可能组合 是一个由12个成员构成的矩阵
    • 该矩阵的行数与name中的成员个数相等
    • 该矩阵的列数与work中的成员个数相等

@in(set_name,primitive_index_1[,primitive_index_2,...])

如果元素在指定集内则返回1 否则返回0;

sets:                          全集为I,C为B的补集
  I/x1..x4/;
  B(I)/x2/;
  C(I)|#not#@in(B&1):;
endsets

@index([set_name,]primitive_set_element)

该函数返回在集set_name中原是集成员primitive_set_element的索引. 如果set_name被忽略 那么它将返回第一个原是集成员的索引.

sets:                 如何确定集成员( B,Y)属于派生集S3
  S1/A B C/;
  S2/X Y Z/;
  S3(S1,S2)/A X,A Z,B,Y,C X/;
endsets
X= @in(S3,@index(S1,B),@index(S2,Y));

2.4 数据

语法结构

data: data:
属性 1= 数据列表; 数据列表; 数据列表;
属性 2= 数据列表; 数据列表; 数据列表;
enddata nddata

2.5 变量界定函数

@for(items(i):@bin(x(i)));

! 对x进行约束 0, 1;

变量界定函数实现对变量取值范围进行限制

函数 作用
@bin(x) 限制x为0或1
@bnd(L, x, R) 限制L<=x<=R
@free(x) x可以取任意实数
@gin(x) 限制x为整数

2.6 循环函数

函数名 返回值
@FOR(s:e) 对集合s中的每一个元素都生成一个约束条件表达式 具体约束由e描述
@SUM(s:e) 对集合s中的每一个元素,计算表达式e的值 然后返回这些值的和
@MAX(s:e) 对集合s中的每一个元素,计算表达式e的值 然后返回这些值的最大值
@MIN(s:e) 对集合s中的每一个元素,计算表达式e的值 然后返回这些值的最小值
@PROD(s:e) 对集合s中的每一个元素,计算表达式e的值 然后返回这些值的乘积
  • @for: 该函数用来产生对成员的约束(类似C/C++中的for循环用法)

    @for(集合( 下标) [|逻辑表达式] :  集合表达式);
    
    表达方式 示例
    数学表达式 x(i) < 10; i n 1,2,3
    Lingo编码 @for(node(i) : x(i) < 10);
    Latex编码 x(i) < 10; i \in {1,2,3}
    model:
    sets:
      number/1..5/:x;
    endsets
      @for(number(I):x(I)=I^2);
    end
    
  • @sum: 返回遍历指定成员的一个表达式的和

    @sum(集合( 下标) : 集合表达式)
    
    表达方式 示例
    数学表达式 min = um_{i = 1}{3}\sum_{j=1}{3}x(i)*d(i,j)
    Lingo编码 min = @sum(arc(i,j) : x(i) * d(i,j));
    Latex编码 min = \sum_{i = 1}{3}\sum_{j=1}{3}x(i)*d(i,j)
    # 计算前五位数的和
    
    model:
    data:
    	N=6;
    enddata
    sets:
    	number/1..N/:x;
    endsets
    data:
    	x = 5 1 3 4 6 10;
    enddata
    	s = @sum(number(I)| I #le#5 :x);
    end
    
    # 计算元素中小于或等于5数的和
    
    model:
    data:
    	N=6;
    enddata
    sets:
    	number/1..N/:x;
    endsets
    data:
    	x = 5 1 3 4 6 10;
    enddata
    	s = @sum(number(I) | x(i) #le# 5: x(i));
    end
    
  • @min: 返回指定成员的一个表达式的最小值

    model:
    data:
      N=6;
    enddata
    sets:
      number/1  N/:x;
    endsets
    data:
      x=5 1 3 4 6 10;
    enddata
      minv=@min(number(I)|I #le# 5:x;
    
  • @max: 返回指定成员的一个表达式的最大值

2.7 其他函数

  • @if(logical_condition,true_result,false_result): 一个逻辑表达式logical_condition 如果为真返回true_ result 否则返回false_result.

2.8 数学运算符

^  次幂
*   乘
/  除
﹢  加
﹣  减

2.9 逻辑运算符

LINGO 中逻辑运算符主要用于集循环函数的条件表达式中, 用来控制在函数中哪些集成员被包含, 哪些被排斥. 在创建稀疏集时用在成员资格过滤器中. LINGO具有9种逻辑运算符

运算符 作用
#EQ# 若两个运算对象相等则为真 否则为假
#NE# 若两个运算对象不等则为真 否则为假
#GT# 若两个运算对象左边大于右边则为真 否则为假
#GE# 若两个运算对象左边大于或等于右边则为真 否则为假
#LT# 若两个运算对象左边小于右边则为真 否则为假
#LE# 若两个运算对象左边小于或等于右边则为真 否则为假
#NOT# 取反运算 使真为假 假为真
#AND# 当且仅当两个运算对象都为真时为真 否则为假
#OR# 当且仅当两个运算对象都为假时为假 否则为假

优先级由高到低

高 #not#

\#eq# #ne# #gt# #ge# #lt# #le#

低 #and# #or#

2.10 数学函数

函数 作用
@abs(x) 返回x的绝对值
@sqrt(x) 返回x的平方根
@sin(x) 返回x的正弦值
@cos(x) 返回x的余弦值
@tan(x) 返回x的正切值
@exp(x) 返回常数e的x次方
@log(x) 返回x的自然对数
@lgm(x) 返回x的gamma函数的自然对数
@sign(x) 如果x<0返回-1; 否则返回1
@floor(x) 返回x的整数部分
@smax(x1,x2,…,xn) 返回x1,x2,…,xn中的最大值
@smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值

三. 示例

3.1 基本

i=1100j=1200=280\sum_{i=1}^{100}\sum_{j=1}^{200} = 280

model:
	sets:
		a/1..100/:;
		b/1..200/:;
		c(a, b):x;
	endsets

	@sum(c(i, j):x(i, j)) = 280;
end

3.1.1 示例1

:max  z=2x1+3x25x3s.t={x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x20,x30最为常见的模型求解:\\ max\;z = 2x_1 + 3x_2 - 5x_3\\ s.t = \begin{cases} x_1 + x_2 + x_3 = 7\\ 2x_1 - 5x_2 + x_3 \geq 10\\ x_1 + 3x_2 + x_3 \leq 12\\ x_1, x_20, x_3 \geq 0 \end{cases}\\

# 这也是lingo的一大优势
# 代码即模型

model:
	max = 2 * x1 + 3 * x2 - 5 * x3;
	x1 + x2 + x3 = 7;
	2 * x1 - 5 * x2 + x3 >= 10;
	x1 + 3 * x2 + x3 <= 12;
	x1 >= 0;
	x2 >= 0;
	x3 >= 0;
end
p9CWrBq.png
# python下的实现

from scipy import optimize

# * -1, 转换为min
z = [-2, -3, 5]

a = [
    [1, 1, 1],
    # * -1, 转换为小于等于
    [-2, 5, -1],
    [1, 3, 1]
]

b = [
    7, -10, 12
]
x1b = (0, None)
x2b = (0, None)
x3b = (0, None)

optimize.linprog(
    z,
    A_ub=a, b_ub=b,
    bounds=[x1b, x2b, x3b],
    method='revised simplex'
)
model:
max = 2 * x1 + 3 * x2 - 5 * x3;
x1 + x2 + x3 = 7;
2 * x1 - 5 * x2 + x3 >= 10;
x1 + 3 * x2 + x3 <= 12;
x1 >= 0;
x2 >= 0;
x3 >= 0;
@gin(x1);
@gin(x2);
@gin(x3); !增加一个整数的约束;
end

3.1.2 示例2

min=x2+y2+z2s.t={x+y+z=1z=x2+y2min = \sqrt{x^2 + y^ 2 + z^ 2}\\ s.t =\begin{cases} x + y + z = 1\\ z = x^ 2 + y ^ 2 \end{cases}

model:
min=(x^2+y^2+z^2)^(1/2);
x+y+z=1;
z=x^2+y^2;
@free(x); @free(y);
end
from scipy import optimize
import math

# 目标函数
f = lambda args : math.sqrt(sum(arg ** 2 for arg in args))

# 约束条件
cons = (
    {'type': 'eq', 'fun': lambda args: sum(args) - 1},
    {'type': 'eq', 'fun': lambda args: args[0] ** 2 + args[1] ** 2 - args[2]}
)

optimize.minimize(f, (0, 0, 0), constraints=cons)

     fun: 0.5828773135364937
     jac: array([0.62796304, 0.62796304, 0.45970085])
 message: 'Optimization terminated successfully'
    nfev: 20
     nit: 5
    njev: 5
  status: 0
 success: True
       x: array([0.36602541, 0.3660254 , 0.26794919])

3.2 模型

3.2.1 示例1

背包问题

假设存在背包, 最大的载重量为30, 10种不同的商品, 各种商品只存在1, 0两种选择, 即装1件, 或者不装

项目 商品1 商品2 商品3 商品4 商品5 商品6 商品7 商品8 商品9 商品10
利润 540 200 180 350 60 150 280 450 320 120
重量 6 3 4 5 1 2 3 5 4 2
背负状态 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10

如何装载商品实现收益最大化

:max=i=110pixis.t={i=110wixi30xi{0,1},  i=1,2,3...10pi,wi,xi,数学模型简化如下:\\ max = \sum_{i=1}^{10}p_i * x_i\\ s.t = \begin{cases} \sum_{i=1}^{10} w_i* x_i \leq 30\\ x_i \in{\{0, 1\}}, \;i = 1, 2, 3...10 \end{cases}\\ p_i, 为利润\\ w_i, 为重量\\ x_i, 装载与否\\

model:

	sets:
		items/1 2 3 4 5 6 7 8 9 10/: weight, profit, x;
	endsets

	data:
		weight = 6 3 4 5 1 2 3 5 4 2;
		profit = 540 200 180 350 60 150 280 450 320 120;
	enddata

	max = @sum(items(i): profit(i) * x(i));
	@sum(items(i): weight(i) * x(i)) <=30;
	@for(items(i):@bin(x(i)));
end

3.2.2 示例2

某公司有6个建筑工地 位置坐标为(ai, bi), 水泥日用量di

i 1 2 3 4 5 6
a 1.25 8.75 0.5 5.75 3 7.25
b 1.25 0.75 4.75 5 6.5 7.75
d 3 5 4 7 6 11
  • 现有2料场, 位于A (5, 1), B (2, 7),记(x_j, y_j), j=1,2, 日储量e_j各有20吨.
    假设料场和工地之间有直线道路, 制定每天的供应计划, 即从A, B两个料场分别向各工地运送多少吨水泥使总距离最小.
    取决策变量c_ij表示 i 工地从 j 料场运来的水泥量, 模型(线性模型) 如下:

    minj=12i=16cij(xjai)2+(yjbi)2s.t={j=12=di,i=1,2,...6i=16cijeJ,j=1,2min \sum_{j=1}^2\sum_{i=1}^6 c_{ij}\sqrt{(x_j-a_i) ^ 2 + (y_j - b_i) ^ 2}\\ s.t = \begin{cases} \sum_{j=1}^ 2 = d_i, i = 1, 2,...6\\ \sum_{i = 1} ^ 6 c_ij \leq eJ, j = 1, 2 \end{cases}

    model:
    	sets:
    		demand/1..6/:a,b,d;
    		supply/1..2/:x,y,e;
    		link(demand,supply):c;
    	endsets
    	
    	data:
    		a=1.25 8.75 0.5 5.75 3 7.25;
    		b=1.25 0.75 4.75 5 6.5 7.75;
    		d=3 5 4 7 6 11;
    		x=5 2;
    		y=1 7;
    		e=20 20;
    	enddata
    	
    	[obj]min=@sum(link(i,j):c(i,j)*@sqrt((a(i)-x(j))^2+(b(i)-y(j))^2));!目标函数;
    	
    	@for(demand(i):@sum(supply(j):c(i,j))=d(i));
    	@for(supply(j):@sum(demand(i):c(i,j))<=e(j));
    end
    
  • 改建两个新料场 需要确定新料场位置(xj, yj)和运量c_ij 在其它条件不变下使总距离数最小.
    模型还是一样, 未知量变为料场位置(xj, yj) 和运量 c_ij 变为非线性优化问题.

    model:
    	sets:
    		demand/1..6/:a,b,d;
    		supply/1..2/:x,y,e;
    		link(demand,supply):c;
    	endsets
    	
    	data:
    		a=1.25 8.75 0.5 5.75 3 7.25;
    		b=1.25 0.75 4.75 5 6.5 7.75;
    		d=3 5 4 7 6 11;
    		e=20 20;
    	enddata
    	
    	init:
    		x=5 2;
    		y=1 7;
    	endinit
    	
    	[obj]min=@sum(link(i,j):c(i,j)*@sqrt((a(i)-x(j))^2+(b(i)-y(j))^2));!目标函数;
    	
    	@for(demand(i):@sum(supply(j):c(i,j))=d(i));
    	@for(supply(j):@sum(demand(i):c(i,j))<=e(j));
    	@for(supply:@free(x);@free(y));
    end
    

四. 错误对照表

错误代码 含义
0 LINGO模型生成器的内存已经用尽(可用" LINGO|Options"命令对General Solver选项卡中的" Generator Memory Limit"选项进行内存大小的修改)
1 模型中的行数太多(对于有实际意义的模型 这个错误很少出现)
2 模型中的字符数太多(对于有实际意义的模型 这个错误很少出现)
3 模型中某行的字符数太多(每行不应该超过200个字符 否则应换行)
4 指定的行号超出了模型中实际具有的最大行号(这个错误通常在LOOK命令中指定了非法的行号时出现)
5 当前内存中没有模型
6 脚本文件中TAKE命令的嵌套重数太多(LINGO中限定TAKE命令最多嵌套10次)
7 无法打开指定的文件(通常是指定的文件名拼写错误)
8 脚本文件中的错误太多 因此直接返回到命令模式(不再继续处理这个脚本文件)
9 (该错误编号目前没有使用)
10 (该错误编号目前没有使用)
11 模型中的语句出现了语法错误(不符合LINGO语法)
12 模型中的括号不匹配
13 在电子表格文件中找不到指定的单元范围名称
14 运算所需的 临时堆栈空间不够(这通常意味着模型中的表达式太长了)
15 找不到关系运算符(通常是丢了" <" " =" 或" >" )
16 输入输出时不同对象的大小不一样(使用集合循环方式输入输出时 集合大小应相同)
17 集合元素的索引的内存堆栈空间不够
18 集合的内存堆栈空间不够
19 索引函数@INDEX使用不当
20 集合名使用不当
21 属性名使用不当
22 不等式或等式关系太多(例如 约束2<x<4是不允许出现在同一个语句中的)
23 参数个数不符
24 集合名不合法
25 函数@WKX()的参数非法(注: 在LING09.0中已经没有函数@WKX())
26 集合的索引变量的个数不符
27 在电子表格文件中指定的单元范围不连续
28 行名不合法
29 数据段或初始段的数据个数不符
30 链接到Excel时出现错误
31 使用@TEXT函数时参数不合法
32 使用了空的集合成员名
33 使用@OLET函数时参数不合法
34 用电子表格文件中指定的多个单元范围生成派生集合时 单元范围的大小应该一致
35 输出时用到了不可识别的变量名
36 基本集合的元素名不合法
37 集合名已经被使用过
38 ODBC服务返回了错误信息
39 派生集合的分量元素(下标)不再原来的父集合中
40 派生集合的索引元素的个数不符
41 定义派生集合时所使用的基本集合的个数太多(一般不会出现这个错误)
42 集合过滤条件的表达式中出现了取值不固定的变量
43 集合过滤条件的表达式运算出错
44 过滤条件的表达式没有结束(即没有" :" 标志)
45 @ODBC函数的参数列表错误
46 文件名不合法
47 打开的文件太多
48 不能打开文件
49 读文件时发生错误
50 @FOR函数使用不合法
51 编译时LINGO模型生成器的内存不足
52 @IN函数使用不当
53 在电子表格文件中找不到指定的单元范围名称(似乎与出错代码" 13" 含义类似)
54 读取电子表格文件时出现错误
55 @TEXT函数不能打开文件
56 @TEXT函数读文件时发生错误
57 @TEXT函数读文件时出现了非法输入数据
58 @TEXT函数读文件时出现发现输入数据比实际所需要的少
59 @TEXT函数读文件时出现发现输入数据比实际所需要的多
60 用@TEXT函数输入数据时 没有指定文件名
61 行命令拼写错误
62 LINGO生成模型时工作内存不足
63 模型的定义不正确
64 @FOR函数嵌套太多
65 @WARN函数使用不当
66 警告: 固定变量取值不唯一(例如: 任意正数都是约束@SIGN(X)=l的解)
67 模型中非零系数过多导致内存耗尽
68 对字符串进行非法的算术运算
69 约束中的运算符非法
70 属性的下标越界
71 变量定界函数(@GIN @BIN @FREE @BND)使用错误
72 不能从固定约束(只含有固定变量的约束)中求出固定变量的值(相当于方程无解 或者LINGO的算法解不出来 如迭代求解算法不收敛)
73 在LINGO生成模型(对模型进行结构分析)时 用户中断了模型生成过程
74 变量越界 超出了1032
75 对变量的定界相互冲突(例如: 一个模型中同时指定@BND(-6 X 6)和@BND(-5,X 5)是允许的 但同时指定@BND(-6 X 6)和@BND(7 X 9)则是冲突的.)
76 LINGO生成模型时出现错误 不能将模型转交给优化求解程序
77 无定义的算术运算(例如除数为0)
78 (该错误编号目前没有使用)
79 (该错误编号目前没有使用)
80 生成LINGO模型时系统内存已经用尽
81 找不到可行解
82 最优值无界
83 (该错误编号目前没有使用)
84 模型中非零系数过多
85 表达式过于复杂导致堆栈溢出
86 算术运算错误(如1/0或@LOG(-1)等)
87 @IN函数使用不当(似乎与错误代码" 52" 相同)
88 当前内存中没有存放任何解
89 LINGO运行时出现了意想不到的错误(请与LINGO公司联系解决问题)
90 在LINGO生成模型时 用户中断了模型生成过程
91 当在数据段有" 变量=
92 警告: 当前解可能不是可行的/最优的
93 命令行中的转换修饰词错误
94 (该错误编号目前没有使用)
95 模型求解完成前 用户中断了求解过程
96 (该错误编号目前没有使用)
97 用TAKE命令输入模型时 出现了不可识别的语法
98 用TAKE命令输入模型时 出现了语法错误
99 语法错误 缺少变量
100 语法错误 缺少常量
101 (该错误编号目前没有使用)
102 指定的输出变量名不存在
103 (该错误编号目前没有使用)
104 模型还没有被求解 或者模型是空的
105 (该错误编号目前没有使用)
106 行宽的最小最大值分别为68和200
107 函数@POINTER指定的索引值无效
108 模型的规模超出了当前LINGO版本的限制
109 达到了迭代上限 所以LINGO停止继续求解模型(迭代上限可以通过" LING0|0ptions" 命令对General Solver选项卡中的" Iteration" 选项进行修改)
110 HIDE(隐藏)命令指定的密码超出了8个字符的限制
111 模型是隐藏的 所以当前命令不能使用
112 恢复隐藏模型时输入的密码错误
113 因为一行内容太长 导致LOOK或SAVE命令失败
114 HIDE(隐藏)命令指定的两次密码不一致 命令失败
115 参数列表过长
116 文件名(包括路径名)太长
117 无效的命令
118 命令不明确(例如 可能输入的是命令的缩写名 而这一缩写可有多个命令与之对应)
119 命令脚本文件中的错误太多 LINGO放弃对它继续处翠
120 LINGO无法将配置文件(LINGO.CNF)写入启动目录或工作目录(可能是权限问题)
121 整数规划没有敏感性分析
122 敏感性分析选项没有激活 敏感性分析不能进行(可通过" LINGO|Options" 命令对General Solver选项卡中的" Dual Computation" 选项进行修改)
123 调试(Debug)命令只对线性模型 且模型不可行或无界时才能使用
124 对一个空集合的属性进行初始化
125 集合中没有元素
126 使用ODBC连接输出时 发现制定的输出变量名不存在
127 使用ODBC连接输出时 同时输出的变量的维数必须相同
128 使用SET命令时指定的参数索弓I无效
129 使用SET命令时指定的参数的取值无效
130 使用SET命令时指定的参数名无效
131 FREEZE命令无法保存配置文件LINGO.CNF(可能是权限问题)
132 LINGO读配置文件(LINGO.CNF)时发生错误
133 LINGO无法通过OLE连接电子表格文件(如: 当其他人正在编辑这个文件时)
134 输出时出现错误 不能完成所有输出操作
135 求解时间超出了限制(可通过" LING0|0ptions" 命令对General Solver选项卡中的" Time" 选项进行修改)
136 使用@TEXT函数输出时出现错误操作
137 (该错误编号目前没有使用)
138 DIVERT(输出重新定向)命令的嵌套次数太多(最多不能超过10次嵌套)
139 DIVERT(输出重新定向)命令不能打开指定文件
140 只求原始最优解时无法给出敏感性分析信息(可通过" LING0|0ptions" 命令对General Solver选项卡中的" Dual Computation" 选项进行修改)
141 对某行约束的敏感性分析无法进行 因为这一行已经是固定约束(即该约束中所有变量都已经在直接求解程序进行预处理时被固定下来了)
142 出现了意想不到的错误(请与LINDO公司联系解决这个问题)
143 使用接口函数输出时 同时输出的对象的维数必须相同
144 @POINTER函数的参数列表无效
145 @POINTER函数出错: 2-输出变量无效; 3-内存耗尽; 4-只求原始最优解时无法给出敏感性分析信息; 5-对固定行无法给出敏感性分析信息; 6-意想不到的错误.
146 基本集合的元素名与模型中的变量名重名(当前版本的LINGO中这本来是允许的 但如果通过" LING0|0ptions" 命令在" General Solver" 选项卡选择" Check forduplicates names in data and model" 则会检查重名 这主要是为了与以前的LINGO版本兼容)
147 @WARN函数中的条件表达式中只能包含固定变量
148 @OLE函数在当前操作系统下不能使用(只在Windows操作系统下可以使用)
149 (该错误编号目前没有使用)
150 @ODBC函数在当前操作系统下不能使用(只在Windows操作系统下可以使用)
151 @POINTER函数在当前系统下不能使用(只在Windows操作系统下可以使用)
152 输入的命令在当前操作系统下不能使用
153 集合的初始化(定义元素)不能在初始段中进行 只能在集合段或数据段进行
154 集合名只能被定义一次
155 在数据段对集合进行初始化(定义元素)时 必须显示地列出所有元素 不能省略元素
156 在数据段对集合和(或)变量进行初始化时 给出的参数个数不符
157 @INDEX函数引用的集合名不存在
158 当前函数需要集合的成员名作为参数
159 派生集合中的一个成员(分量)不是对应的父集合的成员
160 数据段中的一个语句不能对两个(或更多)的集合进行初始化(定义元素)
161 (该错误编号目前没有使用)
162 电子表格文件中指定的单元范围内存在不同类型的数据(即有字符 又有数值) LINGO无法通过这些单元同时输入(或输出)不同类型的数据
163 在初始段对变量进行初始化时 给出的参数个数不符
164 模型中输入的符号名不符合LINGO的命名规则
165 当前的输出函数不能按集合进行输出
166 不同长度的输出对象无法同时输出到表格型的文件(如数据库和文本文件)
167 在通过Excel进行输入输出时 一次指定了多个单元范围
168 @DUAL @RANGEU @RANGED函数不能对文本数据(如集合的成员名)使用 而只能对变量和约束行使用
169 运行模型时才输入集合成员是不允许的
170 LINGO系统的密码输入错误 请重新输入
171 LINGO系统的密码输入错误 系统将以演示版方式运行
172 LINGO的内部求解程序发生了意想不到的错误(请与LINDO公司联系解决这个问题)
173 内部求解程序发生了数值计算方面的错误
174 LINGO预处理阶段(preprocessing)内存不足
175 系统的虚拟内存不足
176 LINGO后处理阶段(postprocessing)内存不足
177 为集合分配内存时出错(如内存不足等)
178 为集合分配内存时堆栈溢出
179 将MPS格式的模型文件转化成LINGO模型文件时出现错误(如变量名冲突等)
180 将MPS格式的模型文件转化成LINGO模型文件时 不能分配内存(通常是内存不足)
181 将MPS格式的模型文件转化成LINGO模型文件时 不能生成模型(通常是内存不足)
182 将MPS格式的模型文件转化成LINGO模型文件时出现错误(会给出出错的行号)
183 LINGO目前不支持MPS格式的二次规划模型文件
184 敏感性分析选项没有激活 敏感性分析不能进行(可通过" LINGO|Options" 命令对General Solver选项卡中的" Dual Computation" 选项进行修改)
185 没有使用内点法的权限(LINGO中的内点法是选件 需要额外购买)
186 不能用@QRAND函数对集合进行初始化(定义元素)
187 用@QRAND函数对属性进行初始化时 一次只能对一个属性进行处理
188 用@QRAND函数对属性进行初始化时 只能对稠密集合对应的属性进行处理
189 随机函数中指定的种子(SEED)无效
190 用隐式方法定义集合时 定义方式不正确
191 LINDOAPI返回了错误(请与LINDO公司联系解决这个问题)
192 LINGO不再支持@WKX函数 请改用@OLE函数
193 内存中没有当前模型的解(模型可能还没有求解 或者求解错误)
194 无法生成LINGO的内部环境变量(通常是因为内存不足)
195 写文件时出现错误(如磁盘空间不足)
196 无法为当前模型计算对偶解(这个错误非同寻常 欢迎你将这个模型提供给LINDO公司进行进一步分析)
197 调试程序目前不能处理整数规划模型
198 当前二次规划模型不是凸的 不能使用内点法 请通过" LINGO[Options ’命令取消对二次规划的判别
199 求解二次规划需要使用内点法 但您使用的LINGO版本没有这个权限(请通过" LINGO|Options" 命令取消对二次规划的判别)
200 无法为当前模型计算对偶解 请通过" LINGO|Options" 命令取消对对偶计算的要求
201 模型是局部不可行的
202 全局优化时 模型中非线性变量的个数超出了全局优化求解程序的上限
203 无权使用全局优化求解程序
204 无权使用多初始点求解程序
205 模型中的数据不平衡(数量级差异太大)
206 " 线性化" 和" 全局优化" 两个选项不能同时存在
207 缺少左括号
208 @WRITEFOR函数只能在数据段出现
209 @WRITEFOR函数中不允许出现关系运算符
210 @WRITEFOR函数使用不当
211 输出操作中出现了算术运算错误
212 集合的下标越界
213 当前操作参数不应该是文本 但模型中指定的是文本
214 多次对同一个变量初始化
215 @DUAL @RANGEU @RANGED函数不能在此使用(参阅错误代码" 168" )
216 这个函数应该需要输入文本作为参数
217 这个函数应该需要输入数值作为参数
218 这个函数应该需要输入行名或变量名作为参数
219 无法找到指定的行
220 没有定义的文本操作
221 @WRITE或@WRITEFOR函数的参数溢出
222 需要指定行名或变量名
223 向Excel文件中写数据时 动态接收单元超出了限制
224 向Excel文件中写数据时 需要写的数据的个数多于指定的接收单元的个数
225 计算段(CALC)的表达式不正确
226 不存在默认的电子表格文件 请为@OLE函数指定一个电子表格文件
227 为APISET命令指定的参数索引不正确
228 通过Excel输入输出数据时 如果LINGO中的多个对象对应于Excel中的名 则列数应该一致
229 为APISET命令指定的参数类型不正确
230 为APISET命令指定的参数值不正确
231 APISET命令无法完成
232 (该错误编号目前没有使用)
1000 (错误编号为1000以上的信息 只对Windows系统有效)
1001 LINGO找不到与指定括号匹配的括号
1002 当前内存中没有模型 不能求解
1003 LINGO现在正忙 不能马上响应您的请求
1004 LINGO不能写LOG(日志)文件 也许磁盘已满
1005 LINGO不能打开指定的LOG(日志)文件
1006 不能打开文件
1007 没有足够内存完成命令
1008 不能打开新窗口(可能内存不够)
1009 没有足够内存空间生成解答报告
1010 不能打开Excel文件的链接(通常是由于系统资源不足)
1011 LINGO不能完成对图形的请求
1012 LINGO与ODBC连接时出现错误
1013 通过OBDC传递数据时不能完成初始化
1014 向Excel文件传递数据时 指定的参数不够
1015 不能保存文件
1016 Windows环境下不支持Edit命令 请使用File|Open菜单命令
9999 由于出现严重错误 优化求解程序运行失败( 最可能的原因是数学函数出错 如函数@LOG(X-1)当X<=1时就会出现这类错误)

五. 在线文档

六. 参考