【问题标题】:Multiplication in the constraint - solving with pulp约束中的乘法 - 用纸浆求解
【发布时间】:2017-03-31 08:43:48
【问题描述】:

我正在尝试线性化我在纸浆中的乘法约束。

看起来像这样:

prob += (1 - Y) * (3 - X)

等于:

prob += 3 - 3*Y - X + X*Y

其中 Y 是一个二进制变量,在公式中,除了以下部分之外,所有内容都是线性的:Y*X。我试图通过使用我在另一个问题中找到的公式来解决这个问题:

Link to the question

所以我尝试使用X1*X2 = Y,使用我的代码得到X*Y = A。我使用了日志替换方法。这给了我以下代码:

prob += math.log(float(A)) = math.log(float(X)) + math.log(float(y))

还有另一个约束:

prob += 3 - 3*Y - X + A

只有这似乎不起作用,因为浮点数只能是字符串或数字,而不是LpVariable。有没有办法使用公式图像中给出的第一种替换方法来解决这个问题?

【问题讨论】:

  • 您在表格中显示的转换是非线性的。 PuLP 要求用变量之间的线性关系来表示约束。因此,不幸的是,它们是不可实现的。还有其他潜在的线性转换可用,但您需要包含有关原始问题的更多信息。

标签: python constraints multiplication pulp


【解决方案1】:

根据他们 PyPi 页面上的文档,您可能需要的只是调用 LpVariable 的值。这将为您提供可以在计算中使用的数值

https://pypi.python.org/pypi/PuLP

您可以使用 value() 获取变量的值。例如:

值(x): 2.0

所以你的函数可能可以重写为

prob += math.log(float(value(A))) = math.log(float(value(X))) + math.log(float(value(y)))

float() 声明也可能是不必要的,因为看起来 LpVariables 通常将其内部数字存储为浮点数

【讨论】:

  • 谢谢,但是当我这样做时,它说:'float() 参数必须是字符串或数字,而不是'NoneType',如果我删除 float() 声明,它会说'a float is必需的'。我认为获取 LpVariable 的日志是不可能的。
  • 挖掘他们的模块源代码,获取值是一个不同的调用抱歉。从他们在这里的代码 - github.com/coin-or/pulp/blob/master/src/pulp/pulp.py - 在 LpVariable 类中:def value(self): return self.varValue 所以要获得变量的值是 x.value() 而不是 value(x),这应该给你你的值,假设变量有一个分配给它的值。不过,您需要保留 float() 部分,在内部没有将值分配给 LpVariable 类中的浮点类型。
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多