考虑上图,它代表了一个常见的约束满足问题:
- 六边形是六边形网格上的单元格,该网格在其6个方向中的任一个方向上延伸.为了简单起见,我只包括其中的3个,
A
、B
和C
. - 每个六边形包含一组由
N
个值组成的值,通常称为六边形的"域".在本例中,为domain = {red, blue}
和|domain| = N = 2
. - A constraint is defined as an edge from one particular domain value of a hexagon to the domain value of another hexagon. So an example here would be
A_blue -> B_red
.- 一条边not将显示在六边形的内部.所以
A_red -> A_blue
是不可能的. - 可能存在周期.直接或间接地(通过另一个六边形).
- Technically,边可以显示在栅格上(非相邻之间),但该细节与此问题无关.
- 一条边not将显示在六边形的内部.所以
现在,考虑一个从六边形中删除域值的操作.这样做会影响其他六边形的域,并导致域值从其他六边形中删除.例如,从A
中删除blue
将导致A_blue -> C_red -> B_blue -> A_red
全部被删除.然而,它将not导致C_blue
被移除,因为C_blue
有2
条边指向它(另一条来自B_red
).
问题是,如何传播这种"涟漪"的变化.即,当一个域值被移除时,如何将该改变传播到所有其他六边形.有大量的算法在优化这个操作的效率,但我更感兴趣的是如何在Rust中自动传播这种更改(如果可能的话).请允许我解释一下.
通常,您会 for each 六边形的每个域值保留一个计数器,当一个域值被移除时,为邻近的(受影响的)六边形递减该计数器.如果这个计数器达到0
,那么您就知道是时候further传播更改了,如果您愿意的话,这是一个花哨的BFS/DFS.
但我很好奇,用std::rc::Rc
会不会让我用automatically来减少这个计数器,因为std::rc::Rc
无论如何都是一个计数器.
到目前为止,我已经考虑将std::rc::Rc
与std::rc::Weak
相结合,在其中我将在六边形中存储对其他std::rc::Rc
个域值的Weak
引用.然后,我会以某种方式删除Weak
引用的内容,这样存储在其中的Rc
就会被删除,这种更改就会产生涟漪,但我认为我没有朝着正确的方向前进.我可能需要内在的易变性.或许这根本不可能.
对于铁 rust 来说,这是非常陌生的.有谁有什么主意吗?