Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- :-dynamic geracoes/1.
- :-dynamic populacao/1.
- :-dynamic prob_cruzamento/1.
- :-dynamic prob_mutacao/1.
- % tarefa(Id,TempoProcessamento,TempConc,PesoPenalizacao).
- %tarefa(t1,2,5,1).
- %tarefa(t2,4,7,6).
- %tarefa(t3,1,11,2).
- %tarefa(t4,3,9,3).
- %tarefa(t5,3,8,2).
- tarefa(t1,65,100,1).
- tarefa(t2,36,100,1).
- tarefa(t3,65,110,1).
- tarefa(t4,36,150,1).
- tarefa(t5,48,300,1).
- % tarefas(NTarefas).
- tarefas(5).
- % Heuristica EDD para tarefas
- heuristica_edd(ListaTarefasOrdenadas*Avaliacao):-
- findall(Tarefa,tarefa(Tarefa,_,_,_),ListaTarefas),
- tconc_tarefa_lista_ordenada(ListaTarefas,ListaTarefasOrdenadas),
- avalia(ListaTarefasOrdenadas,Avaliacao).
- tconc_tarefa_lista_ordenada(ListaTarefas, ListaTarefasOrdenadas):-
- maplist(par_valor_tarefa,ListaTarefas,ListaPares),
- keysort(ListaPares,ListaParesOrdenados),
- pairs_values(ListaParesOrdenados,ListaTarefasOrdenadas).
- par_valor_tarefa(Tarefa,Tconc-Tarefa):- tarefa(Tarefa,_,Tconc,_).
- % Heuristica MIN.SLACK para tarefas
- heuristica_min_slack(ListaFinal*Avaliacao):-
- findall(Valor*Tarefa,(tarefa(Tarefa,Texec,Prazo,_),Valor is Prazo - Texec),ListaTarefas),
- calcular_valor(ListaTarefas,0,[],ListaTarefasPesadas),
- sort(ListaTarefasPesadas,ListaTarefasOrdenadas),
- ListaTarefasOrdenadas = [TarefaInicial|RestoLista],
- TarefaInicial = _*Tarefa,
- tarefa(Tarefa,Texec,_,_),
- heuristica_min_slack2(RestoLista,Texec,[TarefaInicial],ListaParesFinal),
- remover_chaves(ListaParesFinal,[],ListaFinal),
- avalia(ListaFinal,Avaliacao).
- heuristica_min_slack2([],_,ListaFinal,ListaFinalReversed):- reverse(ListaFinal,ListaFinalReversed),!.
- heuristica_min_slack2(ListaTarefas,TExecAnterior,Lista,ListaFinal):-
- calcular_valor(ListaTarefas,TExecAnterior,[],ListaTarefasPesadas),
- sort(ListaTarefasPesadas,ListaTarefasOrdenadas),
- ListaTarefasOrdenadas = [TarefaInicial|RestoLista],
- TarefaInicial = _*Tarefa,
- tarefa(Tarefa,Texec,_,_),
- TExecAtual is TExecAnterior + Texec,
- heuristica_min_slack2(RestoLista,TExecAtual,[TarefaInicial|Lista],ListaFinal).
- calcular_valor([],_,ListaTarefasPesadas,ListaTarefasPesadas).
- calcular_valor([Valor*Tarefa|ListaTarefas],TExecAnterior,ListaTarefasPesadas,ListaFinal):-
- tarefa(Tarefa,Texec,Prazo,Peso),
- (Valor > 0 -> ValorPesado is (Prazo - Texec - TExecAnterior)* Peso; ValorPesado is (Prazo - Texec - TExecAnterior) / Peso),
- calcular_valor(ListaTarefas,TExecAnterior,[ValorPesado*Tarefa|ListaTarefasPesadas],ListaFinal).
- remover_chaves([],ListaValues, ListaFinal):- reverse(ListaValues,ListaFinal).
- remover_chaves([_*Tarefa|ListaPairs],ListaValues, ListaFinal):-
- remover_chaves(ListaPairs,[Tarefa|ListaValues], ListaFinal).
- % parameterizacao
- inicializa:-write('Numero de novas Geracoes: '),read(NG),
- (retract(geracoes(_));true), asserta(geracoes(NG)),
- write('Dimensao da Populacao: '),read(DP),
- (retract(populacao(_));true), asserta(populacao(DP)),
- write('Probabilidade de Cruzamento (%):'), read(P1),
- PC is P1/100,
- (retract(prob_cruzamento(_));true),asserta(prob_cruzamento(PC)),
- write('Probabilidade de Mutacao (%):'), read(P2),
- PM is P2/100,
- (retract(prob_mutacao(_));true), asserta(prob_mutacao(PM)).
- gera:-
- inicializa,
- gera_populacao(Pop),
- write('Pop='),write(Pop),nl,
- avalia_populacao(Pop,PopAv),
- ordena_populacao(PopAv,PopOrd),
- write('PopAv='),write(PopOrd),nl,
- geracoes(NG),
- gera_geracao(0,NG,PopOrd).
- gera_populacao(Pop):-
- populacao(TamPop),
- tarefas(NumT),
- findall(Tarefa,tarefa(Tarefa,_,_,_),ListaTarefas),
- gera_populacao(TamPop - 2,ListaTarefas,NumT,Pop).
- gera_populacao(0,_,_,[H1,H2]):- gerar_heuristicas_iniciais([H1,H2]),!.
- gera_populacao(TamPop,ListaTarefas,NumT,[Ind|Resto]):-
- TamPop1 is TamPop-1,
- gera_populacao(TamPop1,ListaTarefas,NumT,Resto),
- gera_individuo(ListaTarefas,NumT,Ind),
- not(member(Ind,Resto)).
- gera_populacao(TamPop,ListaTarefas,NumT,L):-
- gera_populacao(TamPop,ListaTarefas,NumT,L).
- gera_individuo([G],1,[G]):-!.
- gera_individuo(ListaTarefas,NumT,[G|Resto]):-
- NumTemp is NumT + 1, % To use with random
- random(1,NumTemp,N),
- retira(N,ListaTarefas,G,NovaLista),
- NumT1 is NumT-1,
- gera_individuo(NovaLista,NumT1,Resto).
- retira(1,[G|Resto],G,Resto).
- retira(N,[G1|Resto],G,[G1|Resto1]):-
- N1 is N-1,
- retira(N1,Resto,G,Resto1).
- avalia_populacao([],[]).
- avalia_populacao([Ind|Resto],[Ind*V|Resto1]):-
- avalia(Ind,V),
- avalia_populacao(Resto,Resto1).
- avalia(Seq,V):-
- avalia(Seq,0,V).
- avalia([],_,0).
- avalia([T|Resto],Inst,V):-
- tarefa(T,Dur,Prazo,Pen),
- InstFim is Inst+Dur,
- avalia(Resto,InstFim,VResto),
- ((InstFim =< Prazo,!, VT is 0);
- (VT is (InstFim-Prazo)*Pen)),
- V is VT+VResto.
- 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).
- gera_geracao(G,G,Pop):-!,
- write('Geracao'), write(G), write(':'), nl, write(Pop), nl.
- gera_geracao(N,G,Pop):-
- write('Geracao '), write(N), write(':'), nl, write(Pop), nl,
- cruzamento(Pop,NPop1),
- mutacao(NPop1,NPop),
- avalia_populacao(NPop,NPopAv),
- ordena_populacao(NPopAv,NPopOrd),
- N1 is N+1,
- gera_geracao(N1,G,NPopOrd).
- gerar_pontos_cruzamento(P1,P2):-
- gerar_pontos_cruzamento1(P1,P2).
- gerar_pontos_cruzamento1(P1,P2):-
- tarefas(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):-
- tarefas(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):-
- tarefas(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),
- tarefas(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).
- gerar_heuristicas_iniciais(ListaHeuristicas):-
- heuristica_edd(HeuristicaEDD*ValorEDD),
- heuristica_min_slack(HeuristicaMinSlack*ValorMinSlack),
- (ValorEDD == ValorMinSlack,!,
- (swap12(HeuristicaMinSlack,HeuristicaMutada),
- ListaHeuristicas = [HeuristicaEDD,HeuristicaMutada]);
- (ListaHeuristicas = [HeuristicaEDD,HeuristicaMinSlack])).
- swap12([X, Y|T], [Y, X|T]).
- mantem_melhores(_,0,MelhoresFinal,MelhoresFinal).
- mantem_melhores([Melhor*_|Pop],Num,MelhoresAnteriores,MelhoresFinal):-
- Num1 is Num - 1,
- (Num > 0 -> mantem_melhores(Pop, Num1, [Melhor|MelhoresAnteriores], MelhoresFinal)),!.
- torneios_2a2(Ind1*V1,Ind2*V2,MenorInd*MenorV):-
- Max1 is V1/(V1 + V2), random(0,Max1,R1),
- Max2 is V2/(V1 + V2), random(0,Max2,R2),
- write("R1: "), write(R1),write(" R2: "), write(R2),nl,
- (R1 < R2 -> (MenorInd = Ind1, MenorV = V1);(MenorInd = Ind2, MenorV = V2)).
- % Melhor Escalonamento com Tempo de Atraso sem Find All
- :- dynamic melhor_sol_to/2.
- melhor_escalonamento_tempos_atraso_pesados(Lm,Tm):-
- get_time(Ti),
- findall(Tarefa,tarefa(Tarefa,_,_,_),ListaTarefas),
- (melhor_escalonamento_tempos_atraso_pesados1(ListaTarefas);true),
- retract(melhor_sol_to(Lm,Tm)),
- get_time(Tf),Tcomp is Tf-Ti,
- write('GERADO EM '),write(Tcomp),
- write(' SEGUNDOS'),nl.
- melhor_escalonamento_tempos_atraso_pesados1(L):-
- asserta(melhor_sol_to(_,10000)),!,
- permuta_tempoAtraso(L,LP,Tempo),
- update(LP,Tempo),
- fail.
- update(LP,T):- melhor_sol_to(_,Tm),
- T<Tm,retract(melhor_sol_to(_,_)),asserta(melhor_sol_to(LP,T)),!.
- permuta_tempoAtraso(L,LP,Tempo):-
- permuta(L,LP),avalia(LP,Tempo).
- permuta([ ],[ ]).
- permuta(L,[X|L1]):-apaga1(X,L,Li),permuta(Li,L1).
- apaga1(X,[X|L],L).
- apaga1(X,[Y|L],[Y|L1]):-apaga1(X,L,L1).
- melhor_permuta([p(LP,Tempo)],LP,Tempo):-!.
- melhor_permuta([p(LP,Tempo)|LL],LPm,Tm):-melhor_permuta(LL,LP1,T1),((Tempo<T1,!,Tm is Tempo,LPm=LP);(Tm is T1,LPm=LP1)).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement