Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % F�BRICA
- % Linhas
- linhas([lA]).
- % Maquinas
- maquinas([ma,mb,mc,md,me]).
- % Ferramentas
- ferramentas([fa,fb,fc,fd,fe,ff,fg,fh,fi,fj]).
- % Maquinas que constituem as Linhas
- tipos_maq_linha(lA,[ma,mb,mc,md,me]).
- % ...
- % Opera��es
- tipo_operacoes([opt1,opt2,opt3,opt4,opt5,opt6,opt7,opt8,opt9,opt10]).
- % operacoes/1 vai ser criado dinamicamente
- %no exemplo dara' uma lista com 30 operacoes 6 lotes de produtos * 5 operacoes por produto
- %operacoes_atrib_maq/2 vai ser criado dinamicamente
- %no exemplo cada maquina tera' 6 operacoes atribuidas, uma por cada lote de produtos
- % classif_operacoes/2 deve ser criado dinamicamente
- %no exemplo teremos 30 factos deste tipo, um para cada operacao
- % Afeta��o de tipos de opera��es a tipos de m�quinas
- % com ferramentas, tempos de setup e tempos de execucao)
- operacao_maquina(opt1,ma,fa,1,1).
- operacao_maquina(opt2,mb,fb,2.5,2).
- operacao_maquina(opt3,mc,fc,1,3).
- operacao_maquina(opt4,md,fd,1,1).
- operacao_maquina(opt5,me,fe,2,3).
- operacao_maquina(opt6,mb,ff,1,4).
- operacao_maquina(opt7,md,fg,2,5).
- operacao_maquina(opt8,ma,fh,1,6).
- operacao_maquina(opt9,me,fi,1,7).
- operacao_maquina(opt10,mc,fj,20,2).
- %...
- % PRODUTOS
- produtos([pA,pB,pC,pD,pE,pF]).
- operacoes_produto(pA,[opt1,opt2,opt3,opt4,opt5]).
- operacoes_produto(pB,[opt1,opt6,opt3,opt4,opt5]).
- operacoes_produto(pC,[opt1,opt2,opt3,opt7,opt5]).
- operacoes_produto(pD,[opt8,opt2,opt3,opt4,opt5]).
- operacoes_produto(pE,[opt1,opt2,opt3,opt4,opt9]).
- operacoes_produto(pF,[opt1,opt2,opt10,opt4,opt5]).
- % ENCOMENDAS
- %Clientes
- clientes([clA,clB,clC,clD]).
- % prioridades dos clientes
- prioridade_cliente(clA,2).
- prioridade_cliente(clB,1).
- prioridade_cliente(clC,3).
- prioridade_cliente(clD,2).
- prioridade_cliente(clE,3).
- % ...
- % Encomendas do cliente,
- % termos e(<produto>,<n.unidades>,<tempo_conclusao>)
- encomenda(clA,[e(pA,4,50),e(pB,4,70)]).
- encomenda(clB,[e(pC,3,30),e(pD,5,200)]).
- encomenda(clC,[e(pE,4,60),e(pF,6,120)]).
- % ...
- % cria_op_enc - fizeram-se correcoes face a versao anterior
- :- dynamic operacoes_atrib_maq/2.
- :- dynamic classif_operacoes/2.
- :- dynamic op_prod_client/9.
- :- dynamic operacoes/1.
- cria_op_enc:-retractall(operacoes(_)),
- retractall(operacoes_atrib_maq(_,_)),retractall(classif_operacoes(_,_)),
- retractall(op_prod_client(_,_,_,_,_,_,_,_,_)),
- findall(t(Cliente,Prod,Qt,TConc),
- (encomenda(Cliente,LE),member(e(Prod,Qt,TConc),LE)),
- LT),cria_ops(LT,0),
- findall(Op,classif_operacoes(Op,_),LOp),asserta(operacoes(LOp)),
- maquinas(LM),
- findall(_,
- (member(M,LM),
- findall(Opx,op_prod_client(Opx,M,_,_,_,_,_,_,_),LOpx),
- assertz(operacoes_atrib_maq(M,LOpx))),_).
- cria_ops([],_).
- cria_ops([t(Cliente,Prod,Qt,TConc)|LT],N):-
- operacoes_produto(Prod,LOpt),
- cria_ops_prod_cliente(LOpt,Cliente,Prod,Qt,TConc,N,N1),
- cria_ops(LT,N1).
- cria_ops_prod_cliente([],_,_,_,_,Nf,Nf).
- cria_ops_prod_cliente([Opt|LOpt],Client,Prod,Qt,TConc,N,Nf):-
- cria_ops_prod_cliente2(Opt,Prod,Client,Qt,TConc,N,Ni),
- cria_ops_prod_cliente(LOpt,Client,Prod,Qt,TConc,Ni,Nf).
- cria_ops_prod_cliente2(Opt,Prod,Client,Qt,TConc,N,Ni):-
- Ni is N+1,
- atomic_concat(op,Ni,Op),
- assertz(classif_operacoes(Op,Opt)),
- operacao_maquina(Opt,M,F,Tsetup,Texec),
- assertz(op_prod_client(Op,M,F,Prod,Client,Qt,TConc,Tsetup,Texec)).
- :-cria_op_enc.
- :-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).
- % tarefas(NTarefas).
- %tarefas(5).
- edd(LID):-
- findall(t(Id,TP,TC,PP),tarefa(Id,TP,TC,PP),Tarefas),
- sort(3,@=<,Tarefas,TarefasOrdenadas),converte(TarefasOrdenadas,L),
- getId(L,LID).
- getId([],[]).
- getId([(Id,TP,TC,PP)|L],[Id|LID]):-getId(L,LID).
- converte([],[]).
- converte([t(Id,TP,TC,PP)|TT],[(Id,TP,TC,PP)|L]):-converte(TT,L).
- % parameteriza��o
- 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)).
- adicionaEDD(T,Pop,Pop):-member(T, Pop).
- adicionaEDD(T,[X|Pop],[T|Pop]).
- adicionaMS(T,Pop,Pop):-member(T, Pop).
- adicionaMS(T,[X|Pop],[X|Pop1]):-adicionaMS2(T,Pop,Pop1).
- adicionaMS2(T,Pop,Pop):-member(T, Pop).
- adicionaMS2(T,[X|Pop],[T|Pop]).
- gera:-
- cria_Tarefas,
- edd(TarefasOrdenadas),
- min_slack(TarefasMS),
- inicializa,
- gera_populacao(Pop),
- adicionaEDD(TarefasOrdenadas,Pop,Pop2),
- adicionaMS(TarefasMS,Pop2,NPop),
- write('Pop='),write(NPop),nl,
- avalia_populacao(NPop,PopAv),
- write('PopAv='),write(PopAv),nl,
- ordena_populacao(PopAv,PopOrd),
- geracoes(NG),!,
- gera_geracao(0,NG,PopOrd).
- gera_populacao(Pop):-
- populacao(TamPop),
- tarefas(NumT),
- findall(Tarefa,tarefa(Tarefa,_,_,_),ListaTarefas),
- gera_populacao(TamPop,ListaTarefas,NumT,Pop).
- gera_populacao(0,_,_,[]):-!.
- 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).
- melhores1(Lista,Melhores,Restantes,NElementos):-
- length(Lista, Length), Length >= NElementos, melhores(Lista,Melhores,Restantes,NElementos).
- melhores1(Lista,Melhores,Restantes,NElementos):-
- length(Lista, Length),melhores(Lista,Melhores,Restantes,Length).
- melhores(L,[],L,0).
- melhores([X|L],[X|T],Restantes,N):- N1 is N-1, melhores(L,T,Restantes,N1).
- member1(X,[H|_]) :- X==H,!.
- member1(X,[_|T]) :- member1(X,T).
- distinct([],[]).
- distinct([H|T],C) :- member1(H,T),!, distinct(T,C).
- distinct([H|T],[H|C]) :- distinct(T,C).
- torneio([],[],[]).
- torneio([_|[]],[],[]).
- torneio([Ind1*X,Ind2*Y|L],[Vence|Vencedores],[Perde|Perdedores]):- torneio(L,Vencedores,Perdedores), A is Y / (X+Y),
- random(0,A,A1), B is X / (X+Y),random(0,B,B1), vencedor(Ind1*X,Ind2*Y,A1,B1,Vence,Perde).
- vencedor(Ind1*X,Ind2*Y,A,B,Ind1*X,Ind2*Y):-A>B.
- vencedor(Ind1*X,Ind2*Y,A,B,Ind2*Y,Ind1*X).
- parImpar(X,1):- R is rem(X,2),R==1.
- parImpar(X,2).
- estaCompleto(MelhoresComVencedores,Perdedores,TamPop,MelhoresComVencedores):-
- length(MelhoresComVencedores, Tam), Tam==TamPop.
- estaCompleto(MelhoresComVencedores,[P|Perdedores],TamPop,NovaPop):-
- estaCompleto([P|MelhoresComVencedores],Perdedores,TamPop,NovaPop).
- gera_geracao(G,G,Pop):-!,
- write('Geraçao '), write(G), write(':'), nl, write(Pop), nl.
- gera_geracao(N,G,Pop):-
- length(Pop, TamanhoPop),
- write('Geraçao '), write(N), write(':'), nl, write(Pop), nl,
- random_permutation(Pop,PopRandom),
- cruzamento(PopRandom,NPop1),
- mutacao(NPop1,NPop),
- avalia_populacao(NPop,NPopAv),
- ordena_populacao(NPopAv,NPopOrd),
- append(Pop,NPopOrd,TodasPop),
- ordena_populacao(TodasPop,TodasPopOrd),
- distinct(TodasPopOrd, TodasSemRepetidos),
- length(TodasSemRepetidos, SemRepetidosLenght),
- parImpar(SemRepetidosLenght,NElementos),
- NumeroVagas is TamanhoPop - NElementos,
- melhores1(TodasSemRepetidos,Melhores,Restantes,NElementos),
- torneio(Restantes,Vencedores,Perdedores),
- melhores1(Vencedores, MelhoresVencedores,RestantesVencedores,NumeroVagas),
- append(Melhores, MelhoresVencedores, MelhoresComVencedores),
- append(RestantesVencedores, Perdedores,NaoEntraram),
- ordena_populacao(NaoEntraram,NaoEntraramOrd),
- estaCompleto(MelhoresComVencedores,NaoEntraramOrd,TamanhoPop,PopFinal),
- ordena_populacao(PopFinal,PopFinalOrdenada),
- N1 is N+1,!,
- gera_geracao(N1,G,PopFinalOrdenada).
- 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).
- :-dynamic produtos/1.
- :-dynamic tarefa/4.
- :-dynamic tarefas/1.
- cria_Tarefas:-
- retractall(tarefas(_)),retractall(tarefa(_,_,_,_)),% apaga os dados existentes
- cria_op_enc,
- produtosExistentes(TodosProdutos,NumeroProdutosExistentes),% obtem todos os produtos de todas as encomendas e o numero total
- asserta(tarefas(NumeroProdutosExistentes)), %restringe a existentia de tantas tarefas como o numero de produtos existentes
- cria_tarefas(TodosProdutos, NumeroProdutosExistentes,1),
- findall(tarefa(Id,TempoProcessamento,TempConc,PesoPenalizacao), tarefa(Id,TempoProcessamento,TempConc,PesoPenalizacao), Resultado),
- write(Resultado). % rever esta linha!!!!!
- produtosExistentes(TodosProdutos,NumeroProdutosExistentes):-
- findall(Encomedas,encomenda(_,Encomedas),ConjuntoEncomendas),
- flatten(ConjuntoEncomendas,ListaEncomendas),
- obterProdutosEncomenda(ListaEncomendas,TodosProdutos),
- length(TodosProdutos,NumeroProdutosExistentes).
- obterProdutosEncomenda([],[]).
- obterProdutosEncomenda([Encomenda|RestoEncomendas],[Produto|TodosProdutos]):-
- obter_produto(Encomenda,Produto),
- obterProdutosEncomenda(RestoEncomendas,TodosProdutos).
- obter_produto(e(Produto,_,_),Produto).
- cria_tarefas(_,NumeroProdutosExistentes,NumeroProdutosExistentes).
- cria_tarefas([Produto|RestantesProdutos], NumeroProdutosExistentes,Contador):-
- IdTarefa is Contador,
- cria_tarefaPorProduto(Produto,IdTarefa), % cria tarefa associada a cada produto ---- aqui entra o makespan!!!!
- ContadorAuxiliar is Contador + 1,
- cria_tarefas(RestantesProdutos, NumeroProdutosExistentes,ContadorAuxiliar).
- cria_tarefaPorProduto(Produto,IdTarefa):-
- obterOperacoesDoProduto(Produto,OperacoesDoProduto),
- obterOperacoesOrdenadasPeloMaiorTempoExecucao(OperacoesDoProduto,ParesOrdenadosDecrescente),
- ParesOrdenadosDecrescente = [Operacao|OperacoesRestantes],
- obterTempoExecucaoPrimeiraOperacao(Operacao,MaiorTempoExecucao),
- op_prod_client(_,_,_,Produto,Cliente,DimensaoLote,TempoConclusao,_,_),
- TempoLote is (DimensaoLote *MaiorTempoExecucao),
- somaTempoExecaoRestante(OperacoesRestantes,SomaTempoExecaoRestante),
- Makespan is TempoLote + SomaTempoExecaoRestante,
- somaTemposPreparacao(ParesOrdenadosDecrescente,0,99999,TempoPreparacao),
- MakespanComTempoPreparacao is Makespan-TempoPreparacao,
- prioridade_cliente(Cliente,Prioridade),
- asserta(tarefa(IdTarefa, MakespanComTempoPreparacao,TempoConclusao, Prioridade)).
- obterOperacoesDoProduto(Produto,OperacoesDoProduto):-findall((Texec-Op),op_prod_client(Op,_,_,Produto,_,_,_,_,Texec), OperacoesDoProduto).
- %Obter uma lista de pares Operacao-tempo execucao ordenadas pelo tempo de execucao de forma decrescente
- obterOperacoesOrdenadasPeloMaiorTempoExecucao(OperacoesDoProduto,ParesOrdenadosDecrescente):-
- sort(OperacoesDoProduto,ListaParesOrdenadosPelaKey),
- reverse(ListaParesOrdenadosPelaKey,ParesOrdenadosDecrescente).
- obterTempoExecucaoPrimeiraOperacao( (TempoExecucao-_),TempoExecucao).
- somaTempoExecaoRestante([],0).
- somaTempoExecaoRestante([(TempoExecucao-_)|Operacoes],SomaTempoExecaoRestante):-
- somaTempoExecaoRestante(Operacoes,Tempo),
- SomaTempoExecaoRestante is Tempo + TempoExecucao.
- somaTemposPreparacao([],_,MenorTOcupacao,MenorTOcupacao).
- somaTemposPreparacao([(_-Op)|ListaOperacoes], SomatorioTempoExecucao,MenorTO, TempoPreparacao):-
- op_prod_client(Op,_,_,_,_,_,_,Tsetup,Texecucao),
- TOcupacao is SomatorioTempoExecucao - Tsetup,
- SomatorioTempoExecucao1 is SomatorioTempoExecucao+Texecucao,
- (TOcupacao<MenorTO,MenorTO1 is TOcupacao; MenorTO1 is MenorTO),
- somaTemposPreparacao(ListaOperacoes, SomatorioTempoExecucao1,MenorTO1, TempoPreparacao).
- split_primeiro([X|R],X, R).
- obtemMenor(T,MenorTO,T):- T<MenorTO.
- obtemMenor(T,MenorTO,MenorTO).
- min_slack(Lista):-
- findall(tarefa(A,B,C,D), tarefa(A,B,C,D), ListaTarefas),
- calcular_min_slack(ListaTarefas,Lista,0).
- calcular_min_slack([],[],_).
- calcular_min_slack(TarefasRestantes,[Id|Retorno], SomatorioFolgas):-
- findall(
- (Id,Folga),
- (member(tarefa(Id,Makespan,TConc,_),TarefasRestantes),Folga is TConc - Makespan),
- IdComFolgas),
- sort(2, @=<, IdComFolgas, IdComFolgasOrdenada),
- split_primeiro(IdComFolgasOrdenada,MenorFolga,Restantes),
- split_tarefa(MenorFolga,Id,Makespan),
- SomatorioFolgas1 is SomatorioFolgas + Makespan,
- apaga1(Id,TarefasRestantes,TarefasRestantesSemMenor),
- calcular_min_slack(TarefasRestantesSemMenor,Retorno,SomatorioFolgas1).
- split_tarefa((Id,Makespan),Id,Makespan).
- split_tarefa(tarefa(Id,Makespan,TempoConclusao,Prioridade),Id,Makespan,TempoConclusao,Prioridade).
- apaga1(_,[],[]).
- apaga1(Id,[tarefa(Id,_,_,_)|L],L):-!.
- apaga1(Id,[tarefa(Id2,Makespan,TConc,Prioridade)|L],[tarefa(Id2,Makespan,TConc,Prioridade)|L1]):-apaga1(Id,L,L1).
- todas_permutas_com_findall(Pop):-
- cria_tarefas(L),!,
- findall(Id,member(tarefa(Id,_,_,_),L),LT),!,
- findall(X,(permute(LT,X)),LP),
- avalia_populacao(LP,XA),
- ordena_populacao(XA,Pop).
- permute([], []).
- permute([X|Rest], L) :-
- permute(Rest, L1),
- select(X, L, L1).
- :- dynamic melhor_sol_to/2.
- melhor_escalonamento_ocupacao_sem_findall(Lm,Tm):-
- get_time(Ti),
- cria_tarefas(L),!,
- findall(Id,member(tarefa(Id,_,_,_),L),LT),!,
- (melhor_escalonamento_ocupacao_sem_findall2(LT);true),retract(melhor_sol_to(Lm,Tm)),
- get_time(Tf),Tcomp is Tf-Ti,
- write('GERADO EM '),write(Tcomp),
- write(' SEGUNDOS'),nl.
- melhor_escalonamento_ocupacao_sem_findall2(L):- asserta(melhor_sol_to(_,10000)),!,
- permute(L,LP),
- avalia(LP,Tempo),
- atualiza(LP,Tempo),
- fail.
- atualiza(LP,T):-melhor_sol_to(_,Tm),
- T<Tm,retract(melhor_sol_to(_,_)),asserta(melhor_sol_to(LP,T)),!.
- :-dynamic valor/1.
- gera_criterio_valor(Valor):-
- retractall(valor(_)),
- asserta(valor(Valor)),
- cria_tarefas(R),
- edd(TarefasOrdenadas),
- min_slack(TarefasMS),
- inicializa,
- gera_populacao(Pop),
- adicionaEDD(TarefasOrdenadas,Pop,Pop2),
- adicionaMS(TarefasMS,Pop2,NPop),
- write('Pop='),write(NPop),nl,
- avalia_populacao(NPop,PopAv),
- write('PopAv='),write(PopAv),nl,
- ordena_populacao(PopAv,PopOrd),
- geracoes(NG),!,
- gera_geracao_criterio_valor(0,NG,PopOrd).
- gera_geracao_criterio_valor(NG,G,[Ind1*X|Pop]):-valor(V),X=<V ,!,
- write('Geraçao '), write(NG), write(':'), nl, write([Ind1*X|Pop]), nl.
- gera_geracao_criterio_valor(G,G,Pop):-!,
- write('Geraçao '), write(G), write(':'), nl, write(Pop), nl.
- gera_geracao_criterio_valor(N,G,Pop):-
- length(Pop, TamanhoPop),
- write('Geraçao '), write(N), write(':'), nl, write(Pop), nl,
- random_permutation(Pop,PopRandom),
- cruzamento(PopRandom,NPop1),
- mutacao(NPop1,NPop),
- avalia_populacao(NPop,NPopAv),
- ordena_populacao(NPopAv,NPopOrd),
- append(Pop,NPopOrd,TodasPop),
- ordena_populacao(TodasPop,TodasPopOrd),
- distinct(TodasPopOrd, TodasSemRepetidos),
- length(TodasSemRepetidos, SemRepetidosLenght),
- (SemRepetidosLenght,NElementos),
- NumeroVagas is TamanhoPop - NElementos,
- melhores1(TodasSemRepetidos,Melhores,Restantes,NElementos),
- torneio(Restantes,Vencedores,Perdedores),
- melhores1(Vencedores, MelhoresVencedores,RestantesVencedores,NumeroVagas),
- append(Melhores, MelhoresVencedores, MelhoresComVencedores),
- append(RestantesVencedores, Perdedores,NaoEntraram),
- ordena_populacao(NaoEntraram,NaoEntraramOrd),
- estaCompleto(MelhoresComVencedores,NaoEntraramOrd,TamanhoPop,PopFinal),
- ordena_populacao(PopFinal,PopFinalOrdenada),
- N1 is N+1,!,
- gera_geracao_criterio_valor(N1,G,PopFinalOrdenada).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement