2017-02-13 65 views
1

我有一些代碼,它需要一對數字的給定列表並解決7個鏈的問題。然而,它需要一個令人討厭的時間來解決一個(嗯,我還沒有解決了1,而且這是一個很大的時間)。我想知道是否有更好/更有效的編碼方式。生成連續數字對 - 序言

這是我做的,列表中的數字是「L」。 (名單看起來就像這樣:L= [[1,2],[2,3],...]

length(L,LEN), 

interval(N1,1,LEN), 
interval(N2,1,LEN), 
interval(N3,1,LEN), 
interval(N4,1,LEN), 
interval(N5,1,LEN), 
interval(N6,1,LEN), 
interval(N7,1,LEN), 

nth1(N1,L,A), 
nth1(N2,L,B), 
nth1(N3,L,C), 
nth1(N4,L,D), 
nth1(N5,L,E), 
nth1(N6,L,F), 
nth1(N7,L,G), 

nth1(2,A,A2), 
nth1(1,B,B1), 
A2 = B1, 

nth1(2,B,B2), 
nth1(1,C,C1), 
B2 = C1, 

nth1(2,C,C2), 
nth1(1,D,D1), 
C2 = D1, 

nth1(2,D,D2), 
nth1(1,E,E1), 
D2 = E1, 

nth1(2,E,E2), 
nth1(1,F,F1), 
E2 = F1, 

nth1(2,F,F2), 
nth1(1,G,G1), 
F2 = G1, 

nth1(2,G,G2), 
nth1(1,A,A1), 
G2 = A1, 

R = (A,B,C,D,E,F,G). 

回答

3

如果我正確理解你的意圖,你可以這樣寫短的

use_module(library(clpfd)). 

q(L,R) :- 
    [A,B,C,D,E,F,G] ins 1 .. 7, 
    R = [[A,B],[B,C],[C,D],[D,E],[E,F],[F,G],[G,A]], 
    permutation(L, R), 
    label([A,B,C,D,E,F,G]). 

?例如:

3 - q ([[1,7],[2,3],[5,4],[3,1],[7,6],[6,5],[4,2],X)。
X = [[1,7],[7,6],[6,5],[5,4],[4,2],[2,3],[3,1]] ;
X = [[2,3],[3,1],[1,7],[7,6],[6,5],[5,4],[4,2]] ;
X = [[5,4],[4,2],[2,3],[3,1],[1,7],[7,6],[6,5]] ;
X = [[3,1],[1,7],[7,6],[6,5],[5,4],[4,2],[2,3]] ;
X = [[7,6],[6,5],[5,4],[4,2],[2,3],[3,1],[1,7]] ;
X = [[6,5],[5,4],[4,2],[2,3],[3,1],[1,7],[7,6]] ;
X = [[4,2],[2,3],[3,1],[1,7],[7,6],[6,5],[5,4]] ;
false。

但是你的問題確實不清楚。

更新:我們能夠創建什麼樣名單上面我們使用任何長度的,與

vars(N, Vars):- 
    length(Vars, N). 

pairs(Vars, N, Pairs):- % assuming vars(N, Vars) 
    N #> 0, 
    append(Vars,[A],[A|B]), % |B| = N 
    maplist(pair, Vars, B, Pairs). 

pair(A, B, [A,B]). 

這樣q/2可以概括爲

gen_q(L,R) :- 
    length(L, N), 
    vars(N, Vars), 
    Vars ins 1 .. N, 
    pairs(Vars, N, R), 
    permutation(L, R), 
    label(Vars). 

但這個計算的可行性對於更大的投入是另一回事。 permutation/2的強力可能不得不用更具體的東西來代替。

此外,產生的N結果包括清晰的模式;沒有必要重新輸入搜索,以便在找到第一個搜索後生成它們。

+0

請原諒我,如果我錯了,但只有在列表中有7對時,您的代碼纔有效。我的數據集是〜150對 –

+1

我很抱歉,我忘記接受答案。 –

+0

沒問題,只是當沒有答案被接受時,它表明問題仍然沒有解決...... :) –