LoadError: MethodError: no method matching Value(::Array{VariableRef,1})
LoadError: MethodError: no method matching Value(::Array{VariableRef,1})
我对 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);
谢谢。
欢迎来到 SO!
由于 g
和 u
是 数组 变量,您需要 broadcast 对 value
的调用超过 g
和 u
在函数名称后加一个点 (.
)。改变
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 比较陌生,一直在努力学习它。所以我遇到了一个单位承诺问题的例子;但是,它对我不起作用,因为我收到此错误:
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);
谢谢。
欢迎来到 SO!
由于 g
和 u
是 数组 变量,您需要 broadcast 对 value
的调用超过 g
和 u
在函数名称后加一个点 (.
)。改变
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)
.