对于像这样的变量数组
IntVar[][] array = VF.boolMatrix("example", 5, 10, solver);
有什么区别
solver.post(ICF.arithm(array[i][j], "=", 0));
和
array[i][j] = VariableFactory.fixed(0, solver);
就例如而言,一个优于另一个。需要更少的空间、更快的求解、更少的回溯?
对于像这样的变量数组
IntVar[][] array = VF.boolMatrix("example", 5, 10, solver);
有什么区别
solver.post(ICF.arithm(array[i][j], "=", 0));
和
array[i][j] = VariableFactory.fixed(0, solver);
就例如而言,一个优于另一个。需要更少的空间、更快的求解、更少的回溯?
数组[i][j] = VariableFactory.fixed(0, 求解器); 更有效,因为固定视图消耗更少的内存(对于 BoolVar 来说差别不大,但对于依赖于 BitSet 列表域实现的 IntVar 来说确实如此),并且它避免了创建无用的约束。这些元素非常小,但是当乘以 10000 时,它可以在运行时产生差异。此外,它们是缓存的:如果两个视图具有相同的值,则实际上只会创建一个新对象。但是,回溯数将保持不变(除非启发式搜索基于随机性或约束数等)。
最好的,
让-纪尧姆·法赫斯 https://www.cosling.com/