让我们有以下假设的场景..。一个有5x5的网格,比如说3位数。我们想要定义对这些位置的约束。在CLP中,我们通常用整数来定义约束,所以这是一种方法:
... Fig1X #\= 2, Fig1Y #\= 3, ....也就是说,对于每一个X和Y位置,我们都有独立的变量。是否有一种方法来定义基于整数之上的结构化变量的约束。为了举例:
.... Fig1 #\= (2,4) ...这个场景只是为了说明。
我主要感兴趣的是如何处理结构化变量,是否有标准的实践。
发布于 2018-02-25 13:09:03
特别是在几何任务方面,例如在您的示例中,至少有以下非常不同的概念方法:
X #= 2 #==> Y #\= 4来表示,如果Y等于2,则X不能是4。因此,(X,Y)与(2,4)是自动不同的。table/2、fd_relation/2等)允许显式枚举可接受的元组集或其补充。这些方法带来了不同的后果和权衡。我的个人喜好和建议大致反映在上面的顺序中。然而,取决于目前的情况,一种办法可能比另一种办法有很大的好处。
CSPs中的建模部分有时更多地被称为一门艺术而不是一门科学,这也是因为有那么多不同的可能性可供选择,而且还不清楚哪种模型是最好的,还因为涉及到许多权衡--比如方便、可移植性、可伸缩性、速度、内存等等。
发布于 2018-02-23 13:52:02
在像您这样的情况下,“结构化变量”有一个固定的结构,只包含数字字段,您不需要“结构化变量”的概念。在概念上,您只处理数字元组(或数字变量)。
有时,这些元组最好表示为 lists ,因为这样您就可以直接应用以列表作为参数的全局约束。例如,要约束点[X,Y]不位于对角线上,可以编写
alldifferent([X,Y])或者使用表约束将其约束到给定的一组坐标:
table([[X,Y]], [[1,2],[2,4],[3,1],[4,3]])在其他情况下,最好将结构与描述性函子(如point(X,Y)或rect(X1,Y1,X2,Y2) )一起使用,然后编写相应的约束包装器,如
points_differ(point(X,Y), point(V,W)) :-
X#\=V or Y#\=W.或
rect_contains_point(rect(I,J,K,L), point(PI,PJ)) :-
I #=< PI, PI #=< K,
J #=< PJ, PJ #=< L.(后一个例子取自http://eclipseclp.org/examples/shikaku.ecl.txt)
https://stackoverflow.com/questions/48937374
复制相似问题