如何在Prolog中找出列表所有排列里得分最高的结果?
在Prolog中寻找最高得分的列表排列方案
你当前的compute/3谓词会生成列表的所有排列及对应得分,但无法直接筛选出最高分的结果。可以通过以下步骤实现需求:
1. 收集所有候选结果
先定义一个谓词,用findall/3收集所有(排列,得分)对:
generate_candidates(InitialSettings, Candidates) :- findall((Permutation, Score), (perm(InitialSettings, Permutation), check_bonds(Permutation, Permutation, -1, 0, Score)), Candidates).
2. 筛选出得分最高的排列
定义递归谓词遍历候选列表,找出得分最高的项:
find_best_candidate([(BestPerm, BestScore)], BestPerm, BestScore). find_best_candidate([(P1, S1), (P2, S2)|Remaining], BestPerm, BestScore) :- (S1 >= S2 -> find_best_candidate([(P1, S1)|Remaining], BestPerm, BestScore) ; find_best_candidate([(P2, S2)|Remaining], BestPerm, BestScore) ).
3. 组合成最终谓词
将上述两个谓词结合,得到可以直接调用的最终谓词:
compute_best(InitialSettings, BestSettings, BestScore) :- generate_candidates(InitialSettings, Candidates), find_best_candidate(Candidates, BestSettings, BestScore).
补充说明
- 若存在多个排列得分相同且均为最高分,上述实现会返回遍历过程中第一个遇到的排列;若需返回所有最高分排列,可调整
find_best_candidate/3的逻辑。 - 12个元素的全排列数为
12! = 479001600,遍历所有排列可能存在性能瓶颈。如果场景对性能要求较高,可考虑引入剪枝逻辑或启发式搜索算法(如局部搜索、遗传算法)来减少计算量。
内容的提问来源于stack exchange,提问作者JayK23
相关产品推荐
相关产品推荐

