Julia 无法访问JuMP.variable的第一个元素
我有一个线性规划优化代码,我想在另一个代码中使用它,目前,当我从代码中调用函数时,我正在努力修复函数中的Julia 无法访问JuMP.variable的第一个元素,julia,Julia,我有一个线性规划优化代码,我想在另一个代码中使用它,目前,当我从代码中调用函数时,我正在努力修复函数中的BoundsError: using JuMP function scan_maker(A) m = JuMP.Model(solver=ClpSolver(PrimalTolerance=1e-3, DualTolerance=1e-3, InfeasibleReturn=1, PresolveType=1)) # m = Model(solver=GurobiSolver(
BoundsError
:
using JuMP
function scan_maker(A)
m = JuMP.Model(solver=ClpSolver(PrimalTolerance=1e-3, DualTolerance=1e-3, InfeasibleReturn=1, PresolveType=1))
# m = Model(solver=GurobiSolver())
level = size(A, 2)
v = zeros(Int, level)
ub = zeros(Int, level)
lb = zeros(Int, level)
@variable(m, x[1:level])
@constraint(m, con, A*x.>=0)
function setc(c)
for i = 1:size(A, 1)
m.linconstr[i].lb = float(c[i])
end
end
function scan(c::Channel)
i = 1
init = 1
while i > 0
if i >= init
@objective(m, Max, x[i])
res = JuMP.solve(m, suppress_warnings=true)
if res==:Optimal || res==:Unbounded
ub[i] = round(Int, getvalue(x[i]))
setobjectivesense(m, :Min)
res = JuMP.solve(m, suppress_warnings=true)
@assert res==:Optimal || res==:Unbounded
lb[i] = round(Int, getvalue(x[i]))
v[i] = lb[i]
init += 1
else
@assert res==:Infeasible
i -= 1
continue
end
elseif v[i] < ub[i]
v[i] += 1
else
setupperbound(x[i], Inf)
setlowerbound(x[i], -Inf)
init -= 1
i -= 1
continue
end
if i >= level
put!(c, v)
continue
else
setupperbound(x[i], v[i])
setlowerbound(x[i], v[i])
i += 1
end
end
close(c)
end
return setc, scan
end
然后我调用函数:prob(200)
它显示了这个错误:
BoundsError:尝试访问索引[1]处的0元素数组{JuMP.Variable,1}
我知道在函数的这个表达式中出现了错误:nab=vi2*x+b
,它正是在我在这篇文章中放入的第一个函数中创建的变量x
:@variable(m,x[1:level])
,但我一直在想如何解决这个问题。
要进一步检查我遇到此问题的函数,您可以检查以下链接:当您的问题太长(远离MWE-最小工作示例)且不清楚时,让我们假设您希望使用跳转处理数组变量。下面是一个简单的例子:
using JuMP
using GLPK
m = Model(with_optimizer(GLPK.Optimizer))
@variable(m, x[1:2] >= 0)
@constraint(m, x[1]+2x[2] <= 100)
@objective(m, Max, 3x[1]+7x[2])
optimize!(m)
使用跳转
使用GLPK
m=模型(带有_优化器(GLPK.optimizer))
@变量(m,x[1:2]>=0)
@约束(m,x[1]+2x[2]当您的问题太长(远离MWE-最小工作示例)且不清楚时,让我们假设您希望使用跳转处理数组变量。下面是一个最小示例:
using JuMP
using GLPK
m = Model(with_optimizer(GLPK.Optimizer))
@variable(m, x[1:2] >= 0)
@constraint(m, x[1]+2x[2] <= 100)
@objective(m, Max, 3x[1]+7x[2])
optimize!(m)
使用跳转
使用GLPK
m=模型(带有_优化器(GLPK.optimizer))
@变量(m,x[1:2]>=0)
@约束(m,x[1]+2x[2]你似乎不理解我的问题,所以让我试着重新表述一下,假设我们的答案中有你用频道编写的代码,你试图调用另一个名为prob
的函数中的变量x
,正如你在另一个文件的帖子中看到的,但是当你用调用它时e> 对于您看到的prob
函数的
循环,它会显示一个BoundsError:尝试访问索引[1]处的0元素数组{JuMP.Variable,1}
您需要重写您的问题,并将您的代码简化为一个最小的工作示例,以获得答案,否则我只能猜测您需要什么:似乎您不理解我的问题,所以让我尝试重新表述一下,假设我们的答案中有您使用频道编写的代码,并且您正在尝试调用变量x
在另一个名为prob
的函数中,正如您在另一个文件的帖子中看到的,但是当您使用for
循环调用它时,您会看到prob
函数,然后它会显示一个BoundsError:尝试访问索引[1]处的0元素数组{JuMP.variable,1}
您需要重写您的问题,并将您的代码简化为最小的工作示例,以获得答案,否则我只能猜测您需要什么:
julia> println(m)
Max 3 x[1] + 7 x[2]
Subject to
x[1] + 2 x[2] <= 100.0
x[1] >= 0.0
x[2] >= 0.0
julia> value.(x)
2-element Array{Float64,1}:
0.0
50.0