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)ObjNPriorityObjNWeightObjNAbsTol,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

约束部分还可以包含另一种约束类型:所谓的指示符约束。指示器约束以一个可选标签(约束名称,后面跟着冒号,后面跟着空格)开始,然后是一个二进制变量,一个空格,一个,同样也是一个空格和一个值01.他们继续一个空间,接着是->,然后又是一个空格,最后是一个线性约束(没有标签)。

例如:

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类型,这两种类型都可以S1S2.类型后面跟着一对冒号。

接下来是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如果不是自然对数< span > < /美元跨度> < span > < / span >美元是基础。后面跟着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格式文件的最后一行应该是结束声明。