3

我创建了一个模型来解决Julia中的线性程序。我首次解决了线性程序,但相同的代码不适用于修改后的程序。你能弄清楚发生了什么事吗? 谢谢! 工作正常的代码:相同的代码在Julia中不能一致地工作

m = Model() 
@variable(m, x[1:77] >= 0) 
for i in nutrients 
    @constraint(m, dot(data[:, i], x) >= lower[i]) 
end 
@objective(m, Min, sum(dot(c, x))) 
status = solve(m) 
for i in 1:77 
    if getvalue(x[i]) > 0 
     println("Take ", getvalue(x[i]), " dollars of ", foods[i], " every day.") 
    end 
end 
println("The total cost for each day is ", getobjectivevalue(m), " dollars.") 
println("The total cost for the whole year is ", getobjectivevalue(m) * 365, " dollars.") 

这是结果:

Take 0.02951906167648827 dollars of Wheat Flour (Enriched) every day. 
Take 0.0018925572907052643 dollars of Liver (Beef) every day. 
Take 0.011214435246144865 dollars of Cabbage every day. 
Take 0.005007660466725203 dollars of Spinach every day. 
Take 0.061028563526693246 dollars of Navy Beans, Dried every day. 
The total cost for each day is 0.10866227820675685 dollars. 
The total cost for the whole year is 39.66173154546625 dollars. 

这是不起作用的代码:

m1 = Model() 
for i in 1:77 
    if i == a 
     @variable(m1, x[i] == 0) 
    elseif i == b 
     @variable(m1, x[i] == 0) 
    else 
     @variable(m1, x[i] >= 0) 
    end 
end 
for i in nutrients 
    @constraint(m1, dot(data[:, i], x) >= lower[i]) 
end 
@objective(m1, Min, sum(dot(c, x))) 
status = solve(m1) 
for i in 1:77 
    if getvalue(x[i]) > 0 
     println("Take ", getvalue(x[i]), " dollars of ", foods[i], " every day.") 
    end 
end 
println("The total cost for each day is ", getobjectivevalue(m1), " dollars.") 
println("The total cost for the whole year is ", getobjectivevalue(m1) * 365, " dollars.") 

以下是错误消息:

MethodError: no method matching dot(::NamedArrays.NamedArray{Any,1,Array{Any,1},Tuple{DataStructures.OrderedDict{Any,Int64}}}, ::JuMP.JuMPArray{JuMP.Variable,1,Tuple{Int64}}) 
Closest candidates are: 
    dot(::AbstractArray{T,1}, ::AbstractArray{T,1}) at linalg/generic.jl:302 
    dot{T,S,N}(::Array{T,N}, ::JuMP.JuMPArray{S,N,NT<:Tuple{Vararg{T,N}}}) at /Users/yiboliu/.julia/v0.5/JuMP/src/operators.jl:299 
    dot{T,S,N}(::JuMP.JuMPArray{T,N,NT<:Tuple{Vararg{T,N}}}, ::JuMP.JuMPArray{S,N,NT<:Tuple{Vararg{T,N}}}) at /Users/yiboliu/.julia/v0.5/JuMP/src/operators.jl:301 

in macro expansion; at /Users/yiboliu/.julia/v0.5/JuMP/src/macros.jl:400 [inlined] 
in macro expansion; at ./In[23]:13 [inlined] 
in anonymous at ./<missing>:? 

我知道问题在于约束,但是这部分代码是相同的,并且不起作用。你能不能告诉我发生了什么事?

回答

2

错误消息说,试图调用一个函数dot()没有什么功能已被告知要期待适合。这可能是因为输入计数错误,或者它们的类型不符合预期。由于代码在顶层是相同的,所以我们可以认为它是后面的解释,也许类型有问题。

首先检查错误输出,看看到底是哪调用点函数负责(你似乎有两个),然后只需调用有关将要使用的输入输出信息之前插入一行。您可以使用typeof()功能。然后比较你发送的是什么dot()真的想要。

0

在同一模型中不能有两个@variable方法调用,因为它们每次都会定义不同的变量。所以,整个第一for ... end回路m1必须由

@variable(m1, x[1:77] >= 0) 
@constraint(m1, x[a] == 0) 
@constraint(m1, x[b] == 0) 

更换(我想ab在别处被定义)

相关问题