Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- :-reconsult('bc_tp2').
- %=====================
- %Iteracao 1:
- tsp1(Cidade,Caminho):-
- findall((Caminho1, Distancia), (todosCaminhos(Cidade, Caminho1), Caminho1=[H|T], calculaDistancia(H,T,Distancia)), NovosCaminhos),
- sort(2, @>, NovosCaminhos, NovosCaminhosSorted),
- last(NovosCaminhosSorted,Caminho),!.
- todosCaminhos(Cidade, Caminho):-
- dfs(Cidade, [Cidade], Caminho1),
- append(Caminho1, [Cidade], Caminho).
- dfs(_, ListaAux, Caminho):-
- total(ListaAux, T1),
- contarCidades(T2),
- T1 =:= T2,
- reverse(ListaAux, Caminho).
- dfs(Cidade, ListaAux, Caminho):-
- city(C , _, _),
- \+ member(C , ListaAux),
- C \== Cidade,
- dfs(C, [C|ListaAux], Caminho).
- total([],0).
- total([_|T], N):-
- total(T, N1),
- N is N1 + 1.
- contarCidades(Total):-
- findall(Prox_Cid, city(Prox_Cid , _, _), ListaTotal), total(ListaTotal, Total).
- calculaDistancia(Cidade1,[Cidade2], Distancia):-
- dist_cities(Cidade1, Cidade2, Distancia).
- calculaDistancia(Cidade1,T, Distancia):-
- T = [Cidade2|T2],
- dist_cities(Cidade1, Cidade2, Dist_Cidade),
- calculaDistancia(Cidade2, T2, Distancia1),
- Distancia is Dist_Cidade + Distancia1.
- %2) Foi conseguido um total máximo de 10 cidades.
- %================================================
- %Iteracao 2:
- tsp2(Cidade, Caminho, Distancia):-
- tsp(Cidade, [Cidade], Caminho, Cidade, Distancia), !.
- tsp(Cidade, CidadesVisitadas, Caminho, CidadeInicial, Distancia):-
- total(CidadesVisitadas, N1),
- contarCidades(N2),
- N1 =:= N2,
- CidadesVisitadas2 = [CidadeInicial|CidadesVisitadas],
- dist_cities(CidadeInicial, Cidade, Dist_Cidade),
- Distancia is Dist_Cidade,
- reverse(CidadesVisitadas2, Caminho).
- tsp(Cidade, CidadesVisitadas, Caminho, CidadeInicial, Distancia):-
- findall((Dist_Cidade, Prox_Cidade), (dist_cities(Prox_Cidade, Cidade, Dist_Cidade), (\+ member(Prox_Cidade, CidadesVisitadas))), NovasCidades),
- sort(NovasCidades, NovasCidadesSorted),
- NovasCidadesSorted = [(DistanciaMelhor,Melhor)|_],
- CidadesVisitadas2 =[Melhor|CidadesVisitadas],
- tsp(Melhor, CidadesVisitadas2, Caminho, CidadeInicial, Distancia2),
- Distancia is Distancia2 + DistanciaMelhor.
- %=============================================================
- %Iteracao 3:
- tsp3(Cidade, Caminho, Distancia):-
- tsp2(Cidade, Caminho2, _),
- lista(Caminho2, NovaLista),
- eliminarCruzamentos(Cidade, NovaLista, NovaLista, ListaDesorganizada),
- reorganizacao(ListaDesorganizada, Caminho),
- Caminho = [CaminhoHead|CaminhoTail],
- calculaDistancia(CaminhoHead, CaminhoTail, Distancia),!.
- lista([H|T], Lista):-
- total([H|T], N1),
- N1 =:= 2,
- T=[H2|_],
- Lista = [[H, H2]].
- lista([H|T], Lista):-
- lista(T, Resultado),
- T=[H2|_],
- Lista = [[H, H2]| Resultado].
- eliminarCruzamentos(_,[], H, H).
- eliminarCruzamentos(Cidade, [[Cid1,Cid2]|Res], ListaOriginal, ListaDesorganizada):-
- findall([Cid3, Cid4], (member([Cid3, Cid4], Res), Cid1\=Cid3, Cid1\=Cid4, Cid2\=Cid3, Cid2\=Cid4,
- cruzamento(Cid1,Cid2,Cid3,Cid4)), [[H,T]|_]),
- eliminarCruz([Cid1, Cid2], [H, T], ListaOriginal, ListaDesorganizada1),
- rGraph(Cidade, ListaDesorganizada1, Caminho),
- eliminarCruzamentos(Cidade, Caminho, Caminho, ListaDesorganizada),!.
- eliminarCruzamentos(Cidade, [_|Lista], ListaOriginal, ListaDesorganizada):-
- eliminarCruzamentos(Cidade, Lista, ListaOriginal, ListaDesorganizada).
- eliminarCruz([Cid1,Cid2], [Cid3,Cid4], ListaOriginal, ListaDesorganizada):-
- select([Cid1, Cid2], ListaOriginal, ListaOriginal1),
- select([Cid3, Cid4], ListaOriginal1, ListaOriginal2),
- append(ListaOriginal2, [[Cid1,Cid3]], ListaOriginal3),
- append(ListaOriginal3, [[Cid2,Cid4]], ListaDesorganizada).
- cruzamento(Cid1, Cid2, Cid3, Cid4):-
- city(Cid1, Lat1, Long1),
- city(Cid2, Lat2, Long2),
- city(Cid3, Lat3, Long3),
- city(Cid4, Lat4, Long4),
- doIntersect((Lat1, Long1),(Lat2, Long2),(Lat3, Long3),(Lat4, Long4)).
- reorganizacao([H], H):-!.
- reorganizacao([H|T], Caminho):-
- H = [Cidade|_],
- reorganizacao(T, Caminho2),
- Caminho = [Cidade|Caminho2].
- %===========================================================
- %Iteracao 4:
- %=== Parameterizacao ===%
- geracoes(5).
- populacao(1).
- prob_cruzamento(0.8).
- prob_mutacao(0.1).
- %== Tem de ser sempre menos uma que o valor de cidades real ==%
- cidades(49).
- %=== Metodo inicial, chama todas as partes do algoritmo ===%
- tsp4(CidadeOrigem):-
- gera_populacao(Pop,CidadeOrigem),
- avalia_populacao(Pop,PopAvaliada),
- ordena_populacao(PopAvaliada,PopOrdenada),
- geracoes(NGeracoes),
- gera_geracao(NGeracoes,PopOrdenada),!.
- %=== Metodo para gerar a populacao ===%
- gera_populacao(Pop,Cidade):-
- populacao(TamPop),
- cidades(NumCidades),
- findall(Prox_Cidade, city(Prox_Cidade, _, _), ListaCidades),
- delete(ListaCidades,Cidade,NListaCidades),
- gera_populacao(TamPop,NListaCidades,NumCidades,Pop,Cidade),nl.
- gera_populacao(0,_,_,[],_):-!.
- gera_populacao(TamPop,ListaCidades,NumCidades,[LR|Resto],Cidade):-
- TamPop1 is TamPop-1,
- gera_populacao(TamPop1,ListaCidades,NumCidades,Resto,Cidade),
- gera_individuo(ListaCidades,NumCidades,Ind),
- adicionarPrimeiraeUltima(Ind,LR,Cidade,Cidade),
- not(member(LR,Resto)).
- gera_populacao(TamPop,ListaCidades,NumCidades,L,Cidade):-
- gera_populacao(TamPop,ListaCidades,NumCidades,L,Cidade).
- %=== Metodo para gerar o individuo ===%
- gera_individuo([G],1,[G]):-!.
- gera_individuo(ListaCidades,NumCidades,[G|Resto]):-
- NumTemp is NumCidades + 1, % To use with random
- random(1,NumTemp,N),
- retira(N,ListaCidades,G,NovaLista),
- NumCidades1 is NumCidades-1,
- gera_individuo(NovaLista,NumCidades1,Resto).
- retira(1,[G|Resto],G,Resto).
- retira(N,[G1|Resto],G,[G1|Resto1]):-
- N1 is N-1,
- retira(N1,Resto,G,Resto1).
- %== Metodo ara avaliar a populacao ===%
- avalia_populacao([],[]).
- avalia_populacao([Ind|Resto],[Ind*V|Resto1]):-
- avalia(Ind,V),
- avalia_populacao(Resto,Resto1).
- avalia(Seq,V):-
- avalia_(Seq,V).
- avalia_([],0).
- avalia_([Atual|[Prox|Resto]],V):-
- avalia([Prox|Resto],V1),
- dist_cities(Atual,Prox,DistAtual),
- V is DistAtual+V1.
- avalia_([Atual|[Prox]],V):-
- avalia([],V1),
- dist_cities(Atual,Prox,DistAtual),
- V is DistAtual+V1.
- %=== Metodo para ordenar a populacao ===%
- ordena_populacao(PopAv,PopAvOrd):-
- bsort(PopAv,PopAvOrd).
- bsort([X],[X]):-!.
- bsort([X|Xs],Ys):-
- bsort(Xs,Zs),
- btroca([X|Zs],Ys).
- btroca([X],[X]):-!.
- btroca([X*VX,Y*VY|L1],[Y*VY|L2]):-
- VX>VY,!,
- btroca([X*VX|L1],L2).
- btroca([X|L1],[X|L2]):-
- btroca(L1,L2).
- %=== Metodo para gerar a proxima geracao ===%
- gera_geracao(0,Pop):-!,
- write('%=== GERACAO '), write(0), write(' ===%'), nl, write(Pop), nl.
- gera_geracao(G,Pop):-
- %=== Geracao seguinte ===%
- write('%=== GERACAO '), write(G), write(' ===%'), nl, write(Pop), nl,
- removerPrimeiroeUltimo_pop(Pop,PopSemPriEUlt,Inicio,Fim),
- cruzamento(PopSemPriEUlt,NPopSemPriEUlt),
- mutacao(NPopSemPriEUlt,NPop1),
- adicionarPrimeiroeUltimoPop(NPop1,NPop,Inicio,Fim),
- avalia_populacao(NPop,NPopAv),
- ordena_populacao(NPopAv,NPopOrd),
- G1 is G-1,
- gera_geracao(G1,NPopOrd).
- removerPrimeiroeUltimo_pop([],[],[],[]).
- removerPrimeiroeUltimo_pop([H*Val|T],[LR*Val|PopSem],[Inicio1|Inicio],[Fim1|Fim]):-
- removerPrimeiroeUltimo_pop(T,PopSem,Inicio,Fim),
- removerPrimeiroeUltimo(H,LR,Inicio1,Fim1).
- removerPrimeiroeUltimo([Inicio|T],LR,Inicio,Fim):-
- removerPrimeiroeUltimo_(T,LR,Fim).
- removerPrimeiroeUltimo_([Fim],[],Fim).
- removerPrimeiroeUltimo_([H|T],[H|LR],Fim):-
- removerPrimeiroeUltimo_(T,LR,Fim).
- adicionarPrimeiroeUltimoPop([],[],[],[]).
- adicionarPrimeiroeUltimoPop([H|T],[LR|PopCom],[H_inicio|T_inicio],[H_fim|T_fim]):-
- adicionarPrimeiroeUltimoPop(T,PopCom,T_inicio,T_fim),
- adicionarPrimeiraeUltima(H,LR,H_inicio,H_fim).
- adicionarPrimeiraeUltima(L,[E1|LR],E1,E2):-
- adicionarPrimeiraeUltima_(L,E2,LR).
- adicionarPrimeiraeUltima_([],E2,[E2]).
- adicionarPrimeiraeUltima_([H|T],E2,[H|LR]):-
- adicionarPrimeiraeUltima_(T,E2,LR).
- gerar_pontos_cruzamento(P1,P2):-
- gerar_pontos_cruzamento1(P1,P2).
- gerar_pontos_cruzamento1(P1,P2):-
- cidades(N),
- NTemp is N + 1,
- random(1,NTemp,P11),
- random(1,NTemp,P21),
- P11\==P21,!,
- ((P11<P21,!,P1=P11,P2=P21);P1=P21,P2=P11).
- gerar_pontos_cruzamento1(P1,P2):-
- gerar_pontos_cruzamento1(P1,P2).
- cruzamento([],[]).
- cruzamento([Ind*_],[Ind]).
- cruzamento([Ind1*_,Ind2*_|Resto],[NInd1,NInd2|Resto1]):-
- gerar_pontos_cruzamento(P1,P2),
- prob_cruzamento(Pcruz), random(0.0,1.0,Pc),
- ((Pc =< Pcruz,!,
- cruzar(Ind1,Ind2,P1,P2,NInd1),
- cruzar(Ind2,Ind1,P1,P2,NInd2))
- ;
- (NInd1=Ind1,NInd2=Ind2)),
- cruzamento(Resto,Resto1).
- preencheh([],[]).
- preencheh([_|R1],[h|R2]):-
- preencheh(R1,R2).
- sublista(L1,I1,I2,L):-
- I1 < I2,!,
- sublista1(L1,I1,I2,L).
- sublista(L1,I1,I2,L):-
- sublista1(L1,I2,I1,L).
- sublista1([X|R1],1,1,[X|H]):-!,
- preencheh(R1,H).
- sublista1([X|R1],1,N2,[X|R2]):-!,
- N3 is N2 - 1,
- sublista1(R1,1,N3,R2).
- sublista1([_|R1],N1,N2,[h|R2]):-
- N3 is N1 - 1,
- N4 is N2 - 1,
- sublista1(R1,N3,N4,R2).
- rotate_right(L,K,L1):-
- cidades(N),
- T is N - K,
- rr(T,L,L1).
- rr(0,L,L):-!.
- rr(N,[X|R],R2):-
- N1 is N - 1,
- append(R,[X],R1),
- rr(N1,R1,R2).
- elimina([],_,[]):-!.
- elimina([X|R1],L,[X|R2]):-
- not(member(X,L)),!,
- elimina(R1,L,R2).
- elimina([_|R1],L,R2):-
- elimina(R1,L,R2).
- insere([],L,_,L):-!.
- insere([X|R],L,N,L2):-
- cidades(T),
- ((N>T,!,N1 is N mod T);N1 = N),
- insere1(X,N1,L,L1),
- N2 is N + 1,
- insere(R,L1,N2,L2).
- insere1(X,1,L,[X|L]):-!.
- insere1(X,N,[Y|L],[Y|L1]):-
- N1 is N-1,
- insere1(X,N1,L,L1).
- cruzar(Ind1,Ind2,P1,P2,NInd11):-
- sublista(Ind1,P1,P2,Sub1),
- cidades(NumT),
- R is NumT-P2,
- rotate_right(Ind2,R,Ind21),
- elimina(Ind21,Sub1,Sub2),
- P3 is P2 + 1,
- insere(Sub2,Sub1,P3,NInd1),
- eliminah(NInd1,NInd11).
- eliminah([],[]).
- eliminah([h|R1],R2):-!,
- eliminah(R1,R2).
- eliminah([X|R1],[X|R2]):-
- eliminah(R1,R2).
- mutacao([],[]).
- mutacao([Ind|Rest],[NInd|Rest1]):-
- prob_mutacao(Pmut),
- random(0.0,1.0,Pm),
- ((Pm < Pmut,!,mutacao1(Ind,NInd));NInd = Ind),
- mutacao(Rest,Rest1).
- mutacao1(Ind,NInd):-
- gerar_pontos_cruzamento(P1,P2),
- mutacao22(Ind,P1,P2,NInd).
- mutacao22([G1|Ind],1,P2,[G2|NInd]):-
- !, P21 is P2-1,
- mutacao23(G1,P21,Ind,G2,NInd).
- mutacao22([G|Ind],P1,P2,[G|NInd]):-
- P11 is P1-1, P21 is P2-1,
- mutacao22(Ind,P11,P21,NInd).
- mutacao23(G1,1,[G2|Ind],G2,[G1|Ind]):-!.
- mutacao23(G1,P,[G|Ind],G2,[G|NInd]):-
- P1 is P-1,
- mutacao23(G1,P1,Ind,G2,NInd).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement