如何从给定数量的整数中生成每个组合

时间:2016-05-27 10:59:28

标签: list prolog

我发现这个代码完全符合我的要求:获取整数列表,并生成每个组合。

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

0 个答案:

没有答案