LINGO教程
Possible states are \(全局最优)\\Optimum(局部最优)\\(可行)\\(不可行)\\(无界)\(中断)\\(不确定)\Objective 目标函数的当前值Current value of the objective function. Infeasibility 约束条件冲突的个数 Iterations
Extended Solver Status Box
Number of solver iterations.(算法的迭代次数) Field Solver Type Description The type of specialized solver in use, and will be either \(分支定界法)\\(全局最优求解法)\or \(多个初始点求解法)\The objective value of the best solution found so far.(目前得到的最优解对应的目标函数值) Best Obj Obj Bound The theoretical bound on the objective.(目标函数值的理论上下界) Steps The number of steps taken by the extended solver.(特殊的几种求解程序运行的步骤数:如分支定界法已求解的分支数,全局最优法已求解的子问题数) The number of active subproblems remaining to be analyzed(有效的步数)。 Active Lingo程序的一些规则:
1. 在Lingo中最开始都是“MAX=”或者“MIN=”开始表示求目标函数的最大或
者最小值。
2. 变量和它前面的系数之间要用“*”连接, 中间可以有空格。 3. 变量名不区分大小写,但必须以字母开始, 不超过32个字符。 4. 数学表达式结束时要用分号“;”表示结束。表达式可以写在多行上,但是
表达式中间不能用分号。
共53页 6
LINGO教程
5. 在电脑系统中一般没有“小于等于”符号,在Lingo采用“<=”来表示“小
于等于”, 用“>=”表示“大于等于”。小于等于也可以用更简单的“<”表示,大于等于用“>”表示。
Lingo模型语言:
例1.2 运输问题
使用LINGO软件计算6个仓库8个销售地的最小费用运输问题。产销单位运价如下表。 单 位 销库地 V1 V2 V3 V4 V5 V6 V7 V8 存运 量 价 产地 WH1 WH2 WH3 WH4 WH5 WH6 需求量 6 4 5 7 2 5 35 2 9 2 6 3 5 37 6 5 1 7 9 2 22 7 3 9 3 5 2 32 4 8 7 9 7 8 41 2 5 4 2 2 1 32 5 8 3 7 6 4 43 9 2 3 1 5 3 38 60 55 51 43 41 52 设VOLUME_i_j为从仓库i运送到销售地j那里的货物量, 那么我们的目标函数可以表示为:
MIN = 6 * VOLUME_1_1 + 2 * VOLUME_1_2 +
6 * VOLUME_1_3 + 7 * VOLUME_1_4 + 4 * VOLUME_1_5 + . . .
8 * VOLUME_6_5 + VOLUME_6_6 + 4 * VOLUME_6_7
+
3 * VOLUME_6_8;
这里我们只列出了48个项中的9项,输入这么多的数据非常麻烦,而且容易出错。而运用Lingo提供的模型语言则可以很容易的来描述这个目标函数,而且很容易扩充模型。
共53页 7
LINGO教程
在数学上可以用数学符号表示目标函数为:
Minimize Σij COST ij ? VOLUME ij
运用Lingo模型语言来描述上面的目标函数,这样的描述简短,容易输入,容易读,更容易理解。
MIN = @SUM( LINKS(I,J): COST(I,J) * VOLUME(I,J));
也就是说,在仓库和销售地之间的所有可能运送调价下求运送总运费最小。
下面比较一些数学表述和Lingos的语法 Math Notation Minimize Σij COST ij ? VOLUME ij
接下来看约束条件: 在模型里有两类约束,第一类是销售地要得到需要的货物量,我们称这类约束为需求约束。第二类称为容量限制,每个仓库运出的货物量不能大于它的库存量。
先考虑第一个销售地的约束,
VOLUME_1_1 + VOLUME_2_1 + VOLUME_3_1 +VOLUME_4_1 + VOLUME_5_1 +VOLUME_6_1 = 35;
剩下还要输入7个类似的约束。
用运用数学符号表述这个约束:
Σi VOLUMEij = DEMANDj, 对每个销售地j成立。 对应的Lingo模型语言描述是: @FOR( VENDORS( J):
@SUM( WAREHOUSES( I): VOLUME( I, J)) = DEMAND( J));
比较一些数学符号和Lingo语法 Math Notation LINGO Syntax 对于每个销售地@FOR( VENDORS( J): j 共53页 8
LINGO Syntax MIN = @SUM( LINKS( I, J): ) COST(I,J) * VOLUME(I,J) LINGO教程
Σi VOLUME ij = DEMAND j @SUM( WAREHOUSES( I): VOLUME( I, J)) = DEMAND( J));
类似的仓库的容量限制用Lingo语言描述为: @FOR( WAREHOUSES( I):
@SUM( VENDORS( J): VOLUME( I, J))<= CAPACITY( I));
目前我们得到下面的Lingo模型:
MODEL:
MIN = @SUM( LINKS( I, J):
COST( I, J) * VOLUME( I, J)); @FOR( VENDORS( J):
@SUM( WAREHOUSES( I): VOLUME( I, J)) = DEMAND( J));
@FOR( WAREHOUSES( I):
@SUM( VENDORS( J): VOLUME( I, J)) <= CAPACITY( I)); End
但是我们还要定义一些变量。
集合段:
在我们已经得到的程序里有一些量没有定义,如WAREHOUSES( I),DEMAND( J), LINKS( I, J)。这些量将在Lingo中的集合段定义。
集合段以SETS:表示开始,以ENDSETS表示结束。
如果一个集合的元素都已经定义过,就可以用一些循环函数(如@for).
上面的三个集合在Lingo的集合段定义为:
SETS:
WAREHOUSES: CAPACITY; VENDORS: DEMAND;
LINKS(WAREHOUSES, VENDORS): COST, VOLUME; ENDSETS
WAREHOUSES: CAPACITY;这一句表示在集合WAREHOUSES上有一个属性
共53页 9
LINGO教程
CAPACITY,即每个仓库都有一个容量属性。
VENDORS: DEMAND;这一句表示在集合VENDORS上有一个DEMAND的属性,即每个销售地有一个货物需求量的属性。
LINKS( WAREHOUSES, VENDORS): COST, VOLUME;这个集合表示的是运送网络的关系,而每个关系有COST 和VOLUME的属性,即单位运货量的运费和运量的属性。
第三个集合Link的定义和前两个不同,他们是由前两个派生出来的,是前面连个集合的笛卡尔积。 注:1. 集合的属性相当于以集合的元素为下标的数组。Lingo中没有数组的概念,只有定义在集合上的属性的概念。
2 集合的定义语法:
set_name[/set_member/:][attribute_list];
集合的名称在左边,右边是这个集合上的属性,他们之间用冒号“:”分割开,最后由分号表示结束。如果在同一个集合上有多个属性时,不同的属性之间用逗号“,”隔开,如本例的cost和volume属性。 如果要特别列出集合的元素时,在集合的名称后把元素写在两条斜线之间,如本例中的仓库可以写为
WAREHOUSES/WH1, WH2, WH3, WH4, WH5, WH6/: CAPACITY;
也可以写为WAREHOUSES/WH1..WH6/: CAPACITY; Lingo会自动生成需要的集合元素。
集合段的具体定义在后面详述。
数据段:
数据段以DATA:开始,以ENDDATA表示数据段结束。
DATA:
!attribute values;
CAPACITY = 60 55 51 43 41 52;
DEMAND = 35 37 22 32 41 32 43 38; COST = 6 2 6 7 4 2 5 9 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3; ENDDATA
共53页 10