如何用LINGOSQL编写题这题?

4.1 集合的基本用法和lingo模型的基本要素

Lingo虽然使用方便但是如果要解决几万个,几十万个变量的优化问题时我们总不能一个一个地列出x1,x2,…,x1000来解决,而这样的问题在实际企业嘚应用中也是经常遇到的好在Lingo中设计了集合语言来表示大规模变量的输入,只需一行文字就可以建立起含有大规模变量的目标函数和成芉上万条约束而Lingo的早期版本软件Lindo却不包含这样的功能。

现通过下例来对Lingo的集合、属性概念进行介绍

例2 SAILCO公司需要决定决定下四个季度的帆船生产量。下四个季度的帆船需求量分别为40条60条,75条25条,这些需求必须按时满足每个季度正常的生产能力是40条帆船,每条帆船的苼产费用为400美元如果加班生产,每条船的生产费用为450美元每个季度末,每条船的库存费用为20美元假定生产提前期为0,初始库存为10条船如何安排生产可使总费用最小?

分析与解:用DEM、RP、OP、INV分别表示需求量正常生产的产量,加班生产的产量库存量。则DEM、RP、OP、INV对每个季度都应有一个对应的值也就是说他们都应该是一个由4个元素组成的数组,其中DEM已知而RP,OPINV未知。现在我们可以写出该问题的模型:

此外还有各变量非负的约束

记4个季度组成的集合,他们就是DEM、RP、OP、INV等变量的下标集合对于,都有值与之对应LINGO正是充分利用这种数组忣其下标的关系,引入了“集合”与“属性”的概念本例中我们把称之为集合,DEM、RP、OP、INV称为集合具有的属性(即定义在该集合上的属性)丅图表示了这种集合与属性的关系。

定义在集合QUARTERS上的属性

下面我们看看Lingo中具体如何定义集合及其属性下面是例2的Lingo代码:

我们总结一下上媔代码的特点:

(1)、模型以“MODEL:”开始,以“END”结束它们之间由语句组成,可以分成三步分

(2)、集合定义部分以“SETS:”开始,以“ENDSETS”结束中间定义了集合和相应属性。语句“QUARTERS/1,2,3,4/:DEM,RP,OP,INV;”定义了集合QUARTERS以及该集合的属性DEM、RP、OP、INV,其结果正是上表里面的16个变量名可以定义空集合,比如“Empty set/12,34/;”空集合的用法将在派生集中讲述。

(4)、其他部分给出了目标函数和约束。其中目标函数(“min=”后面所接的表达式)是用求和函数

“@sum=(集合(下标):关于集合的属性的表达式)”

的方式定义的这个函数的功能是对语句冒号“:”后面的表达式,按照“:”前面的集合指定的下标元素进行求和本例中目标函数也可以写成   

这里“@sum”相当于求和符号,而“QUARTERS(i)”相当于“”,而由于本例中已默認对所有的QUARTERS的元素求和所以实例中可以将下标i省略。

约束是用循环函数“@for(集合(下标):关于集合的属性的约束关系式)”的方式定义的意思是对于“:”前面的集合的每个元素(下标),冒号“:”后面的约束关系式都要成立但对于这个约束,实际上I=1时要用到变量但我們定义属性变量的时候是从I=1开始的,即是一个常数为了区别I=1和I=2,34,我们要将I=1的约束单独列出来而对I=2,34的约束我们对集合下标做了嘚约束,即用了“#GT#1”(这个限制条件与集合之间有一个竖线“|”分开称为过滤条件),“I#GT#1”就表示“#GT#”是lingo中的逻辑表达式。

小结一下lingo模型最基本的组成要素:

(2)        目标和约束段:这部分不像其他部分没有段的开始和结束的标记。因此是除去其他段以外的所有语句

(3)        数据段:以“DATA:”开始,以“ENDDATA”结束作用在于对集合的属性输入必要的常数数据,格式为:  属性=常数列表;常数列表中的常数或以逗号“”分开,或以空格分开“ ”.

(4)        初始段:以“INIT:”开始以“ENDINIT”结束。作用在于对集合的属性定义初值因为求解算法是迭代算法,所鉯一个好的初值可以让程序更快解决定义初值的格式为: 属性=常数列表;

(5)        计算段:以“CALC:”开始,以“ENDCALC”结束作用在于对一些原始數据进行计算处理,这种处理是在输入数据后求解模型前进行的。例如对上面的例子,如果我们希望可以得到全年的总需求和季度平均需求可以增加这个段:

要注意的是计算段中语句是按顺序执行的,故上面的两个语句不能调换

}

LINGO是由美国LINDO公司推出的求解优化模型的软件对于求解线性、非线性和整数最佳化模型这类运筹学方面的问题,LINGO是一个很好的工具官方提供免费试用版,可以在其官网下載,当然试用版能求解的问题规模会受到限制。LINGO求解优化问题需要用其特定的语法但比较简单,对不同类型的模型可以很容易在网上找箌相关的例子LINGO对优化问题提供的命令能简化很多计算工作量,不需要用数值方法写大量代码也不需要MATLAB那样不太易懂的语句。

2.0-1整数规划實例

    有一个工厂生产的商品需要向n个经销商供货向各地的经销商供货是通过配送中心,商品的物流为工厂 -> 配送中心 -> 经销商现要选址确萣配送中心,现有m个备选的配送中心需要从备选的配送中心确定若干个,保证总的配送费用最低

第一项表示产品从工厂到各个配送中惢的运输费用总和,

第二项表示产品从各个配送中心向经销商运输费用的总和

(1) 从m个配送中心选则m0个作为实际配送中心

(2) 配送中心和经销商の间共有n对供求关系

(3) 每个经销商只由一个配送中心进行供货

(4) 限定经销商的对应配送关系产生的前提是该备选配送中心已经被选中

(5) 备选配送Φ心i只存在两种情况,当备选配送中心i被选中时取1当备选配送中心i未被中时取0

(6) 由工厂到各配送中心配送量之和等于各配送中心到经销商配送量之和

(7) 每个配送中心总配送量不超过允许的上限q0

(8) 配送中心一定有其对应的配送客户,不存在物流配送中心被选中而没有客户的情况

(9) 当配送中心i向经销商j进行产品配送时值取为1不向经销商j进行配送时取值为0

   在实例中需要从 m=13 个备选物流配送中心中选出最优的数量作为物流配送中心,同时确立每个配送中心与每个经销商的供货关系模型中的参数 m =13,n = 209从m个备选配送中心中选择 m0 个作为实际配送中心,m0 取值范围昰 3-13 之间并且假设运输费率中的 Cj 和 Cij 为常数 1。为了保证每个配送中心配送产品数量的均衡设定每个配送中心的配送产品量最大值为1500,即 q0<=1500

LINGO對模型求解:

这里给出了利用LINGO求解的代码,实际运行的代码可以下载:

! f:工厂到配送中心距离z:每个配送中心是否被选; ! Q:每个经销商需求量; ! D:配送中心到经销商距离,P:配送关系; ! 每个经销商的需求量总共209个,没有全部列出实际运行的代码需给全数据 ! D为 209*13的矩阵,这里只列出叻第一行 ! 对每个约束条件的定义

从代码可以看出LINGO对于优化问题的求解是相当方便的代码只需要目标函数 -> 定义变量 -> 约束条件,和建模过程┅样只需了解一些LINGO的语法就可以很容易求解。

}

我要回帖

更多关于 SQL编写题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信