【问题标题】:How to convert type of a variable when using JuMP使用 JuMP 时如何转换变量的类型
【发布时间】:2015-01-04 04:53:15
【问题描述】:

我正在使用 Julia/JuMP 来实现算法。在一部分中,我定义了一个带有连续变量的模型并求解线性模型。我做了一些其他计算,基于这些计算向模型添加了几个约束,然后我想解决相同的问题,但使用整数变量。我无法使用convert() 函数,因为它不接受变量。

我尝试再次将变量定义为整数,但模型似乎没有考虑它!我在这里提供一个示例代码:

m = Model()
@defVar(m, 0 <= x <= 5)
@setObjective(m, Max, x)
@addConstraint(m, con, x <= 3.1)
solve(m) 
println(getValue(x))
@defVar(m, 0 <= x <= 1, Bin)
solve(m) 
println(getValue(x))

你能帮我做这个转换吗?

【问题讨论】:

    标签: type-conversion julia julia-jump


    【解决方案1】:

    问题在于第二个@variable(m, 0 &lt;= x &lt;= 1, Bin) 实际上在模型中创建了一个新变量,但在 Julia 中具有相同的名称。

    要将变量从连续变量更改为二进制变量,您可以这样做

    setcategory(x, :Bin)
    

    在再次调用solve之前更改变量边界和类。

    【讨论】:

    • 谢谢 Iain,我的另一个问题是如何更改求解器?对于原始 LP,我使用m=Model(solver=GurobiSolver(PreCrush=1, Cuts=0, Presolve=0, Heuristics=0.0)),所以我可以添加我的剪辑。对于第二个问题,即IP,我希望求解器只使用B&B,不使用cut。
    • 当我更改 x 的类型时,我收到一条错误消息 type JuMPArray has no field col。但是,它在另一个小示例代码上运行良好!
    • 我的错!我应该把它放在一个 for 循环中:for j in 1:3 m.colcat[x[j].col] = :Int end.
    • 知道如何在较新的 JuMP 版本(例如 v0.21)中执行此操作吗?谢谢
    【解决方案2】:

    在较新版本的 JuMP 中,您需要使用与 setcategory 不同的函数。您正在寻找的方法是:

    • set_binary 为变量添加二进制约束。
    • unset_binary 从变量中移除二元约束。
    • set_integer 为变量添加整数约束。
    • unset_integer 从变量中移除整数约束。

    可以在here找到这方面的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 2022-11-17
      • 2021-05-14
      • 2011-07-03
      • 2017-07-20
      • 1970-01-01
      • 2015-09-26
      相关资源
      最近更新 更多