LINGO软件简介

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LINGO 软件简介

LINGO 软件是一个处理优化问题的专门软件,它尤其擅长求解线性规划、非线性规划、整数规划等问题。

一个简单示例

有如下一个混合非线性规划问题:

⎪⎩⎪⎨⎧≥≤≤+++---+为整数

213

212

13213

2

2212121,;0,,210022..15023.027798max x x x x x x x x x x t s x x x x x x x 。

LINGO 程序(模型): max =98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2+150*x3;

x1+2*x2+2*x3<=100; x1<=2*x2;

@gin (x1);@gin (x2);! Lingo 默认变量非负

(注意:@bin(x)表示x 是0-1变量;@gin(x)表示x 是整数变量;@bnd(L,x,U)表示

限制L ≤x ≤U ;@free(x)表示取消对x 的符号限制,即可正、可负。)

结果:

Global optimal solution found.

Objective value: 9561.200 Extended solver steps: 0 Total solver iterations: 45

Variable Value Reduced Cost X1 6.000000 -76.70000 X2 31.00000 -151.2000 X3 16.00000 -150.0000

Row Slack or Surplus Dual Price 1 9561.200 1.000000 2 0.000000 0.000000 3 56.00000 0.000000

———————— 非常简单!

在LINGO 中使用集合

为了方便地表示大规模的规划问题,减少模型、数据表示的复杂程度,LINGO 引进了“集合”的用法,实现了变量、系数的数组化(下标)表示。

例如:对⎪⎪

⎪⎪⎨

==-++-==≤++∑=.,,;10)0(;4,3,2,1),()())()1()(;4,3,2,1,20)(..)}

(20)(450)(400{min

4

,3,2,1均非负INV OP RP INV I I DEM I OP I RP I INV I INV I I RP t s I INV I OP I RP I

求解程序:

model :

sets :

mark/1,2,3,4/:dem,rp,op,inv;!也可以vmark/1..4/:dem,rp,op,inv;

endsets

min =@sum (mark:400*rp+450*op+20*inv);!也可以mark(I):400*rp(I)+450*op(I)+20*inv(I); @for (mark(I): rp(I)<40);

@for (mark(I)|I#gt#1: inv(I)=inv(I-1)+rp(I)+op(I)-dem(I)); inv(1)=10+rp(1)+op(1)-dem(1); data :

dem=40,60,75,35;

enddata

end

上面程序在model …end 之间有(1)集合定义、(2)数据输入和(3)其他三部分内容。 集合定义部分(从sets :到endsets ):定义了一个指标集合mark (可以理解为数组下标及其范围)和其4个属性dem 、rp 、op 、inv (用此向量的数组变量)。 数据输入部分(从data :到enddata )依次给出常量(dem )的值。 其他部分:给出优化目标及约束。 一般而言,LINGO 中建立优化模型的程序可以由五部分组成,或称为五段(section ): (1)集合段(SETS ):这部分以“SETS :”开始,以“ENDSETS ”结束,作用在于定义必要的集合变量(SET )及其元素(member ,含义类似于数组的下标)和属性(attribute ,含义类似于数组)。 (2)目标与约束段:这部分实际上定义了目标函数、约束条件等,但这部分没有段的开始和结束标记;该段一般常用到LINGO 内部函数,尤其是和集合相关的求和函数@SUM 和循环函数@FOR 等。 (3)数据段(DATA ):这部分以“DATA :”开始,以“ENDDA TA ”结束,作用在于对集合的属性(数组)输入必要的常数数据。格式为: attribute(属性)=value_list(常数列表);

常数列表中的数据之间可以用逗号、空格或回车符分隔。如果想要在运行时才对参数赋值,可以在数据段使用输入语句,其格式为“变量名=?;”,但仅限对单个变量赋值,而不能用于属性变量(数组)的单个元素。 (4)初始段(INIT ):这部分以“INIT :”开始,以“ENDINIT ”结束,作用在于对集合的属性(数组)定义初值(因为求解算法一般是迭代算法,提供一个较好的初值,能提高计算效果)。定义初值的语句格式为: attribute(属性)=value_list(常数列表); 这与数据段中的用法类似。

(5)计算段(CALC ):这部分以“CALC :”开始,以“ENDCALC ”结束,作用在于对一些原始数据进行预处理加工,使其成为模型直接需要的数据。该段中通常是计算赋值语句。

基本集合与派生集合

为了处理二维数组变量等有多个下标的问题,LINGO 引入了“派生集”的概念。我们把直接列出元素的指标集合叫“基本集合”,而基于其他集合派生出来的二维或多维指标集合称为“派生集”。派生集的定义格式为: 派生集名(原始集合1,原始集合2,…,原始集合n ):属性变量列表;

实际上就是笛卡儿积的意思,即:派生集={(i 1,i 2,…i n )| i 1∈集合1, i 2∈集合2,…, i n ∈集合n}。

1)一个应用例子(布局问题):某些建筑工地的位置(用平面坐标a,b 表示)及水泥日用量d 已知。现有A 、B 两临时料场位于P (5,1)、Q (2,7),日储量20。问A 、B 两料场分别向各工地运输多少吨水泥,使总吨公里数最小?若重新安排两料场的位置,应怎样安排才能使总吨公里数最小?这样安排可节省多少吨公里?

i i i i i j 从料场j 向工地i 运送量为cij 。该问题的数学模型为:

⎪⎪⎩⎪⎪⎨⎧=≤==-+-=∑∑∑∑====.2,1,6,...,1,..)()(min

6

1

2

1216

1

2

2j e c i d c t s b y a x c f j i ij j i ij j i i j i j ij

LINGO 求解程序为:

MODEL : sets :

Imark/1..6/:a,b,d; Jmark/1,2/:x,y,e; IJmark(Imark,Jmark):c; endsets data :

!Location for demand(需求点位置);

a=1.25,8.75,0.5,5.75,3,7.25; b=1.25,0.75,4.75,5,6.5,7.75;

!Quantities of the demand and supply(供需量); d=3,5,4,7,6,11;e=20,20; enddata init :

!Initial location for the supply(初始点); x,y=5,1,2,7;

相关文档
最新文档