【问题标题】:PuLP-OR: Can you delete variables already created?PuLP-OR:你能删除已经创建的变量吗?
【发布时间】:2016-08-19 17:17:48
【问题描述】:

我的问题很简单。是否可以删除我已经创建的变量?

或者我唯一的希望是不要创建变量开始?

我猜你是否可以打印一个变量然后使用:

del prob.variable

会删除它。但我找不到确切的,Python 说:

prob.variables

不可下标。

【问题讨论】:

  • 我没有在文档中看到任何内容,但我不是专家。在什么情况下你需要这个功能?如果没有使用它的限制;好吧,没关系(只是保留它们)。如果有,可能会更容易删除约束。
  • 问题是有一个约束包含所有那些不是真正有用的变量。这是一个总和约束。我希望在创建它们之后在这个非常重要的约束之前删除它们。
  • 所以这个约束不会改变可行性/目标?把它留在里面。求解器不会太在意。为什么你不能在添加这些变量或这个约束之前推断出这个没有帮助
  • 你是如何创建变量的?有几种方法。
  • 在查看了纸浆的来源后:似乎不支持删除变量!。所以你可能的方法主要是依赖于域的,就像我上面描述的那样。另一种方法:只需将这些变量设置为某个恒定值(设置下限和上限)。根据您的问题,这可能是 neg-inf、0、pos-inf 或其他(在某些复杂模型中)。这应该有助于求解器(尤其是它的预处理)删除任何不需要的工作!

标签: python optimization integer-programming pulp operations-research


【解决方案1】:

与 PuLP LP 问题 prob 相关的变量可以在 prob._variables 中找到,这是一个列表,因此您认为可以使用删除变量 var

prob._variables.remove(var)

但是,这只是删除了 prob._variables 中的第一个变量,因为出于某种原因,Python 不区分== 级别的问题变量。我的意思是如果var1var2 是与prob 关联的任意两个变量,

if var1 == var2:
    print('Equal')

总是返回“相等”。 (不要尝试var1 == var2;这将被解释为等式) .这意味着如果您尝试使用

查找var 的索引
prob._variables.index(var)

输出将始终为 0。

比我更了解 Python 的人将不得不解释发生了什么,但这里有一个解决方法:

for i, v in enumerate(prob._variables):
    if v is var:
        del prob._variables[i]

这不会从涉及它的任何约束中删除变量,而且看起来 PuLP 将解决 LP 问题,就好像变量仍然存在一样。所以我认为所有这一切都是改变属性prob._variables。我认为这对您的情况没有帮助(我不太了解),但是如果您想删除一个变量,然后引入一个与旧变量同名的新变量,这是必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 2011-06-13
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多