如何在Julia JuMP中使用VariableRef作为索引

如何在Julia JuMP中使用VariableRef作为索引,julia,julia-jump,Julia,Julia Jump,在朱莉娅,当我这样做时: model = Model(); set_optimizer(model, Cbc.Optimizer); N=11; model = Model(); set_optimizer(model, Cbc.Optimizer); @variable(model, X[1:N,1:N,1:N], Bin); @variable(model, 1<=K<=10, Int); for k in K @constraint(model, (sum(X[1

在朱莉娅,当我这样做时:

model = Model();
set_optimizer(model, Cbc.Optimizer);

N=11;

model = Model();
set_optimizer(model, Cbc.Optimizer);
@variable(model, X[1:N,1:N,1:N], Bin);
@variable(model, 1<=K<=10, Int);

for k in K
    @constraint(model, (sum(X[1,j,k] for j= 1:N)) ==1 )
end 
model=model();
set_优化器(模型,Cbc.optimizer);
N=11;
模型=模型();
set_优化器(模型,Cbc.optimizer);
@变量(模型,X[1:N,1:N,1:N],Bin);

@变量(模型,1如果您想
K
与其他变量交互,则需要将其设置为一个二进制向量,总和为
1
,然后使用乘法对交互进行建模

@variable(model, K[1:10], Bin);
@constraint(model, sum(K) == 1)
现在,我并不是舒尔想要实现的目标。如果您想根据
K
的值关闭和打开方程式,则如下所示:

@constraint(model,con[k in 1:10], sum(X[1,j,k] for j= 1:N)*K[k] == K[k] )
但是,这会使模型成为非线性的,您需要为其使用非线性解算器。 根据您的用例,简单地求和到
1
就足够了(这会产生一个模型,对解算器来说更容易,但您的业务需要可能与否):


非常感谢,我想解决一个经典的车辆路径问题。K是车辆(路线)的数量。目标是最小化K。在这个FOR语句(问题中)中,我想使用变量K的数量作为索引。还有一个问题,如何使用条件(如果是这样的话)约束声明?关于TSP,请看一本好书“Julia Programming for Operations Research,第二版”。启发式在这里很有效-尝试TravellingSalesmenHeuristics.jl包。您可以通过二进制变量构建
IF
条件-与我向您展示的方式非常类似。
@constraint(model,con[k in 1:10], sum(X[1,j,k] for j= 1:N) == K[k] )