我发现这个代码完全符合我的要求:获取整数列表,并生成每个组合。
perm([H|T], Perm) :-
perm(T, SP),
insert(H, SP, Perm).
perm([], []).
insert(X, T, [X|T]).
insert(X, [H|T], [H|NT]) :-
insert(X, T, NT).
现在我想做的是,如果一个排列不符合某些标准,我希望烫发返回另一个结果。所以,对于缺乏词汇表感到抱歉,如果我执行该代码,获得解决方案并键入; 以获得更多结果,我希望会产生相同的效果。我相信这是一个非常简单的想法,但我现在无法看到它。
所以,伪代码将是:
enumerate(inputList, outputNodes, OutputArcs) :-
perm(inputList,OutputPermutation),
getArcs(OutputPermutation,OutputArcs),%I want to build the OutputArcs, then check for every element to be unique, if it isn't, generate another list with perm, if it IS, return said list as accepted)
areArcsNumberUniques(OutputArcs,OutputArcs),%TODO now is when I do not know how to make the call, here if it is valid, end, if it isn't, call perm again)
所以我需要了解如何解决这个问题。此外,关于这个问题的任何其他想法都是受欢迎的,因为我强行说道,因为我无法找到任何类型的算法或模式来解决实际问题(我已经问过这个问题)这是我尝试的解决方案,只是为了给出练习的实际答案......)
编辑:查询:
enumerate([a-b,b-c], EnumNodos, EnumArcos).
预期产出:
EnumNodos = [enum(3,a), enum(1,b), enum(2,c)],
EnumArcos = [enum(2,a‐b), enum(1,b‐c)]
这就像最终游戏目标一样,我得到一个弧列表,其中每个弧都有一个唯一值,等于减去其节点的值(每个节点也有一个唯一值)。
到目前为止,由于我没有找到任何方法在算法上做这个,我想到尝试各种可能性(基本上我不能得到一个独特的方式来做到这一点,不同分支的树似乎与我不同,只有限制是有N个节点和N-1个弧)。
编辑更多示例:
6a
5 4
1b 2e
2 3
3c 5f
1
4d
EnumNodos = [enum(6,a), enum(1,b), enum(2,e), enum(3,c), enum(5,f), enum(4,d)],
EnumArcos = [enum(5,a‐b), enum(4,a-e), enum(3,e-f), , enum(2,b-c), enum(1,c-d)]
5a
4 3
1b 2e
1 2
3c 4f
EnumNodos = [enum(5,a), enum(1,b), enum(2,e), enum(3,c), enum(4,f)],
EnumArcos = [enum(4,a‐b), enum(3,a-e), enum(1,b-c), , enum(2,e-f)]
5a
4 3
1b 2e
2
3c
1
4d
9a
8 7
1b 2e
6 4
7c 6f
2 2
5d 4g
3 1
8h 3i