2017-02-13 2 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 - д ([[1,7], [2,3], [5,4], [3,1], [7,6], [6,5], [4,2]], Х).
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]] ;
Неверный.

Но ваш вопрос действительно неясен.

обновление: Мы можем создать своего рода списки мы используем выше, любой длины, с

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

не проблема, только когда ответ не принят, он сигнализирует, что проблема все еще не решена ... :) –

Смежные вопросы