目录
1 Lingo编程基础
1.1基本思路
1.2 建模思路
1.3 注意事项
2 整数规划模型求解示例(不使用集合语言)
2.1 问题模型
2.2 lingo源代码:
2.3 结果展示
2.4 小结
3 一个稍大规模的问题求解
3.1 问题描述
3.3 模型分析
3.3.1 定义集合段:使用【sets:】开始,【endsets】结束
3.3.2 定义数据段:使用【data:】开始,【enddata】结束
3.3.3 目标函数的代码
3.3.4 约束条件代码实现
3.3.5 完整代码
3.3.6 结果演示
4 常见错误分析
4.1 错误代码29:数组初始化个数与指定数目不一致
4.2 错误代码12:缺少右括号报错
4.3 错误代码11:无效的输入,语法错误
5 LINGO的错误列表
6 致谢
7 更多推荐
今天老板安排了一个任务,让自己建立一个最经典的CVRP模型,然后用LINGO把建立的模型给求解出来;LINGO只是听说过,从来没有真正使用过,运筹学课程也是混着过来的,怎么办?硬着头皮上呗。
两种编程方法:使用集合语言编程和不使用集合语言编程(笨办法编程)
目标函数:min或max
基本语法:
max = 4*x1 + 3*x2;
2 * x1 + x2 <= 10;
x1 + x2 <= 8;
x2 <= 7;
@gin(x1);
@gin(x2);
得到全局最优解,目标函数值为26
解报告中显示:x1 = 2; x2 = 6
@bin(x) | 要求变量为二进制变量 |
@free(x) | 表示变量为任意实数 |
@bnd(x,1,u) | 要求x取值在(1,u) |
@gin(x) | 变量x只能是整数 |
要求x取值范围为[-5,5]的实数的编码方式为:
@free(x); !规定x为任意实数
@bnd(-5,x,5); !规定x的范围
@gin(x); !限定为整数
3.2 模型建立
(1)确定模型的已知变量和未知变量:模型中除了剩余的变量都是已知变量
(2)确定指标集:;对应的lingo代码为:
!使用集合表示;
sets:
S/1..6/: a, b, d; !变量a_{i}, b_{i}, d_{i};
T/1,2/: e, x; !变量e_{j}, x_{j};
U(S,T): ; !双下标的集合c_{ij};
endsets
!定义数据段;
DATA:
a = 1.25 8.75 0.5 5.75 3 7.25;
B = 1.25 0.75 4.75 5 6.5;
D = 3 5 4 7 6 11;
ENDDATA
编码该公式的Latex代码:min \sum_{j=1}^{2}\sum_{i=1}^{6}c_{ij}\sqrt { (x_j - a_j)^2 +(y_{i} - b_{i} )^2}
编码该公式的Lingo代码:
min = @sum(T(j) : @sum(S(i) : c(i,j) * @sqrt((x(j)- a(j))^2 + (x(i) - y(i))^2) ) );
!代码注释:
j \in T
i \in S
调用函数:@sqrt求平方根,@sum求和;
编码该公式的Latex代码:\sum_{j=1}^2 c_{ij} = d_i; i = 1,2,..,6
编码该公式的Lingo代码:
@for (S(i) : @sum(T(j) : c(i,j) = d(i));
!代码注释:
i \in S
j \in T;
编码该公示的Latex代码:\sum_{i=1}^{6} c_{ij} \leq e_{j}; j = 1,2
编码该约束的Lingo代码:
@for (T(j) : \sum(S(i) : c(i,j) <= e(j) ));
!使用集合表示;
sets:
S/1..6/: a, b, d; !变量a_{i}, b_{i}, d_{i};
T/1,2/: e, x, y; !变量e_{j}, x_{j}, y_{j};
U(S,T): c ; !双下标的集合c_{ij};
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;
ENDDATA
min = @sum(T(j) : @sum(S(i) : c(i,j) * @sqrt((x(j) - a(i))^2 + (y(j) - b(i))^2)));
@for(S(i) : @sum(T(j): c(i,j)) = d(i));
@for(T(j) : @sum(S(i) : c(i,j)) <= e(j));
Global optimal solution found.
Row Slack or Surplus Dual Price |
若提供的数据数目与集合段指定的数据长度不一致,会报如下错误:
意思是说:B变量初始化的个数少于集合段指定的数目;点击Explain按钮可以查询更详细的问题解释
You must assign a value to every element of each array in a DATA or INIT statement. LINGO keeps track of the number of values you specified and checks this against the length of each array being assigned. If the two numbers don’t agree, LINGO prints this message along with the number of values that are required. |
意思是:这样代码缺了一个右括号
A LINGO expression is missing at least one closing right parenthesis. LINGO will point to the end of the expression where the error occurred. Count the number of parentheses in this expression to verify if you have input the correct number, or, in Window use the Edit|Match Parenthesis command to find the unmatched parenthesis. |
模型的【model】关键字没有加【:】
This is the generic error issued by the LINGO compiler when it detects a syntax error. In Windows, when you close the error box, the cursor will be on the line where the error occurred. Other versions of LINGO will try print out the general area where the error has occurred, but LINGO cannot always pinpoint the exact line. Examine this area for any obvious syntax errors. If you are unable to find any obvious errors, a useful technique is to comment out small sections of the model until the error goes away. This should give you a good idea of exactly where the error is occurring. Syntax errors may also occur if you are not invoking the correct compiler in LINGO. Most users will choose to build models using the native LINGO syntax, however, some users may prefer building their models using LINDO syntax. LINGO can compile models written in either native LINGO syntax or LINDO syntax. LINGO chooses the compiler based on a model's file extension. LINGO models must have an extension of lg4 (the default) or lng. LINDO models must have an ltx extension. The default model extension may be set by clicking on: LINGO | Options | Interface | File Format. Each model window's title bar displays whether it is a LINGO or LINDO model. |
LINGO出错时错误代码含义:
在LINGO程序求解时,系统首先会对程序进行编译.系统在编译或执行其他命令时,会因程序中的错误或运行错误,弹出一个出错报告窗口,显示其错误代码,并简要指出错误的原因.这些错误报告信息能够提示用户发现程序中的错误,以便能尽快修改.下面我们给出出错信息的一个简要说明,仅供参考.
LINGO错误编号及原因对照表
错误代码 | 含义 |
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 |
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时就会出现这类错误) |
参考资料1:
视频教程:快速学习Lingo软件及编程方法https://www.bilibili.com/video/av36145650/
完整课程连接:https://mooc1-1.chaoxing.com/course/203774897.html(收费的)
参考资料2:Lingo错误列表汇总
https://blog.csdn.net/JX_Cesare/article/details/81670029
更多精彩欢迎关注个人微信帐号“学而立行”,一个无偿分享、共同进步的公众平台