3

줄리아에서 선형 프로그램을 해결하기위한 모델을 만들었습니다. 처음 선형 프로그램을 해결했지만 동일한 코드가 수정 된 프로그램에서 작동하지 않습니다. 무슨 일이 일어나는지 알아낼 수 있니? 감사합니다. 잘 작동 코드 :이 결과줄리아에서 같은 코드가 계속 작동하지 않습니다

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.") 

: 여기

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.") 

오류 메시지입니다 :

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. 

이 작동하지 않는 코드입니다

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 메서드 호출을 사용할 수 없습니다. 그래서, m1의 전체 첫번째 for ... end 루프

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

로 대체되어야한다

(나는 a 가정 및 b는 다른 곳에서 정의 된)