Optimization 锌矿模型的优化

Optimization 锌矿模型的优化,optimization,constraint-programming,nonlinear-optimization,minizinc,Optimization,Constraint Programming,Nonlinear Optimization,Minizinc,我有一个迷你锌模型,它应该找到d[1..n]和o[1..k,0..n],这样 x[k]=o[k,0]+d[1]*o[k,1]+d[2]*o[k,2]。。。d[n]+o[k,n]和o[k,i]的绝对值之和最小化 我有许多不同的x[I]和d[1..n]对于所有的x[I]和d[1..n]应该保持不变 我有一个工作模型,粘贴在下面,它在n=2的情况下很快(不到一秒钟)找到了一个很好的解决方案。但是,如果我在一小时后转到n=3(代码中的num_dims),我没有得到任何答案,除了一个简单的答案(xi=o0

我有一个迷你锌模型,它应该找到d[1..n]和o[1..k,0..n],这样 x[k]=o[k,0]+d[1]*o[k,1]+d[2]*o[k,2]。。。d[n]+o[k,n]和o[k,i]的绝对值之和最小化

我有许多不同的x[I]和d[1..n]对于所有的x[I]和d[1..n]应该保持不变

我有一个工作模型,粘贴在下面,它在n=2的情况下很快(不到一秒钟)找到了一个很好的解决方案。但是,如果我在一小时后转到n=3(代码中的num_dims),我没有得到任何答案,除了一个简单的答案(xi=o0),即使这个问题有点递归,对于2维的一个好的答案可以作为3维的起点,通过使用O0作为席西,对于一个新的2维问题。 我以前使用过Minizing,但是,我没有OR或优化方面的背景,因此我真的不知道如何优化我的模型。对于如何做到这一点的任何提示,我都会很有帮助,可以通过添加约束或以某种方式指导搜索。有没有办法在Minizing中调试此类性能问题

我当前的型号:

% the 1d offsets
array [1 .. num_stmts] of int : x;
x = [-10100, -10001, -10000, -9999, -9900, -101, -100, -99, -1, 1, 99, 100, 101, 9900, 9999, 10000, 10001, 10100];
int : num_stmts = 18;

% how many dimensions we decompose into
int : num_dims = 2;

% the dimension sizes
array [1 .. num_dims] of var int : dims;

% the access offsets
array [1 .. num_stmts, 1 .. num_dims] of var int : offsets;

% the cost function: make access distance (absolute value of offsets) as small as possible
var int : cost = sum (s in 1 .. num_stmts, d in 1 .. num_dims) (abs(offsets[s,d]));

% dimensions must be positive
constraint forall (d in 1 .. num_dims) (dims[d] >= 0);

% offsets * dimensions must be equal to the original offsets
constraint forall (s in 1 .. num_stmts) (
  x[s] = offsets[s,1] + sum(d in 2 .. num_dims) (offsets[s,d] * dims[d-1])
 );

% disallow dimension crossing
constraint forall (s in 1 .. num_stmts, d in 1 .. num_dims) (
  abs(offsets[s,d]) < dims[d]
 );

% all dims together need to match the array size
constraint product (d in 1..num_dims) (dims[d]) = 1300000;

solve minimize cost;

output ["dims = ", show(dims), "\n"] ++
       [ if d == 1 then show_int(6, x[s]) ++ " = " else "" endif ++ 
       " " ++ show_int(4, offsets[s, d]) ++ if d>1 then " * " ++ show(dims[d-1]) else "" endif ++
       if d == num_dims then "\n" else " + " endif  |
   s in 1 .. num_stmts, d in 1 .. num_dims];
%1d偏移量
int:x的数组[1..num_stmts];
x=[-10100,-10001,-10000,-9999,-9900,-101,-100,-99,-99,-1,1,99,100,101,9900,9999,10000,10001,10100];
int:num_stmts=18;
%我们分解成多少个维度
int:num_dims=2;
%尺寸
变量int的数组[1..num_dims]:dims;
%访问偏移量
变量int:offset的数组[1..num_stmts,1..num_dims];
%成本函数:使访问距离(偏移的绝对值)尽可能小
var int:成本=总和(1..num stmts中的s,1..num dims中的d)(绝对值(偏移量[s,d]);
%维度必须为正
对所有(1..num_dims中的d)的约束(dims[d]>=0);
%偏移*尺寸必须等于原始偏移
1..num stmts中的所有约束(
x[s]=偏移量[s,1]+和(2..num_dims中的d)(偏移量[s,d]*dims[d-1])
);
%不允许维度交叉
所有(1..num\u stms中的s,1..num\u dims中的d)的约束(
abs(偏移量[s,d])1,则“*”++show(dims[d-1])else”结束++
如果d==num_dims,则“\n”else“+”endif|
1..num_stmts中的s,1..num_dims中的d];

您正在使用Minizing IDE吗?您是否尝试过使用不同的解算器

我正在努力解决将
n
随机正整数分成
m
组(
m
)的问题,其中每组的总和应尽可能接近其他数字


n
达到100左右和
m
达到10左右时,所需时间明显延长(30分钟+),结果不令人满意。这是使用默认的Gecode(捆绑)解算器。碰巧,我检查了每个解算器,发现投币或CBC(捆绑)在15秒内找到了最佳解决方案。

您是否使用Minizing IDE?您是否尝试过使用不同的解算器

我正在努力解决将
n
随机正整数分成
m
组(
m
)的问题,其中每组的总和应尽可能接近其他数字


n
达到100左右和
m
达到10左右时,所需时间明显延长(30分钟+),结果不令人满意。这是使用默认的Gecode(捆绑)解算器。碰巧,我检查了每个解算器,发现投币或CBC(捆绑)在15秒内找到了最佳解决方案。

您对决策变量
dims
偏移量
的期望值是多少?与其使用
int
,不如限制它们的值域。确保产品
偏移量[s,d]*dims[d-1]
不会溢出。限制DIM和偏移量可以解决问题,即,如果我将它们设置在-200..200的范围内。对于这个特定的问题,我知道正确的答案是dims=[100100130],我可以做到。但是,一般来说,每个DIM都可能大到1300000,这会导致整数溢出。遗憾的是Minizing似乎不支持bignum算法。使用以下策略而不是“求解最小化成本”,Gecode在大约25秒内求解“num_dims=8”:“solve::int_search(dims,first_fail,indomain_split,complete)最小化成本”;然而,num_dims高达8的所有解决方案的成本均为80。这是正确的吗?如果是这样,则可以在模型中使用。您希望决策变量
dims
偏移量
的值是多少?与其使用
int
,不如限制它们的值域。确保产品
偏移量[s,d]*dims[d-1]
不会溢出。限制DIM和偏移量可以解决问题,即,如果我将它们设置在-200..200的范围内。对于这个特定的问题,我知道正确的答案是dims=[100100130],我可以做到。但是,一般来说,每个DIM都可能大到1300000,这会导致整数溢出。遗憾的是Minizing似乎不支持bignum算法。使用以下策略而不是“求解最小化成本”,Gecode在大约25秒内求解“num_dims=8”:“solve::int_search(dims,first_fail,indomain_split,complete)最小化成本”;然而,num_dims高达8的所有解决方案的成本均为80。这是正确的吗?如果是,则可以在模型中使用。