基本模型
如果需要求解的问题比较简单, 可以直接使用数学表示, 例如
1 | min=2*x1+3*x2; |
注意:
- 第一行是目标函数, 其余为约束条件
- 约束条件默认取等号
- 变量默认大于零
程序结构
小型模型
一个标准的程序示例如下所示:
1 | model: |
注意:
- 所有语句都用分号结尾, 包括注释
- 使用title来指定标题
- 使用中括号对行命名, 在分析报告中使用此名称替代行号对应的数字
大型模型
大型模型采用分段的结构, 将变量, 数据和模型分离, 整体结构类似于如下的结构
1 | model: |
定义变量
集
对于有大量变量的优化问题, 逐一定义变量是一件非常麻烦的事情. 此时可以使用集的概念来批量的定义变量. 集是一组成员的集合, 而每个成员又可以具有若干的属性, 因此集的定义表示为
1 | set: |
成员名称可以使用逗号分割的方式逐一制定, 也可以按照上面的例子, 使用缩写表示来自动定义多个变量. 隐式成员格式有
格式 | 示例 | 成员 |
---|---|---|
1..n | 1..5 | 1,2,3,4,5 |
StringM..StringN | Car2..Car5 | Car2, Car3, Car4, Car5 |
DayM..DayN | Mon..Fri | Mon, Tue, Wed, Thu, Fri |
MonthM..MonthN | Oct..Jan | Oct, Nov, Dec, Jan |
MonthYearM..MonthYearN | Oct2001..Jan2002 | Oct2001, Nov2001, Dec2001, Jan2002 |
派生集
派生集是在其他集合的基础上构建的新集合, 默认情况下, 其成员为所有继承的集合的组合, 派生集语法为
1 | <setname>(<parent_set_list>)[/<member_list>/][:<attribute_list>]; |
例如分别定义三个集合, 则基于这三个集合的派生集合可以定义为如下的形式
1 | sets: |
allowed拥有2x2x2=8个成员, 且每个成员都具有x属性. 这种默认包含所有成员的组合的集合称为稠密集, 如果希望去掉部分不需要的元素, 可以使用LINGO的逻辑表达式, 例如
属性列
在data部分指定数据, 可以依据某一个属性来指定, 也可以依据对象来指定.
1 | sets: |
1 | sets: |
将所有成员的属性指定为一个值
1 | sets: |
部分指定
1 | sets: |
函数
数学函数
LINGO提供了大量的函数, 一般以@开头, 例如@sin
,@abs
,@log
(自然对数)等等. 除去这些常见的数学函数以外, LINGO还定义了如下的一些重要的数学函数
函数 | 作用 | 函数 | 作用 |
---|---|---|---|
@sign |
符号函数 | @floor |
取整 |
@smax |
返回一组数据的最大值 | @smin |
返回一组数的最小值 |
使用示例:
1 | model: |
变量定界函数
函数 | 作用 | 函数 | 作用 |
---|---|---|---|
@bin(x) |
限制为0-1变量 | @gin(x) |
限制为整数 |
@bnd(L,x,U) |
限制取值范围在L和U之间 | @free(x) |
取消变量默认大于零的限制 |
变量定界函数在约束条件部分单独对变量执行即可. 例如
1 | sets: |
集循环函数
1 | @<function>(<setname>[(<set_index_list>)[|<conditional_qualifier>]]:<expression_list>); |
从上面的格式可以注意到:
- 集合名称必须指定
- 索引可以省略
- 过滤条件可以省略
- 表达式部分必须指定
因此如果是针对整个集合的操作, 显然可以省略索引和过滤条件, 例如某个集合之和小于90可以表示为
1 | model: |
逻辑表达式可以表达分段函数
最后更新: 2024年03月28日 23:43
版权声明:本文为原创文章,转载请注明出处