manbet体育手机客户端
LP格式
LP格式以一种比MPS格式更易于人类阅读的方式捕获优化模型,并且通常可以更自然地生成。LP格式的一个限制是它不能保留一些模型属性。特别是,LP文件在读取时不保留列顺序,它们通常不保留系数的确切数值(尽管这不是格式固有的)。
与MPS文件不同,LP文件不依赖于固定的字段宽度。换行符和空格字符用于分隔对象。下面是一个简单的例子:
\ LP格式示例Maximize x + y + z Subject To c0: x + y = 1 c1: x + 5 y + 2 z <= 10 qc0: x + y + [x ^ 2 - 2 x * y + 3 y ^ 2] <= 5 Bounds 0 <= x <= 5 z >= 2 Generals x y z结束
反斜杠符号开始注释;该行的其余部分将被忽略。
变量名在LP文件中起着重要作用。每个变量必须有自己唯一的名称。名称不应该超过255个字符,为了避免混淆LP解析器,它不应该以数字开头,也不应该包含任何字符+, -, *, ^, <, >, =,(,),[,],,,或:
或空格。此外,变量名不应该等于(不区分大小写)任何LP文件格式关键字,例如,St、边界、最小值、最大值、二进制或结束
.
同样的规则也适用于LP格式的任何其他类型的名称,例如约束名称或目标名称。
注意,空格字符在gu罗比LP格式中是不可选的。因此,例如,文本x + y + z
将被视为单个变量名,而X + y + z
将被视为一个三项表达式。
LP文件的结构是一个部分列表,其中每个部分捕获整个优化模型的一个逻辑部分。章节以特定的关键字开始,并且通常必须以固定的顺序出现,尽管少数部分是允许互换的。
客观的部分
LP文件的第一部分是目标部分。本节以以下六个关键字之一开始:最小化,最大化,最低,最大,最小值,或马克斯.忽略大小写。这个关键字可能单独出现,也可能紧跟着目标序列,表示模型包含多个目标函数。
简略的情况
让我们首先考虑单目标模型,这个标题后面跟着一个捕获目标函数的单一线性或二次表达式。
目标可选地以一个标签开始。标签由名称、冒号字符和空格组成。名称和冒号之间允许有空格,但不是必需的。
目标接着是一个线性项列表,由+
或-
操作符。一个项可以包含一个系数和一个变量(例如,4.5倍
),或只是一个变量(例如,x
).目标可以写在很多行上,也可以列在一行上。换行符可以出现在令牌之间,但绝对不能出现在令牌内部。
目标可以选择继续使用一个二次项列表。客观表达式的二次元部分以a开头[
符号,以a结尾]
象征,紧随其后的是/ 2
.这些括号应该包含一个或多个二次项。要么是平方项(例如,2x ^ 2
)或产品术语(例如,3 x * y
)接受。二次项的系数是可选的。
对于分段线性目标函数的变量,目标部分将包括a__pwl (x)
词,x
是变量的名称。您应该将这些视为注释;它们会被LP阅读器忽略。实际的分段线性表达式是从后者中提取的PWLObj
部分。
客观表达式必须总是以换行符结束。
目标部分可能如下所示:
最小化obj: 3.1 x + 4.5 y + 10 z + [x ^ 2 + 2 x * y + 3 y ^ 2] / 2
多目标情况下
在多目标情况下,标题后面跟着一个或多个线性目标函数,每个函数都以自己的子标题开始。子标题给出了目标的名称,后面跟着一些字段,这些字段提供了一个优先级,重量,绝对公差(AbsTol)和相对公差(RelTol)ObjNPriority,ObjNWeight,ObjNAbsTol,ObjNRelTol有关这些字段含义的详细信息)。字段以字段名开头,后面跟着一个=
,后跟值。例如:
OBJ0:优先级=2权重=1 AbsTol=0 RelTol=0详情请参阅多目标部分,以了解更多详情。
每个子标题后面都跟着一个线性表达式,用于捕获该目标。
一个完整的多目标部分可能如下所示:
最小化多目标OBJ0:优先级=2权重=1 AbsTol=0 RelTol=0 3.1 x + 4.5 y + 10 z OBJ1:优先级=1权重=1 AbsTol=0 RelTol=0 10 x + 0.1 y
目标部分是可选的。当目标不存在时,它被设置为0。
限制部分
下一个部分是约束部分。它在自己的一行上以以下标题之一开始:受,这样,圣,或酸处理.忽略大小写。
约束部分可以有任意数量的约束。每个约束都以一个可选的标签(约束名称,后面跟着冒号,后面跟着空格)开始,接着是一个线性表达式,后面是一个可选的二次表达式(用方括号括起来),最后是一个比较操作符,后面是一个数值,后面是一个换行符。有效的比较运算符为=
,< =
,<
,>=
,或>
.注意LP格式不区分严格和非严格不等式,例如<
而且< =
是等价的。
注意,约束的左边可能不包含常数项;常数必须出现在右边。
下面是一个有效的线性约束的简单例子:
C0: 2.5 x + 2.3 y + 5.3 z <= 8.1下面是一个有效的二次约束:
Qc0: 3.1 x + 4.5 y + 10 z + [x ^ 2 + 2 x * y + 3 y ^ 2] <= 10
约束部分还可以包含另一种约束类型:所谓的指示符约束。指示器约束以一个可选标签(约束名称,后面跟着冒号,后面跟着空格)开始,然后是一个二进制变量,一个空格,一个=
,同样也是一个空格和一个值0
或1
.他们继续一个空间,接着是->
,然后又是一个空格,最后是一个线性约束(没有标签)。
例如:
C0: b1 = 1 -> 2.5 x + 2.3 y + 5.3 z <= 8.1
此示例约束要求满足给定的线性约束,如果变量b1
值为1
.
每个LP格式文件都必须有一个约束部分。
懒惰的约束部分
下一个部分是惰性约束部分。它从直线开始懒惰的约束
,后面是一个空格和惰性级别1-3(如果没有指定惰性级别,则假定为1),然后是一个线性约束列表,格式与约束部分中的线性约束完全相同。例如:
懒惰约束c0: 2.5 x + 2.3 y + 5.3 z <= 8.1懒惰约束2 c1: 1.5 x + 3.3 y + 4.3 z <= 8.1
懒惰约束是线性约束,它们在语义上等同于标准线性约束。根据它们的懒惰程度,MIP求解器会以不同的方式执行它们。手机万博登录请参阅描述懒惰的属性的细节。
此部分是可选的。
范围部分
下一个部分是边界部分。它以单词开头界限
,在它自己的一行上,并跟随一个变量边界列表。每行指定单个变量的下界、上界,或者两者都指定。关键字正
或∞
可以在bounds部分中使用,以指定无限的边界。边界线也可以表示变量是免费的
这意味着它在任何方向上都是无界的。
以下是有效的边界线的例子:
0 <= x0 <= 1 x1 <= 1.2 x2 >= 3 x3 free x2 >= -Inf
没有必要为所有变量指定边界;默认情况下,每个变量的下界为0,上界为无穷大。实际上,整个边界部分都是可选的。
变量类型的部分
下一节是变量类型部分。变量可以指定为二进制、一般整数或半连续。在所有情况下,通过首先提供适当的头(在其单独的行上),然后列出具有相关类型的变量来应用指定。例如:
二进制x y z变量类型的指定不需要以任何特定的顺序出现(例如,一般整数可以在二进制之前或之后)。如果一个变量包含在多个部分中,则最后一个部分确定变量的类型。
变量类型头的有效关键字是:二进制,二进制文件,箱子,一般,将军,创,半连续,半决赛,或半.
变量类型部分是可选的。默认情况下,假设变量是连续的。
SOS节
LP文件可以包含捕获类型1或类型2的SOS约束的部分。SOS部分以紧急求救信号
标题在它自己的行上(大写并不重要)。可以有任意数量的SOS约束。SOS约束以名称开始,后面是冒号(与线性约束不同,此处名称不是可选的)。接下来是SOS类型,这两种类型都可以S1
或S2
.类型后面跟着一对冒号。
接下来是SOS组的成员,以及他们的权重。每个成员都使用变量名(后面跟着冒号)和相关的权重来捕获。可以在冒号前后随意放置空格。SOS约束必须以换行符结束。
下面是一个包含两个SOS约束的SOS部分的例子:
SOS sos1:: x1:1 x2: 2 x3: 3 sos2: S2:: x4:8.5 x5:10.2 x6:18.3
SOS部分是可选的。
PWLObj节
LP文件可以包含捕获分段线性目标函数的部分。PWL部分从PWLObj
标题在它自己的行上(大写并不重要)。每个分段线性目标函数都与一个模型变量相关联。PWL函数以相应的变量名开始,后面紧跟着冒号(名称不是可选的)。接下来是定义分段线性函数的点。这些点表示为(x, y)
对,用圆括号包围两个值,并用逗号分隔它们。PWL函数必须以换行符结束。
下面是一个PWLObj部分的例子,它包含两个简单的分段线性函数:
PWLObj x1:(1,1)(2, 2)(3、4)x2:(1,3)(3、5)(100、300)
PWLObj部分是可选的。
一般的约束部分
LP文件可能包含捕获的可选部分一般的约束.本节从以下关键字之一开始一般的约束,一般的约束,金康合同,或里的。(忽略大小写)。
一般约束可以有两种基本类型:简单的一般的约束,最小值,马克斯,或,和,腹肌,或PWL,或函数约束-多项式(聚
)、电力(战俘
),指数(经验值
或的扩张
)、对数(日志
或LOGA
)或三角函数(罪
,因为
,或棕褐色
).
一个简单的通用约束以一个可选的标签(约束名,后面跟着一个冒号)开始,然后是一个变量名(所谓的合成),然后是等号=
.这一行继续使用通用约束类型说明符(最小值,马克斯,或,和,或腹肌),那么(
.所有标记必须使用空格分隔。忽略大小写。
接下来的内容取决于一般约束类型。最小值或马克斯约束要求一个非空的、以逗号分隔的变量或值列表。或而且和约束要求二元变量列表以逗号分隔。腹肌约束只要求一个变量名。同样,所有标记(包括逗号)必须用空格分隔。
所有这些一般约束条件都以a结尾)
还有一个换行。
以下是一些例子:
gc0: r1 = MAX (x1, x2, x10, 0.7) gencon1: r2 = MIN (y0, 10, y1, r1) and1: r = AND (b1, b2) or1: r = OR (b3, b4) GC14: xabs = ABS (x)
分段线性约束也以一个可选标签(约束名称,后面跟着一个冒号)开始。这一行接着是一个变量名(所谓的合成)和等号=
.接下来是关键词PWL这表明约束是分段线性的类型。后面跟着a(
,然后由一个变量名(所谓操作数)然后是)
.这一行接着是a:
然后是括号内的分段线性断点列表(例如,(x0, y0) (x1, y1)),在x上具有不递减的值。记住,标记之间需要空格。
下面一个例子:
GC0: y [0] = PWL (x[0]):(1、2)(0,1)(0,0)(0,1)(1、2)
还有另一种类型的简单约束,即指示器约束。它们出现在常规约束部分(如上所述),而不是一般约束部分。
函数约束也以一个可选的标签(约束名,后面跟着冒号)开始。下面是可选的属性赋值列表。这些都是从(
,然后是一个空格分隔的列表名称=值
字符串(字符串前后没有空格=
),以a结尾)
.下面是一个示例。如果没有指定属性,则使用默认值。
这一行接着是一个变量名(所谓的合成)和等号=
.接下来是一个关键字,指明被定义的函数的类型(聚,战俘,经验值,的扩张,日志,LOG_A,罪,因为,或棕褐色).对于一个日志,使用LOG_A如果不是自然对数是基础。后面跟着a(
,然后通过定义实际函数的表达式。这一行以a结尾)
.回想一下,令牌之间需要空格。
多项式和幂的描述很自然,指数前面有^
的象征。
下面给出了一些函数约束的例子:
gc1: (PieceError=1e-05 PieceRatio=0.5) z = SIN (y) GC2: (PieceLength=0.001) y = POLY (5 x ^ 3 + 2 x + 5) gc3: z = EXPA (3.5 ^ y) gc4: z = LOG_10 (y) logytoz: z = LOG (y)
有关更多信息,请参阅一般约束的讨论.
场景一节
LP文件可能包含捕获场景数据的可选部分。一个模型可以有多个场景,每个场景都定义了对原始模型的一组更改(我们称之为基本模型).
本节从场景关键字(忽略大小写),后面跟着一个场景名称。场景被描述为目标函数的一组变化、线性约束的右边和变量的边界。首先陈述目标更改,然后是右侧更改,然后是边界更改。场景可以是空的(即,与基本模型相同)。
对目标函数的更改从允许的目标关键字之一(最小化
,最大化
等;更多信息见上面的目标部分)。注意,关键字需要与基本模型的客观含义相匹配。后面的一行表示每个更改的目标系数,其中包含变量名及其修改后的值(用空格分隔)。
对线性约束右侧的更改从一个允许的约束节关键字开始(受
等;更多信息请参见上面的约束部分)。接下来是一行,用于每个更改的右侧值,其中包含约束名称,后面是冒号,然后是空格、约束含义、空格和场景右侧值。
变量边界的更改从界限
关键字。接下来是一行,表示每个更改了场景边界的变量;每条这样的线的格式与上面的边界部分相同。
下面的例子展示了三种LP格式的场景:
场景场景0场景场景1最大化x1 0 x2 1受制于c1: <= 2 c2: >= 2边界x3 <= 1.5 x1 free 0 <= x2 <= 0 x3 >= 0.5场景场景2边界x3 = 3
有关更多信息,请参阅多个场景的讨论.
结束语句
LP格式文件的最后一行应该是结束
声明。