您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 解非线性规划软件lingo的学习
1LINGO8.0forWindows软件及应用前言运筹学,即最优化理论,或在有的领域被称为管理科学,是近几十年发展和形成的一门新兴的应用性学科。她主要解决最优生产计划、最优分配、最优设计、最优决策、最佳管理等最优化问题。主要研究方法是定量化、系统化和模型化方法,特别是运用各种数学模型和技术来解决问题。我们遇到的实际问题一般规模都较大,即使建立了模型,找到了解的方法,对于庞大的计算量也是望而却步。“工欲善其事,必先利其器”,手中有一个方便的求解最优化问题的工具就显得很重要。LINGO系列优化软件包就给我们提供了理想的选择。LINGO是一个利用线性规划和非线性规划来简洁地阐述、解决和分析复杂问题的简便工具。其特点是程序执行速度很快,易于输入、修改、求解和分析一个数学规划问题,因此LINGO在教育、科研和工业界得到了广泛应用。教学版和发行版的主要区别在于对优化问题的规模(变量和约束的个数)有不同的限制。LINGO软件包有多种版本,但其软件内核和使用方法类似。详细情况可上网访问LINGO软件网站:的资料市面上非常少,即使有也仅是一个附录,为此编写了本教程。学完本书后,应该能够运用LINGO8.0建模语言表述实际问题,能够设置算法的基本选项,正确理解求解过程所显示的状态,最后能正确解读输出结果。作为一门建模语言,它非常灵活,不是本书所能完全包含的,“熟能生出百巧来”,只有用的多了才能掌握LINGO的强大功能。2目录§1LINGO快速入门§2LINGO中的集2.1为什么使用集2.2什么是集2.3模型的集部分2.3.1定义原始集2.3.2定义派生集§3模型的数据部分和初始部分3.1模型的数据部分3.1.1数据部分入门3.1.2参数3.1.3实时数据处理3.1.4指定属性为一个值3.1.5数据部分的未知数值3.2模型的初始部分§4LINGO函数4.1基本运算符4.1.1算术运算符4.1.2逻辑运算符4.1.3关系运算符4.2数学函数4.3金融函数4.4概率函数4.5变量界定函数4.6集操作函数4.7集循环函数4.8输入和输出函数4.9辅助函数§5LINGOWindows命令5.1文件菜单5.2编辑菜单5.3LINGO菜单5.4窗口菜单5.5帮助菜单§6LINGO的命令行命令§7综合举例由于时间原因,§7节内容还没全部完成,抱歉!但为方便大家,还是先贴出来啦。献丑!参考文献1.LINGO用户指南(LINGO8.0的帮助文档).2.朱德通编著.最优化模型与实验.上海:同济大学出版社,2003.3.何坚勇编著.运筹学基础.北京:清华大学出版社,2000.4.刁在筠郑汉鼎等编著.运筹学.北京:高等教育出版社,1996.5.姚恩瑜何勇等编著.数学规划与组合优化.杭州:浙江大学出版社,2001.6.H.P.威廉斯著.孟国璧等译.数学规划模型建立与计算机应用.北京:国防工业出版社,1991.7.洪文朱广斌.整数规划下的最小生成树模型.安徽电气工程职业技术学院学报,2003.3,96—100.38.姜启源谢金星叶俊编.数学模型(第三版).北京:高等教育出版社,2003.9.谢金星等编.LINDO-LINGOhowto.网上下载,2004LINGO软件的使用LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。§1LINGO快速入门当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGOModel–LINGO1的窗口是LINGO的默认模型窗口,建立的模型都要在该窗口内编码实现。下面举两个例子。例1.1如何在LINGO中求解如下的LP问题:0,6002100350..32min212112121xxxxxxxtsxx在模型窗口中输入如下代码:min=2*x1+3*x2;x1+x2=350;x1=100;42*x1+x2=600;然后点击工具条上的按钮即可。例1.2使用LINGO软件计算6个发点8个收点的最小费用运输问题。产销单位运价如下表。单位销地运价产地B1B2B3B4B5B6B7B8产量A16267425960A24953858255A35219743351A47673927143A52395726541A65522814352销量3537223241324338使用LINGO软件,编制程序如下:model:!6发点8收点运输问题;sets:warehouses/wh1..wh6/:capacity;vendors/v1..v8/:demand;links(warehouses,vendors):cost,volume;endsets!目标函数;min=@sum(links:cost*volume);!需求约束;@for(vendors(J):@sum(warehouses(I):volume(I,J))=demand(J));!产量约束;@for(warehouses(I):@sum(vendors(J):volume(I,J))=capacity(I));!这里是数据;data:capacity=605551434152;demand=3537223241324338;cost=626742954953858252197433767392712395726555228143;enddata5end然后点击工具条上的按钮即可。为了能够使用LINGO的强大功能,接着第二节的学习吧。6§2LINGO中的集对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。2.1为什么使用集集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。2.2什么是集集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待于LINGO求解。例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。LINGO有两种类型的集:原始集(primitiveset)和派生集(derivedset)。一个原始集是由一些最基本的对象组成的。一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。2.3模型的集部分集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。2.3.1定义原始集为了定义一个原始集,必须详细声明:·集的名字·可选,集的成员·可选,集成员的属性定义一个原始集,用下面的语法:setname[/member_list/][:attribute_list];注意:用“[]”表示该部分内容可选。下同,不再赘述。Setname是你选择的来标记集的名字,最好具有较强的可读性。集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉伯数字(0,1,…,9)组成的总长度不超过32个字符的字符串,且不区分大小写。7注意:该命名规则同样适用于集成员名和属性名等的命名。Member_list是集成员列表。如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。①当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁开,允许混合使用。例2.1可以定义一个名为students的原始集,它具有成员John、Jill、Rose和Mike,属性有sex和age:sets:students/JohnJill,RoseMike/:sex,age;endsets②当隐式罗列成员时,不必罗列出每个集成员。可采用如下语法:setname/member1..memberN/[:attribute_list];这里的member1是集的第一个成员名,memberN是集的最末一个成员名。LINGO将自动产生中间的所有成员名。LINGO也接受一些特定的首成员名和末成员名,用于创建一些特殊的集。列表如下:隐式成员列表格式示例所产生集成员1..n1..51,2,3,4,5StringM..StringNCar2..car14Car2,Car3,Car4,…,Car14DayM..DayNMon..FriMon,Tue,Wed,Thu,FriMonthM..MonthNOct..JanOct,Nov,Dec,JanMonthYearM..MonthYearNOct2001..Jan2002Oct2001,Nov2001,Dec2001,Jan2002③集成员不放在集定义中,而在随后的数据部分来定义。例2.2!集部分;sets:students:sex,age;endsets!数据部分;data:students,sex,age=John116Jill014Rose017Mike113;enddata注意:开头用感叹号(!),末尾用分号(;)表示注释,可跨多行。在集部分只定义了一个集students,并未指定成员。在数据部分罗列了集成员John、Jill、Rose和Mike,并对属性sex和age分别给出了值。集成员无论用何种字符标记,它的索引都是从1开始连续计数。在attribute_list可以指定一个或多个集成员的属性,属性之间必须用逗号隔开。可以把集、集成员和集属性同C语言中的结构体作个类比。如下图:集←→结构体集成员←→结构体的域集属性←→结构体实例LINGO内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些8问题,然后再借助于LINGO求解器求解。因此,集属性的值一旦在模型中被确定,就不可能再更改。在LINGO中,只有在初始部分中给出的集属性值在以后的求解中可更改。这与前面并不矛盾,初始部分是LINGO求解器的需要,并不是描述问题所必须的。2.3.2定义派生集为了定义一个派生集,必须详细声明:·集的名字·父集的名字·可选,集成员·可选,集成员的属性可用下面的语法定义一个派生集:setname(parent_set_list)[/member_list/][:attribute_list];setname是集的名字。parent_set_list是已定义的集的列表,多个时必须用逗号隔开。如果没有指定成员列表,那么LINGO会自动创建父集成员的所有组合作为派生集的成员。派生集的父集既可以是原始集,也可以是其它的派生集。例2.3sets:product/AB/;machine/MN/;week/1..2/;allowed(product,machine,week):x;endsetsLINGO生成了三个父集的所有组合共八组作为allowed集的成员。列表如下:编号成员1(A,M,1)22(A,M,2)33(A,N,1)44(A,N,2)55(B,M,1)66(B,M,2)77(B,N,1)88(B,N,2)成员列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密
              三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
        
本文标题:解非线性规划软件lingo的学习
链接地址:https://www.777doc.com/doc-6196832 .html