Julia 朱莉娅:使用跳跃模型变量作为索引

Julia 朱莉娅:使用跳跃模型变量作为索引,julia,Julia,我正在Julia中编写一个程序,该程序基于约束(周围有**)最大化图像块的大小,如下面的代码所示: using Images, Colors, JuMP, Gurobi m = Model(solver=GurobiSolver(OutputFlag=0)) Idiff=load("Idiff.png") a=16; b=16; Block=Idiff[1:a,1:b]; #initial block size squareBlock=sum(Block.^2) #sum of squares

我正在Julia中编写一个程序,该程序基于约束(周围有**)最大化图像块的大小,如下面的代码所示:

using Images, Colors, JuMP, Gurobi
m = Model(solver=GurobiSolver(OutputFlag=0))
Idiff=load("Idiff.png")
a=16; b=16;
Block=Idiff[1:a,1:b]; #initial block size
squareBlock=sum(Block.^2) #sum of squares of block
@variable(m,x>=0,Int) #variable determining size of block in x
@variable(m,y>=0,Int) #variable determining size of block in y
@constraint(m,x<=192,Int)
@constraint(m,y<=144,Int)
**@constraint(m,abs(sum(Idiff[1:x,1:y]).^2-squareBlock)<=.1) #attempt to use 
the variable I am optimizing as an index**
@objective(m,Max,x+y)
使用图像、颜色、跳跃、格洛比
m=模型(解算器=GurobiSolver(OutputFlag=0))
Idiff=加载(“Idiff.png”)
a=16;b=16;
Block=Idiff[1:a,1:b]#初始块大小
squareBlock=sum(Block.^2)#Block的平方和
@变量(m,x>=0,Int)#确定x中块大小的变量
@变量(m,y>=0,Int)#确定y中块大小的变量

@约束(m,x我不确定您的约束是否正确(看起来不正确,但我不是该领域的专家)

以下是使用MIP解算器和
Bin
变量的解决方案(我不得不生成假数据,因为您没有提供源代码;我也有CPLEX而不是Gurobi,但这应该没有太大区别):

使用跳转,CPLEX
m=模型(解算器=CplexSolver())
mx=192
my=144
Idiff=兰德(mx,我的)
a=16;b=16;
块=Idiff[1:a,1:b];#初始块大小
squareBlock=sum(Block.^2)#Block的平方和
@变量(m,xi[1:mx],Bin)
@变量(m,yi[1:my],Bin)
对于1中的i:mx-1
@约束(m,xi[i]>=xi[i+1])
结束
因为我在1:my-1
@约束(m,yi[i]>=yi[i+1])
结束
@约束(m,和(Idiff[i,j]*xi[i]*yi[j]表示1中的i:mx表示1中的j:my)=sqrt(平方块-0.1))
@目标(m,Max,sum(xi)+sum(yi))
求解(m)
然而,对于这个问题(因为它相对较小,实际上只有2个变量和1个约束),不使用MIP解算器可能更快,而是对所有可能的
x
y
(您可以非常快地进行截断,因为关键约束严格地随着
x
y
增加,因此如果您在上面)

using JuMP, CPLEX
m = Model(solver=CplexSolver())
mx = 192
my = 144
Idiff = rand(mx, my)
a=16; b=16;
Block=Idiff[1:a,1:b]; #initial block size
squareBlock=sum(Block.^2) #sum of squares of block
@variable(m, xi[1:mx], Bin)
@variable(m, yi[1:my], Bin)
for i in 1:mx-1
    @constraint(m, xi[i] >= xi[i+1])
end
for i in 1:my-1
    @constraint(m, yi[i] >= yi[i+1])
end
@constraint(m,sum(Idiff[i,j]*xi[i]*yi[j] for i in 1:mx for j in 1:my) <= sqrt(squareBlock+0.1))
@constraint(m,sum(Idiff[i,j]*xi[i]*yi[j] for i in 1:mx for j in 1:my) >= sqrt(squareBlock-0.1))
@objective(m,Max,sum(xi)+sum(yi))
solve(m)