您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > LINGO的基本用法2
LINGO的基本用法我们遇到的许多优化问题都可以归结为规划问题,如线性规划、非线性规划、二次规划、整数规划、动态规划、多目标规划等,当遇到变量比较多或者约束条件比较复杂情况时,想用手工计算来求解这类问题几乎是不可能的,编程计算虽然可行,但工作量大、程序长而繁琐,稍不小心就会出错.可行的办法是利用现成的软件求解,LINGO是专门用来求解各种规划问题的软件包,其功能十分强大,是求解优化模型的最佳选择.1.1LINGO入门1.1.1概况LINGO是美国LINDO系统公司开发的求解数学线性规划系列软件中的一个,它主要功能是求解大型线性、非线性和整数规划问题.LINGO的主要功能特色为:(1)既能求解线性规划问题,也有较强的求解非线性规划问题的能力;(2)输入模型简练直观;(3)运行速度快、计算能力强;(4)内置建模语言,提供几十个内部函数,从而能以较少语句,较直观的方式描述较大规模的优化模型;(5)将集合的概念引入编程语言,很容易将实际问题转换为LINGO模型;(6)能方便地与Excel、数据库等其它软件交换数据.1.1.2LINGO的基本用法启动LINGO后,在主窗口上弹出标题为“LINGOModel-LINGO1”的窗口,称为模型窗口(通常称为LINGO程序为“模型”),如图1.1.1所示,用于输入模型,可以在该窗口内用基本类似于数学公式的形式输入小型规划模型.通常,一个优化模型由以下三部分所组成:(1)目标函数.一般表示成求某个数学表达式的最大值或最小值.(2)决策变量.目标函数值取决于哪些变量.(3)约束条件.对变量附加一些条件限制(通常用等式或不等式表示).例1.1.1某工厂有两条生产线,分别用来生产M和P两种型号的产品,利润分别为200元/个和300元/个,生产线的最大生产能力分别为每日100和120,生产线每生产一个M产品需要1个劳动日(1个工人工作8小时称为1个劳动日)进行调试、检测等工作,而每个P产品需要2个劳动日,该厂工人每天共计能提供160劳动日,假如原材料等其它条件不受限制,问应如何安排生产计划,才能使获得的利润最大?解设两种产品的生产量分别为12,xx,则该问题的数学模型为目标函数12maxz200300xx.约束条件1212100,120,2160,0,1,2.jxxxxxj(1.1.1)在Model窗口输入如下模型:MAX=200*X1+300*X2;X1=100;X2=120;X1+2*X2=160;注LINGO默认所有决策变量都是非负,因而变量非负条件可以不必输入.选菜单File|SaveAs(或按F5)将模型存盘,默认文件格式的扩展名为.lg4.选菜单File|Print(或按F7)可以在打印机上输出该模型.LINGO的语法规定:(1)求目标函数的最大值或最小值分别用MAX=…或MIN=…来表示;(2)每个语句必须以分号“;”结束,每行可以有多个语句,语句可以跨行;(3)变量名称必须以字母(A~Z)开头,由字母、数字和下划线所组成,长度不超过32个字符,不区分大小写;(4)可以给语句加上标号,例如[OBJ]MAX=200*X1+300*X2;(5)以!开头,以“;”号结束的语句是注释语句;(6)如果对变量的取值范围没有作特殊说明,则默认所有决策变量都非负;(7)LINGO模型以语句“MODEL:”开头,以“END”结束,对于比较简单的模型,这两个语句可以心省略.选菜单LINGO|Solve(或按Ctrl+S),或用鼠标点击“求解”按钮,如果模型有语法错误,则弹出一个标题为“LINGOErrorMessage”(错误信息)的窗口,指出在哪一行,有怎样的错误,每种错误都有一个编号.如果语法通过,LINGO用内部所带的求解程序求出模型的解,然后弹出一个标题为“LINGOSolverStatus”(求解状态)的窗口,其内容为变量个数、约束条件个数、优化状态、非零变量个数、耗费内存、所花时间等信息,点击Close关闭该窗口,屏幕上出现标题为“SolutionReport”(解的报告)的信息窗口,显示优化计算的步数、优化后的目标函数值、列出各变量的计算结果,本例的具体内容如下:Globaloptimalsolutionfound.Objectivevalue:29000.00Totalsolveriterations:0VariableValueReducedCostX1100.00000.000000X230.000000.000000RowSlackorSurplusDualPrice129000.001.00000020.00000050.00000390.000000.00000040.000000150.0000该报告说明:目标函数值为29000,变量值分别为X1=100,X2=30.“ReducedCost”的含义是缩减成本系数(最优解中变量的ReducedCost值自动取零),“Row”是输入模型中的行号,“SlackorSurplus”的意思为松弛或剩余,即约束条件左边与右边的差值,对于“=”不等式,右边减左边的差值称为Slack(松弛),对于“=”不等式,左边减右边的差值称为Surplus(剩余),当约束条件的左右两边相等时,松弛或剩余的值为零,如果约束条件无法满足,即没有可行解,则松弛或剩余的值为负.“DualPrice”的意思是影子价格,上面报告中Row2的松弛值为0,意思是说第二行的约束条件,即第一条生产线最大生产能力已达到饱和状态(100个),影子价格为50,含义是:如果该生产线最大生产能力增加1,能使目标函数值,即利润增加50;报告中Row3的松弛值为90,表示按照最优解安排生产(X2=30),则第三行的约束条件,即第二条生产线的最大生产能力120剩余了90,因此增加该生产线的最大生产能力对目标函数的最优值不起作用,故影子价格为0;以上结果可以保存到文件中(扩展名为.lgr).例1.1.2基金的优化使用(2001年建模数学竟赛C题).假设某校基金会得到了一笔数额为M万元的基金,打算将其存入银行,校基金会计划在n年内每年用部分本息奖励优秀师生,要求每年的奖金额相同,且在n年仍保留原基金数额.银行存款税后年利率见表1.1.2.表1.1.2银行存款税后利率表存期1年2年3年5年税后年利率%1.82.162.5922.88校基金会获得最佳的基金使用计划,以提高每年的奖金额,请在5000M万元、5n年的情况下设计具体存款方案.1.2用LINGO编程语言建立模型1.1节介绍了LINGO的基本用法,其优点是输入模型较直观,一般的数学表达式无须作大的变换即可直接输入.对于规模较少的规划模型,用直接输入方式是有利的,但是,如果模型的变量和约束条件个数都比较多,若仍然用直接输入方式,虽然也能求解并得出结果,但是这种做法有明显不足之处:模型的编幅很长,不便于分析修改和扩展,例如,目标函数中有求和表达式102011ijijijcx,若直接输入的方式,将有200个ijc和200个ijx相乘再相加.1.2.1LINGO模型的基本组成LINGO建模语言引入了集合的概念,为建立大规模数学规划模型提供了方便.用LINGO语言编写程序来表达一个实际优化问题,称为LINGO模型.例1.2.1某公司有6个供货栈(仓库),现有8个客户各要一批货,各供货栈到8个客户处的单位货物运输价见表1.2.1.表1.2.1供货栈到客户的单位货物运输价(元/每单位)及需求量V1V2V3V4V5V6V7V8库存W16267425960W24953858255W35219743351W47673927143W52395726541W65522814352需求量3537223241324338试确定各货栈到各客户处的货物调运数量,使总的运输费最小.解引入决策变量ijx,表示从第i个货栈到第j个客户的货物运量.用符号ijc表示从第i个货栈到第j个客户的单位货物运价,ia表示第i个货栈的最大供货量,jd表示第j个客户的需求量.则本问题的数学模型为:6811minijijijzcx,8161,1,2,,6..,1,2,,80,1,2,,6,1,2,,8ijijijjiijxaistxdjxij(1.2.1)1.集合定义部分LINGO将集合(SET)的概念引入建模语言,集合是一组相关对象构成的组合,代表模型中的实际事物,并与数学变量及常量联系起来,是实际问题到数学的抽象.例1.2.1中的6个仓库可以看成是一个集合,8个客户可以看成另一个集合.每个集合在使用之前需要预先给出定义,定义集合时要明确三方面内容:集合的名称、集合内的成员(组成集合的个体,也称元素)、集合的属性(可以看成是与该集合有关的变量或常量,相关于数组).定义仓库集合:WH/w1..w6/:AI;其中WH是集合的名称,w1..w6是集合内成员,“..”是特定的省略号(如果不用该省略号,也可以把成员一一列举出来,成员之间用逗号或空格分开),表明该集合有6个成员,分别对应6个货栈,AI是集合的属性,它可以看成一个一维数组,有6个分量,分别表示各货栈现有货物的总数.客户货栈集合、成员、属性的命名规则与变量相同,可按自己的意愿,用有一定意义的字母数字串来表示,式中“/”和“/:”是规定的语法规则.定义客户集合:VD/v1..v8/:DJ;该集合有8个成员,DJ是集合的属性(有8个分量)表示各客户的需求量.定义表示运输关系(路线)的集合:LINKS(WH,VD):C,X;该集合以初始集合WH和DJ为基础,称为衍生集合(或称派生集合),C和X是该衍生集合的两个属性.衍生集合的定义语句有如下要素组成:(1)集合的名称;(2)对应的初始集合;(3)集合的成员(可以省略不写明);(4)集合的属性(可以没有).定义衍生集合时可以用罗列的方式将衍生集合的成员一一列举出来,如果省略不写,则默认衍生集合的成员取它的所对应初始集合的所有可能的组合,上述衍生集合LINKS的定义中没有指明成员,而它对应的初始集合WH有6个成员,VD有8个成员,因此LINKS成员取WH和VD的所有可能组合,即集合LINKS有48个成员,48个成员可以排列成一个矩阵,其行数与集合WH的成员个数相等,列数与集合VD的成员个数相等.相应地,集合LINKS的属性C和X都相当于二维数组,各有48个分量,C表示货栈iw到客户jv的单位货物运价,X表示货栈iw到客户jv的货物运量.本模型完整的集合定义为:SETS:WH/W1..W6/:AI;VD/V1..V8/:DJ;LINKS(WH,VD):C:X;ENDSETS注集合定义部分以语句SETS:开始,以语句ENDSETS结束,这两个语句必须单独成一行.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.目标函数和约束条件目标函数表达式6811minijijijzcx用LINGO语句表示为:MIN=@SUM(LINKS(I,J):C(I,J)*X(I,J));式中,@SUM是LINGO提供的内部函数,其作用是对某个集合的所有成员,求指定表达式的和,该函数需要两个参数,第一个参数是集合名称,指定对该集合所有成员求和,如果此集合是一个初始集合,它有m个成员,则求和运算对这m个成员进行,相当于求1mi,第二参数是一个表达式,表示求和运算对该表达式进行.此处@SUM的第一个参数是LINKS(I,J),表示求和运算对衍生集合LINKS进行,该集合的维数是2,共有48个成员,运算规则是:选对48个成员分别
本文标题:LINGO的基本用法2
链接地址:https://www.777doc.com/doc-8140392 .html