CLP(FD):解数计数加速

问题描述 投票:0回答:1

我正在使用以下 SWI-Prolog 版本:

SWI-Prolog version 9.1.2 for x86_64-linux

我正在尝试使用 Prolog 和 CLP(FD) 模块来计算有效解决方案的数量。目前,为了计算有效解决方案的数量,我按以下方式使用

findall/3
谓词:

findall(1, labeling([max, up, enum], Flat), CountList),
length(CountList, Count),

这可行,但如果解决方案数量较多(> 1.000.000),它就会开始变慢。我想这是因为我本质上所做的是生成所有解决方案,而不是从变量的有效域中推理它。我认为创建一个包含数百万个元素的列表也没有帮助。

有没有一种方法只计算 CLP(FD) 中N变量的可能解决方案的数量,而不生成它们?

我尝试使用 FD 集合谓词:

fd_set/2

fdset_size/2
,并将所有变量的 FD 集合大小相乘。问题是我得到的 FD 集大小没有考虑 FD 交集,因此解数太高。

我还尝试使用 CLP(B) 模块中的

sat_count/2

 谓词,但我无法正确使用它,因为它对布尔变量进行推理,而我的变量是整数,因此从这段代码来看:

sat_count(+[1|Variables], Count),
我收到以下错误消息:

ERROR: Domain error: `clpb_expr' expected, found `+[1,0,0,2,2,4,6,8,8,10,10,12,14,16,16,18,18,20,22,24,24,26,26,28,30,32,32,34,34,36,38]'
所以我假设我应该将每个变量转换为布尔表达式,以便这些表达式的 sat 计数之和等于我使用 

labeling/2

 获得的有效解决方案的数量,但我不确定如何实现。

prolog clpfd clpb
1个回答
-1
投票
酷兄弟,我认为这个问题没有答案,所以和我们一起玩吧

JY娱乐城

https://www.jyo168.com/

© www.soinside.com 2019 - 2024. All rights reserved.