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()関数を呼び出そうとすると、その関数が期待していたものに合わないというエラーメッセージが表示されます。これは、入力の数が間違っているか、そのタイプが期待どおりでないことが原因です。コードはトップレベルで同一なので、後者の説明であると仮定することができます。タイプに問題がある可能性があります。

まず、エラー出力を調べて、ドット関数のどの呼び出しが責任を負うかを確認し(2つあるように見えます)、呼び出しの直前に行を挿入して、使用する入力に関する情報を出力します。 typeof()機能を使用できます。そして、あなたが送っているものを比較して、dot()が本当に望んでいるものと比較してください。

0

同じモデルで2つのメソッド呼び出しを使用することはできません。毎回異なる変数を定義するためです。だから、m1全体最初for ... endループは

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

(私はabは、他の場所で定義されていると仮定)

で交換しなければなりません
関連する問題