【问题标题】:LoadError: MethodError: no method matching mod(::VariableRef, ::Float64)LoadError: MethodError: 没有方法匹配 mod(::VariableRef, ::Float64)
【发布时间】:2021-08-05 16:20:24
【问题描述】:

我是 Julia 和 JuMP 的新手,我将使用这个库。

尝试定义以下约束,定义变量后,我收到错误:

for r = 1:11
    for d = 1:7
        for s = 1:12
            @constraint(model, mod(ris_day_ora[r,d,s],0.5)==0)
        end
    end
end

这里的错误:

ERROR: LoadError: MethodError: no method matching mod(::VariableRef, ::Float64)

你能帮帮我吗?

提前非常感谢!

【问题讨论】:

    标签: julia julia-jump


    【解决方案1】:

    在 JuMP 约束中不能有 mod

    您需要重新制定模型,有很多方法可以做到这一点。 在您的情况下,最简单的方法是将ris_day_ora 声明为Int,然后将其除以2

    @variable(model, ris_day_ora[1:11, 1:7, 1:12] >=0, Int)
    

    现在代码中到处都使用ris_day_ora[r,d,s]/2.0 而不是ris_day_ora[r,d,s]

    编辑:

    如果您的变量 ris_day_ora 采用三个值 00.51,您只需将其建模为:

    @variable(model, 0 <= ris_day_ora[1:11, 1:7, 1:12] <= 2, Int)
    

    并且在模型中的每个地方都将其用作0.5 * ris_day_ora[r,d,s]

    编辑 2

    也许您正在寻找更通用的解决方案。考虑x,它只能是0.10.30.7,这可以写成:

    @variable(model, x)
    @variable(model, helper[1:3], Bin)
    @contraint(model, x == 0.1*helper[1] + 0.3*helper[2] + 0.7*helper[3])
    @contraint(model, sum(helper) == 1)
    

    【讨论】:

    • 感谢普热梅斯劳!就我而言,变量 ris_day_ora 应该是以下值之一:0、0.5、1。如何对约束进行建模?
    猜你喜欢
    • 2019-09-29
    • 2017-06-16
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多