pulp: Pulp 类

LpProblem([name, sense])

一个线性规划问题

LpVariable(name[, lowBound, upBound, cat, e])

此类为具有指定关联参数的 LP 变量建模

LpAffineExpression([e, constant, name])

一个 LpVariables 的线性组合。

LpConstraint([e, sense, name, rhs])

一个线性规划约束

LpConstraint.makeElasticSubProblem(*args, ...)

通过向一个硬约束添加变量来构建一个弹性子问题

FixedElasticSubProblem(constraint[, ...])

包含将固定约束 \(\sum_{i}a_i x_i = b\) 转换为弹性约束所生成的子问题。

待处理

LpFractionConstraint, FractionElasticSubProblem

LpProblem 类

class pulp.LpProblem(name='NoName', sense=1)[源代码]

基类:object

一个线性规划问题

创建一个线性规划问题

此函数创建一个新的 LP 问题,并指定相关的参数

参数:
  • name – 输出 .lp 文件中使用的问题名称

  • sense – LP 问题目标的类型。可以是 LpMaximize

返回:

一个线性规划问题

问题的三个重要属性是:

objective

The objective of the problem, an LpAffineExpression

constraints

问题的 约束 的有序字典 - 按名称索引。

status

问题从求解器返回的 状态

一些更重要的方法:

solve(solver=None, **kwargs)[源代码]

解决给定的 Lp 问题。

此函数修改问题以使其适合求解,然后调用 solver.actualSolve() 方法来找到解决方案。

参数:

solver – 可选:要使用的特定求解器,默认为默认求解器。

副作用:
  • actualSolve() 中,问题对象的属性被更改以反映 Lp 解决方案。

roundSolution(epsInt=1e-05, eps=1e-07)[源代码]

对lp变量进行四舍五入

输入:
副作用:
  • lp 变量被四舍五入

setObjective(obj)[源代码]

将输入变量设置为目标函数。用于列式建模。

参数:

obj – 类型为 LpConstraintVar 的目标函数

副作用:
  • 目标函数被设定

writeLP(filename, writeSOS=1, mip=1, max_length=100)[源代码]

将给定的Lp问题写入一个.lp文件。

此函数将定义的Lp问题的规范(目标函数、约束、变量)写入文件。

参数:

filename (str) – 要创建的文件名。

返回:

变量

副作用:
  • 文件已创建

writeMPS(filename, mpsSense=0, rename=0, mip=1, with_objsense: bool = False)[源代码]

根据问题信息生成一个mps文件

参数:
  • filename (str) – 要写入的文件名

  • mpsSense (int)

  • rename (bool) – 如果为真,则使用标准化的名称作为变量和约束

  • mip – 变量和变量重命名

返回:

副作用:
  • 文件已创建

toJson(filename, *args, **kwargs)[源代码]

从 LpProblem 信息创建一个 json 文件

参数:
  • filename (str) – 要写入的文件名

  • args – json 函数的附加参数

  • kwargs – json 函数的额外关键字参数

返回:

classmethod fromJson(filename)[源代码]

从包含信息的json文件创建一个新的Lp问题

参数:

filename (str) – json 文件名

返回:

一个包含变量字典和LpProblem的元组

返回类型:

(字典, LpProblem)

variables()[源代码]

返回问题变量

返回:

包含问题变量的列表

返回类型:

(列表, LpVariable)

变量与表达式

class pulp.LpElement(name)[源代码]

LpVariable 和 LpConstraintVar 的基类


class pulp.LpVariable(name, lowBound=None, upBound=None, cat='Continuous', e=None)[源代码]

此类为具有指定关联参数的 LP 变量建模

参数:
  • name – 输出 .lp 文件中使用的变量名称

  • lowBound – 该变量范围的下限。默认值为负无穷大。

  • upBound – 此变量范围的上限。默认值为正无穷大。

  • cat – 该变量所属的类别,整数、二进制或连续(默认)

  • e – 用于基于列的建模:与变量在目标函数和约束中的存在相关

addVariableToConstraints(e)[源代码]

将一个变量添加到由 LpConstraintVars 指示的约束中

classmethod dicts(name, indices=None, lowBound=None, upBound=None, cat='Continuous', indexStart=[])[源代码]

此函数创建一个包含指定关联参数的 LpVariable 字典。

参数:
  • name – 每个创建的LP变量名称的前缀

  • indices – LP 变量字典键的字符串列表,以及变量名称本身的主要部分

  • lowBound – 这些变量的范围下限。默认值为负无穷大。

  • upBound – 这些变量的范围上限。默认值为正无穷大。

  • cat – 这些变量所属的类别,整数型或连续型(默认)

返回:

一个 LpVariable 的字典

fixValue()[源代码]

如果存在初始值,则将下限和上限更改为初始值。:return: None

classmethod fromDict(dj=None, varValue=None, **kwargs)[源代码]

从字典(kwargs)中的信息初始化一个变量对象

参数:
  • dj – 变量的影子价格

  • varValue (float) – 设置变量的值

  • kwargs – 初始化变量的参数

返回:

一个 LpVariable

返回类型:

:LpVariable

classmethod from_dict(dj=None, varValue=None, **kwargs)

从字典(kwargs)中的信息初始化一个变量对象

参数:
  • dj – 变量的影子价格

  • varValue (float) – 设置变量的值

  • kwargs – 初始化变量的参数

返回:

一个 LpVariable

返回类型:

:LpVariable

isFixed()[源代码]
返回:

如果 upBound 和 lowBound 相同,则为 True

返回类型:

bool

setInitialValue(val, check=True)[源代码]

将变量的初始值设置为 val。如果求解器支持,可以用于求解器的预热启动。

参数:
  • val (float) – 设置给变量的值

  • check (bool) – 如果为真,我们检查值是否在变量范围内

返回:

如果值已设置则为真

抛出:

ValueError – 如果 check=True 且值不在边界内

toDict()[源代码]

将一个变量及其相关信息导出到字典中

返回:

包含变量信息的字典

返回类型:

dict

to_dict()

将一个变量及其相关信息导出到字典中

返回:

包含变量信息的字典

返回类型:

dict

示例:

>>> x = LpVariable('x',lowBound = 0, cat='Continuous')
>>> y = LpVariable('y', upBound = 5, cat='Integer')

给出 \(x \in [0,\infty)\), \(y \in (-\infty, 5]\), 一个整数。


class pulp.LpAffineExpression(e=None, constant=0, name=None)[源代码]

基类:OrderedDict

一个 LpVariables 的线性组合。可以通过以下方式初始化:

  1. e = None: 一个空的表达式

  2. e = dict: 给出一个表达式,其中值是键的系数(项的顺序未确定)

  3. e = 包含2元组的列表或生成器:相当于 dict.items()

  4. e = LpElement: 一个长度为1且系数为1的表达式

  5. e = other: 常量被初始化为 e

示例

>>> f=LpAffineExpression(LpElement('x'))
>>> f
1*x + 0
>>> x_name = ['x_0', 'x_1', 'x_2']
>>> x = [LpVariable(x_name[i], lowBound = 0, upBound = 10) for i in range(3) ]
>>> c = LpAffineExpression([ (x[0],1), (x[1],-3), (x[2],4)])
>>> c
1*x_0 + -3*x_1 + 4*x_2 + 0

简而言之,\(\textsf{LpAffineExpression([(x[i],a[i]) for i in I])} = \sum_{i \in I} a_i x_i\) 其中(注意顺序):

  • x[i] 是一个 LpVariable

  • a[i] 是一个数值系数。

addInPlace(other, sign=1)[源代码]
参数:

sign (int) – 要执行的操作的符号。如果我们加上其他 => 1 如果我们减去其他 => -1

asCplexLpAffineExpression(name, constant=1)[源代码]

返回一个字符串,该字符串表示 Affine Expression 的 lp 格式

asCplexVariablesOnly(name)[源代码]

asCplexLpAffineExpression 的辅助工具

copy()[源代码]

复制自身,除了名称被重置

sorted_keys()[源代码]

返回按名称排序的键列表

toDict()[源代码]

LpAffineExpression 导出为字典列表,但不导出常数

返回:

带有系数的字典列表

返回类型:

list

to_dict()

LpAffineExpression 导出为字典列表,但不导出常数

返回:

带有系数的字典列表

返回类型:

list


pulp.lpSum(vector)[源代码]

计算一系列线性表达式的和

参数:

vector – 线性表达式列表

约束条件

class pulp.LpConstraint(e=None, sense=0, name=None, rhs=None)[源代码]

基类:LpAffineExpression

一个线性规划约束

参数:
  • eLpAffineExpression 的一个实例

  • sense – 其中之一 LpConstraintEQ, LpConstraintGE, LpConstraintLE (分别为0, 1, -1)

  • name – 识别字符串

  • rhs – 约束目标的数值

addInPlace(other, sign=1)[源代码]
参数:

sign (int) – 要执行的操作的符号。如果我们加上其他 => 1 如果我们减去其他 => -1

asCplexLpConstraint(name)[源代码]

返回一个约束作为字符串

changeRHS(RHS)[源代码]

修改约束的右侧,以便在解析中可以对其进行修改

copy()[源代码]

制作自身的副本

classmethod fromDict(_dict)[源代码]

从包含必要信息的字典初始化一个约束对象

参数:

_dict (dict) – 带有数据的字典

返回:

一个新的 LpConstraint

classmethod from_dict(_dict)

从包含必要信息的字典初始化一个约束对象

参数:

_dict (dict) – 带有数据的字典

返回:

一个新的 LpConstraint

makeElasticSubProblem(*args, **kwargs)[源代码]

通过向一个硬约束添加变量来构建一个弹性子问题

使用 FixedElasticSubProblem

toDict()[源代码]

将约束信息导出到字典中

返回:

包含所有约束信息的字典

class pulp.FixedElasticSubProblem(constraint, penalty=None, proportionFreeBound=None, proportionFreeBoundList=None)[源代码]

基类:LpProblem

包含将固定约束 \(\sum_{i}a_i x_i = b\) 转换为弹性约束所生成的子问题。

参数:
  • constraint – 基于弹性约束的 LpConstraint

  • penalty – 违反约束的惩罚(正值或负值)

  • proportionFreeBound – 约束违反的比例界限(正和负),不受惩罚

  • proportionFreeBoundList – 无惩罚的约束违反的比例界限,表示为一个列表,其中 [-ve, +ve]

创建一个线性规划问题

此函数创建一个新的 LP 问题,并指定相关的参数

参数:
  • name – 输出 .lp 文件中使用的问题名称

  • sense – LP 问题目标的类型。可以是 LpMaximize

返回:

一个线性规划问题

alterName(name)[源代码]

更改问题中匿名部分的名字

deElasticize()[源代码]

去弹性约束

findDifferenceFromRHS()[源代码]

实际值与 RHS(含义:LHS - RHS)的偏差量

findLHSValue()[源代码]

对于弹性约束,找到不包含自由变量和或惩罚变量的约束的LHS值,并假设常数在rhs上。

isViolated()[源代码]

如果惩罚变量非零,则返回 true

reElasticize()[源代码]

在解除弹性后,再次使子问题具有弹性

组合与排列

pulp.combination(iterable, r)

返回可迭代对象中元素的连续 r 长度组合。

combinations(range(4), 3) –> (0,1,2), (0,1,3), (0,2,3), (1,2,3)

pulp.allcombinations(orgset, k)[源代码]

返回 orgset 中最多包含 k 个项目的所有组合

参数:
  • orgset – 要迭代的列表

  • k – 子集的最大基数

返回:

子集的迭代器

例子:

>>> c = allcombinations([1,2,3,4],2)
>>> for s in c:
...     print(s)
(1,)
(2,)
(3,)
(4,)
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
pulp.permutation(iterable, r=None)

返回迭代对象中元素的连续 r 长度排列。

permutations(range(3), 2) –> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)

pulp.allpermutations(orgset, k)[源代码]

返回 orgset 中最多包含 k 个项目的所有排列

参数:
  • orgset – 要迭代的列表

  • k – 子集的最大基数

返回:

子集的迭代器

例子:

>>> c = allpermutations([1,2,3,4],2)
>>> for s in c:
...     print(s)
(1,)
(2,)
(3,)
(4,)
(1, 2)
(1, 3)
(1, 4)
(2, 1)
(2, 3)
(2, 4)
(3, 1)
(3, 2)
(3, 4)
(4, 1)
(4, 2)
(4, 3)
pulp.value(x)[源代码]

返回变量/表达式 x 的值,如果 x 是数字则返回 x 本身。