我试图解决序言中的约束处理问题。 我需要在10×10的网格中包装5×5,4×4,3×3和2×2的4个方格。 它们可能不重叠。 我的variables是这样的: Name: SqX(i), i=1..10, domain: 1..10 其中X是5,4,3或2.索引i表示行,即域在网格中的列。 我的第一个约束试图定义正方形的宽度和高度。 我这样制定: Constraint: SqX(i) > SqX(j)-X /\ i>jX, range: i>0 /\ j>0 因此,可能的点被限制在彼此的X行和列之内。 然而,Prolog停止这些约束,并给出以下结果: Adding constraint "(Sq5_I > Sq5_J-5) /\ (I>J-5)" for values: I=1, J=1, I=1, J=2, I=1, J=3, I=1, J=4, I=1, J=5, I=1, J=6, =======================[ End Solutions ]======================= 所以它停在那里,甚至没有检查其他广场。 我的约束很可能太紧张,但我不明白为什么或如何。 有什么build议么?
数量有限的球员和数量有限的网球场。 每场比赛最多可以有多less场比赛。 没有人rest2轮。 每个人都和其他人玩。 产生尽可能less的轮次的时间表。 (因为每个人之间必须有轮休的规则,所以可以有一轮没有比赛。)5个球员和2个球场的输出可以是: | 1 2 3 4 5 -|——————- 2| 1 – 3| 5 3 – 4| 7 9 1 – 5| 3 7 9 5 – 在这个输出中,列和行是玩家号码,matrix内的数字是这两个玩家竞争的轮数。 问题是find一个algorithm,可以在一个可行的时间更大的情况下做到这一点。 我们被要求在Prolog中这样做,但任何语言的(伪)代码都是有用的。 我的第一个尝试是一个贪婪的algorithm,但是结果太多了。 然后我提出了一个迭代深化的深度优先search,这是我的一个朋友实现的,但是对于7个玩家来说,这个search仍然花费了太多的时间。 (这是从一个旧的考试题目,我没有任何解决scheme。)
我已经在Prolog中做了一个可操作的广义的语言algorithm求解器,但是它太慢了。 只需要8分钟即可运行简单的expression式SEND + MORE = MONE Y.有人可以帮助我使其运行得更快吗? /* verbalArithmetic(List,Word1,Word2,Word3) where List is the list of all possible letters in the words. The SEND+MORE = MONEY expression would then be represented as verbalArithmetic([S,E,N,D,M,O,R,Y],[S,E,N,D],[M,O,R,E],[M,O,N,E,Y]). */ validDigit(X) :- member(X,[0,1,2,3,4,5,6,7,8,9]). validStart(X) :- member(X,[1,2,3,4,5,6,7,8,9]). assign([H|[]]) :- validDigit(H). assign([H|Tail]) :- validDigit(H), assign(Tail), fd_all_different([H|Tail]). findTail(List,H,T) :- append(H,[T],List). convert([T],T) :- validDigit(T). convert(List,Num) :- […]
在CLP(FD)中,我们经常需要陈述:“这是一个整数和有限域variables的列表(有时: 严格地说 )是升序/降序。 是否有任何CLP(FD)系统为此任务提供一个通用(可参数化)的内置约束? SWI-Prolog提供了一个叫做chain/2的约束,与我正在寻找的相似。 然而,这个名字稍微有些特殊,不能包含约束可以描述的所有关系(例如: #<不是一个偏序,但是在第二个chain/2是可以接受的,导致序列被看作是一个整数集合 -math顺序理论中定义的一个链)。 因此,这个名字并没有完全描述约束实际实现的内容。 请给出关于通常的二进制CLP(FD)约束的最一般的定义 – 或者至less包含#< , #> , #=<和#>= – 的合适的子集, 包括根据代数结构约束定义。 强加的条件是约束描述了一个在文献中有一个真正的名字的实际math结构。 首先,请考虑使用SICStus Prolog或SWI: :- use_module(library(clpfd)). connex(Relation_2, List) :- connex_relation(Relation_2), connex_(List, Relation_2). connex_relation(#=). connex_relation(#<). connex_relation(#=<). connex_relation(#>). connex_relation(#>=). connex_([], _). connex_([L|Ls], Relation_2) :- foldl(adjacent(Relation_2), Ls, L, _). adjacent(Relation_2, X, Prev, X) :- call(Relation_2, Prev, X). 示例: ?- connex(#<, […]