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在別處被定義)

相關問題