《LINGO的基本用法2》由会员分享,可在线阅读,更多相关《LINGO的基本用法2(11页珍藏版)》请在金锄头文库上搜索。
1、LINGOLINGO 的基本用法的基本用法 我们遇到的许多优化问题都可以归结为规划问题,如线性规划、非线性规划、二次规划、 整数规划、动态规划、多目标规划等,当遇到变量比较多或者约束条件比较复杂情况时,想用 手工计算来求解这类问题几乎是不可能的,编程计算虽然可行,但工作量大、程序长而繁琐, 稍不小心就会出错.可行的办法是利用现成的软件求解,LINGO 是专门用来求解各种规划问题的 软件包,其功能十分强大,是求解优化模型的最佳选择. 1.1LINGO 入门 1.1.1 概况 LINGO 是美国 LINDO 系统公司开发的求解数学线性规划系列软件中的一个,它主要功能是求 解大型线性、非线性和整数规
2、划问题. LINGO 的主要功能特色为: (1) 既能求解线性规划问题,也有较强的求解非线性规划问题的能力; (2) 输入模型简练直观; (3) 运行速度快、计算能力强; (4) 内置建模语言,提供几十个内部函数,从而能以较少语句,较直观的方式描述较大规 模的优化模型; (5) 将集合的概念引入编程语言,很容易将实际问题转换为 LINGO 模型; (6) 能方便地与 Excel、数据库等其它软件交换数据. 1.1.2 LINGO 的基本用法 启动 LINGO 后,在主窗口上弹出标题为“LINGO Model-LINGO1”的窗口,称为模型窗口 (通常称为 LINGO 程序为“模型” ) ,如图
3、 1.1.1 所示,用于输入模型,可以在该窗口内用基本 类似于数学公式的形式输入小型规划模型.通常,一个优化模型由以下三部分所组成: (1) 目标函数.一般表示成求某个数学表达式的最大值或最小值. (2) 决策变量.目标函数值取决于哪些变量. (3) 约束条件.对变量附加一些条件限制(通常用等式或不等式表示).例例 1.1.11.1.1 某工厂有两条生产线,分别用来生产 M 和 P 两种型号的产品,利润分别为 200 元 /个和 300 元/个,生产线的最大生产能力分别为每日 100 和 120,生产线每生产一个 M 产品需要 1 个劳动日(1 个工人工作 8 小时称为 1 个劳动日)进行调试
4、、检测等工作,而每个 P 产品需要2 个劳动日,该厂工人每天共计能提供 160 劳动日,假如原材料等其它条件不受限制,问应如何 安排生产计划,才能使获得的利润最大?解解 设两种产品的生产量分别为,则该问题的数学模型为12,x x目标函数 .12max z200300xx约束条件 (1.1.1)1212100,120,2160,0,1,2.jxxxxxj 在 Model 窗口输入如下模型:MAX=200*X1+300*X2; X1=”不等式,左边减右边的差值称为 Surplus(剩余),当约束条件的左右两边相等时,松弛或剩余的值为零,如果约束条件无法满 足,即没有可行解,则松弛或剩余的值为负.“
5、Dual Price”的意思是影子价格,上面报告中 Row 2 的松弛值为 0,意思是说第二行的约束条件,即第一条生产线最大生产能力已达到饱和状 态(100 个),影子价格为 50,含义是:如果该生产线最大生产能力增加 1,能使目标函数值, 即利润增加 50;报告中 Row 3 的松弛值为 90,表示按照最优解安排生产(X2=30),则第三行 的约束条件,即第二条生产线的最大生产能力 120 剩余了 90,因此增加该生产线的最大生产能 力对目标函数的最优值不起作用,故影子价格为 0; 以上结果可以保存到文件中(扩展名为.lgr). 例例 1.1.21.1.2 基金的优化使用(2001 年建模数
6、学竟赛 C 题). 假设某校基金会得到了一笔数额为 M 万元的基金,打算将其存入银行,校基金会计划在 年内每年用部分本息奖励优秀师生,要求每年的奖金额相同,且在年仍保留原基金数额.银nn 行存款税后年利率见表 1.1.2. 表 1.1.2 银行存款税后利率表存期1 年2 年3 年5 年税后年利率%1.82.162.5922.88校基金会获得最佳的基金使用计划,以提高每年的奖金额,请在万元、年的情5000M 5n 况下设计具体存款方案. 1.2 用 LINGO 编程语言建立模型 1.1 节介绍了 LINGO 的基本用法,其优点是输入模型较直观,一般的数学表达式无须作大的 变换即可直接输入.对于规
7、模较少的规划模型,用直接输入方式是有利的,但是,如果模型的变 量和约束条件个数都比较多,若仍然用直接输入方式,虽然也能求解并得出结果,但是这种做 法有明显不足之处:模型的编幅很长,不便于分析修改和扩展,例如,目标函数中有求和表达式,若直接输入的方式,将有 200 个和 200 个相乘再相加.102011ijij ijc xijcijx1.2.1 LINGO 模型的基本组成 LINGO 建模语言引入了集合的概念,为建立大规模数学规划模型提供了方便.用 LINGO 语言 编写程序来表达一个实际优化问题,称为 LINGO 模型. 例 1.2.1 某公司有 6 个供货栈(仓库) ,现有 8 个客户各要
8、一批货,各供货栈到 8 个客户处的单位货物运输价见表 1.2.1. 表 1.2.1 供货栈到客户的单位货物运输价(元/每单位)及需求量V1V2V3V4V5V6V7V8库存W16267425960W24953858255W35219743351W47673927143W52395726541W65522814352 需求量3537223241324338 试确定各货栈到各客户处的货物调运数量,使总的运输费最小.解 引入决策变量,表示从第 个货栈到第个客户的货物运量.用符号表示从第 个ijxijijci货栈到第个客户的单位货物运价,表示第 个货栈的最大供货量,表示第个客户的需jiaijdj求量.
9、则本问题的数学模型为:,6811min ijij ijzc x(1.2.1)8161,1,2,6. .,1,2,80,1,2,6,1,2,8iji jijj iijxa istxdjxij 1.集合定义部分 LINGO 将集合(SET)的概念引入建模语言,集合是一组相关对象构成的组合,代表模型中的 实际事物,并与数学变量及常量联系起来,是实际问题到数学的抽象.例 1.2.1 中的 6 个仓库可 以看成是一个集合,8 个客户可以看成另一个集合. 每个集合在使用之前需要预先给出定义,定义集合时要明确三方面内容:集合的名称、集 合内的成员(组成集合的个体,也称元素) 、集合的属性(可以看成是与该集合
10、有关的变量或常 量,相关于数组). 定义仓库集合:WH/w1.w6/:AI; 其中 WH 是集合的名称,w1.w6 是集合内成员, “.”是特定的省略号(如果不用该省略号, 也可以把成员一一列举出来,成员之间用逗号或空格分开) ,表明该集合有 6 个成员,分别对应 6 个货栈,AI 是集合的属性,它可以看成一个一维数组,有 6 个分量,分别表示各货栈现有货 物的总数.客户货栈集合、成员、属性的命名规则与变量相同,可按自己的意愿,用有一定意义的字母数字串 来表示,式中“/”和“/:”是规定的语法规则. 定义客户集合:VD/v1.v8/:DJ; 该集合有 8 个成员,DJ 是集合的属性(有 8 个
11、分量)表示各客户的需求量. 定义表示运输关系(路线)的集合:LINKS(WH,VD):C,X; 该集合以初始集合 WH 和 DJ 为基础,称为衍生集合(或称派生集合) ,C 和 X 是该衍生集合 的两个属性.衍生集合的定义语句有如下要素组成: (1) 集合的名称; (2) 对应的初始集合; (3) 集合的成员(可以省略不写明) ; (4) 集合的属性(可以没有). 定义衍生集合时可以用罗列的方式将衍生集合的成员一一列举出来,如果省略不写,则默 认衍生集合的成员取它的所对应初始集合的所有可能的组合,上述衍生集合 LINKS 的定义中没 有指明成员,而它对应的初始集合 WH 有 6 个成员,VD
12、有 8 个成员,因此 LINKS 成员取 WH 和 VD 的所有可能组合,即集合 LINKS 有 48 个成员,48 个成员可以排列成一个矩阵,其行数与集合 WH 的成员个数相等,列数与集合 VD 的成员个数相等.相应地,集合 LINKS 的属性 C 和 X 都相当于二维数组,各有 48 个分量,C 表示货栈到客户的单位货物运价,X 表示货栈到客户iwjviw的货物运量.jv本模型完整的集合定义为:SETS: WH/W1.W6/:AI; VD/V1.V8/:DJ; LINKS(WH,VD):C:X; ENDSETS 注 集合定义部分以语句 SETS:开始,以语句 ENDSETS 结束,这两个语
13、句必须单独成一行. ENDSETS 后面不加标点符号. 2.数据初始化(数据段) LINGO 建模语言通过对数据初始化部分来实现对已知属性赋以初始值,格式为: DATA: AI=60,55,51,43,41,52; DJ=35,37,22,32,41,32,43,38; C=6,2,6,7,4,2,5,94,9,5,3,8,5,8,25,2,1,9,7,4,3,37,6,7,3,9,2,7,12,3,9,5,7,2,6,55,5,2,2,8,1,4,3; ENDDATA3.目标函数和约束条件目标函数表达式 用 LINGO 语句表示为:6811min ijij ijzc xMIN=SUM(LIN
14、KS(I,J):C(I,J)*X(I,J);式中,SUM 是 LINGO 提供的内部函数,其作用是对某个集合的所有成员,求指定表达式的和, 该函数需要两个参数,第一个参数是集合名称,指定对该集合所有成员求和,如果此集合是一个初始集合,它有个成员,则求和运算对这个成员进行,相当于求,第二参数是一个mm1mi表达式,表示求和运算对该表达式进行.此处SUM 的第一个参数是 LINKS(I,J),表示求和运 算对衍生集合 LINKS 进行,该集合的维数是 2,共有 48 个成员,运算规则是:选对 48 个成员分别求表达式 C(I,J)*X(I,J)的值,然后求和,相当于求,表达式中的 C 和 X 是6
15、811ijij ijc x集合 LINKS 的两个属性,它们各有 48 个分量. 注 如果表达式中参与运算的属性属于同一个集合,则SUM 语句中索引(相当于矩阵或数 组的下标)可以省略,假如表达式中参与运算的属性属于不同的集合,则不能省略属性的索引. 本例的目标函数可以表示成: MIN=SUM(LINKS:C*X);约束条件实际上表示了 6 个不等式,用 LINGO 语言表示该约束条81,1,2,6iji jxa i件,语句为: FOR(WH(I):SUM(VD(J):X(I,J)= LINGO 中没有单独的“”关系. 1.3.2 LINGO 函数 1.数学函数 abs(x)返回 x 的绝对值
16、 sin(x)返回 x 的正弦值,x 采用弧度制 cos(x)返回 x 的余弦值 tan(x)返回 x 的正切值 exp(x)返回常数 e 的 x 次方 log(x)返回 x 的自然对数 lgm(x)返回 x 的 gamma 函数的自然对数 sign(x)如果 x=0 时,返回不超过 x 的最大整数;当 x0 时,返回不低于 x 的最大整数 smax(x1,x2,xn)返回 x1,x2,xn 中的最大值 smin(x1,x2,xn)返回 x1,x2,xn 中的最小值 MOD(X,Y)返回 X 除以 Y 的余数(X 和 Y 都是整数) POW(X,Y)返回 X 的 y 次方.可用 XY 代替 SQR(X)返回 X 的平方值.可用 X2 代替 SQRT(X)返回 X 的正的平方根