(一)在Lingo中使用集合
1. 在Lingo中使用集合
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,OP,INV未知。现在我们可以写出该问题的模型:
此外还有各变量非负的约束。
记4个季度组成的集合,他们就是DEM、RP、OP、INV等变量的下标集合,对于,都有值与之对应。LINGO正是充分利用这种数组及其下标的关系,引入了“集合”与“属性”的概念。本例中我们把称之为集合,DEM、RP、OP、INV称为集合具有的属性(即定义在该集合上的属性)。下图表示了这种集合与属性的关系。
集合QUARTERS的元素 |
1 |
2 |
3 |
4 |
|
定义在集合QUARTERS上的属性 |
DEM |
DEM(1) |
DEM(2) |
DEM(3) |
DEM(4) |
RP |
RP(1) |
RP(2) |
RP(3) |
RP(4) |
|
OP |
OP(1) |
OP(2) |
OP(3) |
OP(4) |
|
INV |
INV(1) |
INV(2) |
INV(3) |
INV(4) |
下面我们看看Lingo中具体如何定义集合及其属性。下面是例2的Lingo代码:
Model:Sets:QUARTERS/1,2,3,4/:DEM,RP,OP,INV;EndsetsMin=@sum(QUARTERS:400*RP+450*OP+20*INV);@for(QUARTERS(I):RP(I)<=40;);@for(QUARTERS(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,25;EnddataEnd
我们总结一下上面代码的特点:
(1)、模型以“MODEL:”开始,以“END”结束。它们之间由语句组成,可以分成三步分。
(2)、集合定义部分以“SETS:”开始,以“ENDSETS”结束。中间定义了集合和相应属性。语句“QUARTERS/1,2,3,4/:DEM,RP,OP,INV;”定义了集合QUARTERS,以及该集合的属性DEM、RP、OP、INV,其结果正是上表里面的16个变量名。可以定义空集合,比如“Empty set/1,2,3,4/;”空集合的用法将在派生集中讲述。
(3)、数据输入部分以“DATA:”开始,以“ENDDATA”结束,语句“DEM=40,60,75,25;”给出了常量DEM的值,即DEM(1)=40,DEM(2)=60,DEM(3)=75,DEM(4)=25. 语句“DEM=40,60,75,25;”也可以写成语句“DEM=40 60 75 25;”即数据之间可以用逗号或空格分开。
(4)、其他部分,给出了目标函数和约束。其中目标函数(“min=”后面所接的表达式)是用求和函数
“@sum=(集合(下标):关于集合的属性的表达式)”
的方式定义的,这个函数的功能是对语句冒号“:”后面的表达式,按照“:”前面的集合指定的下标元素进行求和。本例中目标函数也可以写成
“Min=@sum(QUARTERS(i):400*RP(i)+450*OP(i)+20*INV(i))”
这里“@sum”相当于求和符号,而“QUARTERS(i)”相当于“”,而由于本例中已默认对所有的QUARTERS的元素求和,所以实例中可以将下标i省略。
约束是用循环函数“@for(集合(下标):关于集合的属性的约束关系式)”的方式定义的,意思是对于“:”前面的集合的每个元素(下标),冒号“:”后面的约束关系式都要成立。但对于这个约束,实际上I=1时要用到变量,但我们定义属性变量的时候是从I=1开始的,即是一个常数,为了区别I=1和I=2,3,4,我们要将I=1的约束单独列出来,而对I=2,3,4的约束我们对集合下标做了的约束,即用了“#GT#1”(这个限制条件与集合之间有一个竖线“|”分开,称为过滤条件),“I#GT#1”就表示,“#GT#”是lingo中的逻辑表达式。
小结一下lingo模型最基本的组成要素:
(1) 集合段:以“SETS:”开始,以“ENDSETS”结束。作用在于定义必要的集合和属性。注意一个细节,我们可以定义QUARTERS/1,2,3,4/,若QUARTERS有1000个元素,我们也不必将其一一列出,而可以简写为QUARTERS/1..1000/.
(2) 目标和约束段:这部分不像其他部分,没有段的开始和结束的标记。因此是除去其他段以外的所有语句。
(3) 数据段:以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性输入必要的常数数据,格式为: 属性=常数列表;常数列表中的常数或以逗号“,”分开,或以空格分开“ ”.
(4) 初始段:以“INIT:”开始,以“ENDINIT”结束。作用在于对集合的属性定义初值。因为求解算法是迭代算法,所以一个好的初值可以让程序更快解决。定义初值的格式为: 属性=常数列表;
(5) 计算段:以“CALC:”开始,以“ENDCALC”结束,作用在于对一些原始数据进行计算处理,这种处理是在输入数据后,求解模型前进行的。例如,对上面的例子,如果我们希望可以得到全年的总需求和季度平均需求,可以增加这个段:
CALC:
T_DEM=@sum(QUARTERS:DEM);!总需求;
A_DEM=T_DEM/@size(QUARTERS);!平均需求;
ENDCALC
要注意的是计算段中语句是按顺序执行的,故上面的两个语句不能调换。
转载于:https://www.cnblogs.com/douzujun/p/6683396.html
(一)在Lingo中使用集合相关推荐
- Lingo 中的各种函数
数学函数 在 Lingo 中 Π 值写 3.14159 即可. 集合操作函数 合操作函数 变量定界函数 @bin(x) 限制 x 只能取 0 或 1,0-1规划中经常使用. @gin(x) 限制 x ...
- java去重复的集合_如何去除Java中List集合中的重复数据
1.循环list中的所有元素然后删除重复 public class duplicatRemoval { public static List removeDuplicate(List list){ f ...
- mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String
mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String 参考文章: (1)mybati ...
- Java中Set集合是如何实现添加元素保证不重复的?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「武培轩」 Java中Set集合是如何实 ...
- java中集合和数据库中_java中list集合的内容,如何使用像数据库中group by形式那样排序...
标签:java中list集合的内容,如何使用像数据库中group by形式那样排序,比如: 有一个 List 他中包含了一些如下的内容 JavaBean: name money (名称) (金 ...
- Java 8中处理集合的优雅姿势——Stream
在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增.删.改.查.聚合.统计.过滤等操作.相比之下,关系型数据库中也同样有这些操作,但是在Java 8之前,集合和数组的处理并不是很便 ...
- Guava中针对集合的 filter和过滤功能
Guava中针对集合的 filter和过滤功能 博客分类: JAVA相关 在guava库中,自带了过滤器(filter)的功能,可以用来对collection 进行过滤,先看例子: Java代码 ...
- Redis 中的集合类型是怎么实现的?
本文是<Redis内部数据结构详解>系列的第七篇.在本文中,我们围绕一个Redis的内部数据结构--intset展开讨论. Redis里面使用intset是为了实现集合(set)这种对外的 ...
- C++ 中的集合与字典
基本的关联式容器主要有:set.multiset.map 和 multimap,这四种容器可以分为两组:map 和 set. set 可以理解为我们数学中的集合,它可以包含 0 个或多个不重复的数据. ...
最新文章
- 03_设置轴标签和范围、轴的标签(Labels on Axes)、定义轴的范围、使用linspace定义X值 (“linspace“ to Define X Values)
- 对象水平对齐,并且按照竖直方向排列
- Log--日志变大原因总结
- 双十一丨你负责买买买 我做你背后的那个数据人
- 毛谦解读“Pb/s级光传输”:技术的恩惠远不止于此
- 微课|玩转Python轻松过二级(2.1.1):常量与变量
- java工程师_北京java工程师课程
- ubuntu 12.04 源码安装 Xen 4.2
- 〖免杀〗.net程序一键免杀Win10 20H2 Defender
- womic网络错误_wo mic 电脑版下载-WO Mic Client下载 3.4 最新电脑版 - 河东下载站
- 用于敏捷开发的免费 UML 工具 2022
- 前端开发应知网站(强烈推荐!)
- win下安装nessus
- phpstudy重置密码登录报错#1045
- veu-cli 3.0使用教程
- Pointnet网络结构与代码解读
- 不服不行,太厉害了,终于有人能把TCP/IP 协议讲的明明白白了
- 工业设备软件的研发测试
- sam卡和sim卡区别_什么是PSAM卡、SAM卡、SIM卡
- 记录下:订单模块初步完成