【问题标题】:LoadError: MethodError: no method matching Value(::Array{VariableRef,1})LoadError: MethodError: 没有方法匹配 Value(::Array{VariableRef,1})
【发布时间】:2019-09-29 18:55:23
【问题描述】:

我对 Julia 比较陌生,并且一直在努力学习它。所以我遇到了一个单位承诺问题的例子;但是,它对我不起作用,因为我收到了这个错误:

    LoadError: MethodError: no method matching 
    value(::Array{VariableRef,1})
    Closest candidates are:
    value(!Matched::NonlinearExpression) at ***\packages\JuMP\jnmGG\src\nlp.jl:1126
    value(!Matched::NonlinearParameter) at ***\packages\JuMP\jnmGG\src\nlp.jl:125
    value(!Matched::VariableRef) at ***\packages\JuMP\jnmGG\src\variables.jl:721
    ...
in expression starting at untitled-c2a2b8253aafb31b0a191c03db8d0489:41
solve_uc(::Array{Int64,1}, ::Array{Int64,1}, ::Array{Int64,1}, ::Int64, 
::Int64, ::Int64) at untitled-c2a2b8253aafb31b0a191c03db8d0489:38
top-level scope at none:0

代码本身在这里(我从教程中获取):

    using JuMP 
    using GLPK
    using MathOptInterface
    const MOI = MathOptInterface
    using Interact

    const g_max = [1000,1000];
    const g_min = [0,300];
    const c_g = [50,100];
    const c_g0 = [1000,0]
    const c_w = 50;
    const d = 1500;
    const w_f = 200;

    function solve_uc(g_max, g_min, c_g, c_w, d, w_f)
uc=Model(with_optimizer(GLPK.Optimizer)) 

@variable(uc, 0 <= g[i=1:2] <= g_max[i]) 
@variable(uc, u[i=1:2], Bin)
@variable(uc, 0 <= w  <= w_f )

@objective(uc,Min,sum(c_g[i] * g[i] for i in 1:2) + c_w * w)


for i in 1:2
    @constraint(uc,  g[i] <= g_max[i] * u[i]) 
    @constraint(uc,  g[i] >= g_min[i] * u[i]) 
end

@constraint(uc, w <= w_f)

    @constraint(uc, sum(g[i] for i in 1:2) + w == d)

    status = optimize!(myModel)


    return status, value(g), value(w), w_f-value(w), value(u), objective_value(uc)
end

    status,g_opt,w_opt,ws_opt,u_opt,obj=solve_uc(g_max, g_min, c_g, c_w, d, w_f);

谢谢。

【问题讨论】:

    标签: optimization julia julia-jump


    【解决方案1】:

    欢迎来到 SO!

    由于gu 是变量的数组,您需要在gu 上调用broadcastvalue 的调用,并使用单个点(@987654331 @) 在函数名之后。改变

    return status, value(g), value(w), w_f-value(w), value(u), objective_value(uc)
    

    return status, value.(g), value(w), w_f-value(w), value.(u), objective_value(uc)
    

    应该修复错误。

    请注意,这是 Julia 中的常见样式。这些函数通常仅针对单个元素编写,并且要将函数应用于元素的数组(或通常应用于元素集合),您可以使用the dot-syntax 轻松地在数组上广播调用。 (即f.(A))。

    虽然看起来与您收到的错误无关,但 status = optimize!(myModel) 行引用了未在您的函数范围内定义的变量 myModel。你应该把它改成status = optimize!(uc)

    【讨论】:

    • 谢谢!碰巧,你能推荐一些关于 Julia 语法的教程/教科书吗?还是 JuMP 教程是最好的?
    • @ArseniiGrinchenko The official documentation 是一个很好的资源。恕我直言,函数、方法、多维数组、变量范围、类型和性能提示部分应该是第一个阅读的部分。官网上有Learning页面。 Julia Language YouTube 频道列出了一些关于 Julia 和 JuMP 的教程。我不是真正的 JuMP 用户,但 JuMP 的官方 repo 有一个 examples 目录,并且有一些 tutorial notebooks 可用。
    猜你喜欢
    • 1970-01-01
    • 2016-06-04
    • 2020-07-05
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多