LoadError: MethodError: нет метода, соответствующего Value (:: Array {VariableRef, 1})

Я относительно новичок в Джулии и пытаюсь научиться этому. Итак, я наткнулся на пример проблемы с обязательством подразделения; однако у меня это не работает, так как я получаю эту ошибку:

    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);

Спасибо.


person Arsenii Grinchenko    schedule 12.05.2019    source источник


Ответы (1)


Добро пожаловать в SO!

Поскольку g и u являются массивами переменных, вам необходимо транслировать вызов value через g и u с одной точкой (.) после имени функции. Изменение

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

to

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

должен исправить ошибку.

Обратите внимание, что это общий стиль Джулии. Функции обычно пишутся только для отдельных элементов, и для применения функций к массиву (или в целом к ​​коллекции) элементов вы можете легко транслировать вызов по массиву с помощью точечный синтаксис. (т.е. f.(A)).

Хотя кажется, что это не имеет отношения к полученной вами ошибке, строка status = optimize!(myModel) относится к переменной myModel, которая не определена в области действия вашей функции. Вам, вероятно, следует изменить его на status = optimize!(uc).

person hckr    schedule 12.05.2019
comment
Спасибо! Случайно, можете ли вы предложить несколько руководств / учебников по синтаксису в Julia? Или уроки по JuMP самые лучшие? - person Arsenii Grinchenko; 12.05.2019
comment
@ArseniiGrinchenko Официальная документация - хороший ресурс. Разделы «Функции», «Методы», «Многомерные массивы», «Объем переменных», «Типы» и «Советы по производительности» должны, IMHO, быть первыми, которые нужно прочитать. На официальном сайте есть страница Learning. На YouTube-канале Julia Language есть несколько руководств о Julia и JuMP. На самом деле я не являюсь пользователем JuMP, но в официальном репозитории JuMP есть каталог examples и есть несколько записных книжек с инструкциями доступно. - person hckr; 12.05.2019