gpt4 book ai didi

julia - 相同的代码在 Julia 中无法始终如一地工作

转载 作者:行者123 更新时间:2023-12-01 07:41:39 25 4
gpt4 key购买 nike

我创建了一个模型来解决 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>:?

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

最佳答案

错误消息表明调用dot() 函数的尝试不符合函数被告知的预期。这可能是因为输入的计数错误,或者它们的类型不是预期的。由于代码在顶层是相同的,我们可以假设这是后一种解释,即类型可能存在问题。

首先检查错误输出以准确地查看对点函数的调用(您似乎有两个),然后在调用之前插入一行以输出有关将使用的输入的信息。您可以使用 typeof() 函数。然后将您发送的内容与 dot() 真正想要的内容进行比较。

关于julia - 相同的代码在 Julia 中无法始终如一地工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com