我正在尝试使用整数线性编程来建模Conway's game of life规则,但是我坚持使用其中一条规则。
我认为有限 n x n
网格。网格中的每个单元格都与变量X(i,j)
相关联,如果单元格已死,则其值为0
,如果单元格处于活动状态,则为1
。
我对静物特别感兴趣,即根据规则不会瞬间改变为下一个的配置。
为了找到它们,我对每个细胞的邻居数施加了限制。因此,要使活着的单元格保持静止,它必须具有2
或3
个邻居,这很容易表达:
2(1-X(i,j)) + Σ(i,j) >= 2
-5(1 - X(i,j)) + Σ(i,j) <= 3
Σ(i, j)
是(i, j)
的邻居的总和(假设在网格之外,值都是0
s。)
如果X(i,j) == 0
,那么第一个加数可以保证满足约束条件。当X(i, j) == 1
约束条件保证我们有静物时。
问题是另一条规则:对于死细胞保持死亡,它必须具有与3
不同的任意数量的邻居。
但是,AFAIK不能在约束中使用!=
。
我最接近的是:
X(i, j) + |Σ(i, j) - 3| > 0
哪个表达我想要的,但问题是我不认为绝对值可以这样使用(只能表达单个变量的绝对值。或者有没有办法表达这种特殊情况?)。
我想知道,是否有一种表达!=
的标准方式?
我在想,也许我应该使用多个不等式而不是单个不等式(例如,对于每个可能的三个/四个邻居......),但我想不出任何合理的方法来实现它。
或许有一些方法可以滥用优化功能来惩罚这种情况,因此,获得最佳结果会产生正确的解决方案(或根据价值确定不可能的状态)。
是否有人能够使用线性不等式和变量X(i, j)
(加上最终的一些新变量)表达该约束?
答案 0 :(得分:2)
表达的标准方式
表示为
引入一个新的二元变量,指示哪个不等式成立。
第7.4节解释了here。
简而言之,如果我们将y
定义为
然后我们需要添加约束
哪里
这是建立此模型的标准方式,但在特定应用程序中可能有更好的方法。通常,总和上的边界越紧密,求解器性能越好。