Advertisement
moreiramota

Untitled

Dec 13th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.17 KB | None | 0 0
  1. % F�BRICA
  2.  
  3. % Linhas
  4.  
  5. linhas([lA]).
  6.  
  7.  
  8. % Maquinas
  9.  
  10.  
  11. maquinas([ma,mb,mc,md,me]).
  12.  
  13.  
  14.  
  15. % Ferramentas
  16.  
  17.  
  18. ferramentas([fa,fb,fc,fd,fe,ff,fg,fh,fi,fj]).
  19.  
  20.  
  21. % Maquinas que constituem as Linhas
  22.  
  23. tipos_maq_linha(lA,[ma,mb,mc,md,me]).
  24. % ...
  25.  
  26.  
  27. % Opera��es
  28.  
  29. tipo_operacoes([opt1,opt2,opt3,opt4,opt5,opt6,opt7,opt8,opt9,opt10]).
  30.  
  31. % operacoes/1 vai ser criado dinamicamente
  32. %no exemplo dara' uma lista com 30 operacoes 6 lotes de produtos * 5 operacoes por produto
  33.  
  34. %operacoes_atrib_maq/2 vai ser criado dinamicamente
  35. %no exemplo cada maquina tera' 6 operacoes atribuidas, uma por cada lote de produtos
  36.  
  37. % classif_operacoes/2 deve ser criado dinamicamente
  38. %no exemplo teremos 30 factos deste tipo, um para cada operacao
  39.  
  40.  
  41. % Afeta��o de tipos de opera��es a tipos de m�quinas
  42. % com ferramentas, tempos de setup e tempos de execucao)
  43.  
  44. operacao_maquina(opt1,ma,fa,1,1).
  45. operacao_maquina(opt2,mb,fb,2.5,2).
  46. operacao_maquina(opt3,mc,fc,1,3).
  47. operacao_maquina(opt4,md,fd,1,1).
  48. operacao_maquina(opt5,me,fe,2,3).
  49. operacao_maquina(opt6,mb,ff,1,4).
  50. operacao_maquina(opt7,md,fg,2,5).
  51. operacao_maquina(opt8,ma,fh,1,6).
  52. operacao_maquina(opt9,me,fi,1,7).
  53. operacao_maquina(opt10,mc,fj,20,2).
  54.  
  55.  
  56.  
  57.  
  58.  
  59. %...
  60.  
  61.  
  62. % PRODUTOS
  63.  
  64. produtos([pA,pB,pC,pD,pE,pF]).
  65.  
  66. operacoes_produto(pA,[opt1,opt2,opt3,opt4,opt5]).
  67. operacoes_produto(pB,[opt1,opt6,opt3,opt4,opt5]).
  68. operacoes_produto(pC,[opt1,opt2,opt3,opt7,opt5]).
  69. operacoes_produto(pD,[opt8,opt2,opt3,opt4,opt5]).
  70. operacoes_produto(pE,[opt1,opt2,opt3,opt4,opt9]).
  71. operacoes_produto(pF,[opt1,opt2,opt10,opt4,opt5]).
  72.  
  73.  
  74.  
  75. % ENCOMENDAS
  76.  
  77. %Clientes
  78.  
  79. clientes([clA,clB,clC,clD]).
  80.  
  81.  
  82. % prioridades dos clientes
  83.  
  84. prioridade_cliente(clA,2).
  85. prioridade_cliente(clB,1).
  86. prioridade_cliente(clC,3).
  87. prioridade_cliente(clD,2).
  88. prioridade_cliente(clE,3).
  89.  
  90.  
  91. % ...
  92.  
  93. % Encomendas do cliente,
  94. % termos e(<produto>,<n.unidades>,<tempo_conclusao>)
  95.  
  96. encomenda(clA,[e(pA,4,50),e(pB,4,70)]).
  97. encomenda(clB,[e(pC,3,30),e(pD,5,200)]).
  98. encomenda(clC,[e(pE,4,60),e(pF,6,120)]).
  99.  
  100. % ...
  101.  
  102.  
  103.  
  104.  
  105. % cria_op_enc - fizeram-se correcoes face a versao anterior
  106.  
  107. :- dynamic operacoes_atrib_maq/2.
  108. :- dynamic classif_operacoes/2.
  109. :- dynamic op_prod_client/9.
  110. :- dynamic operacoes/1.
  111.  
  112.  
  113. cria_op_enc:-retractall(operacoes(_)),
  114. retractall(operacoes_atrib_maq(_,_)),retractall(classif_operacoes(_,_)),
  115. retractall(op_prod_client(_,_,_,_,_,_,_,_,_)),
  116. findall(t(Cliente,Prod,Qt,TConc),
  117. (encomenda(Cliente,LE),member(e(Prod,Qt,TConc),LE)),
  118. LT),cria_ops(LT,0),
  119. findall(Op,classif_operacoes(Op,_),LOp),asserta(operacoes(LOp)),
  120. maquinas(LM),
  121. findall(_,
  122. (member(M,LM),
  123. findall(Opx,op_prod_client(Opx,M,_,_,_,_,_,_,_),LOpx),
  124. assertz(operacoes_atrib_maq(M,LOpx))),_).
  125.  
  126. cria_ops([],_).
  127. cria_ops([t(Cliente,Prod,Qt,TConc)|LT],N):-
  128. operacoes_produto(Prod,LOpt),
  129. cria_ops_prod_cliente(LOpt,Cliente,Prod,Qt,TConc,N,N1),
  130. cria_ops(LT,N1).
  131.  
  132.  
  133. cria_ops_prod_cliente([],_,_,_,_,Nf,Nf).
  134. cria_ops_prod_cliente([Opt|LOpt],Client,Prod,Qt,TConc,N,Nf):-
  135. cria_ops_prod_cliente2(Opt,Prod,Client,Qt,TConc,N,Ni),
  136. cria_ops_prod_cliente(LOpt,Client,Prod,Qt,TConc,Ni,Nf).
  137.  
  138.  
  139. cria_ops_prod_cliente2(Opt,Prod,Client,Qt,TConc,N,Ni):-
  140. Ni is N+1,
  141. atomic_concat(op,Ni,Op),
  142. assertz(classif_operacoes(Op,Opt)),
  143. operacao_maquina(Opt,M,F,Tsetup,Texec),
  144. assertz(op_prod_client(Op,M,F,Prod,Client,Qt,TConc,Tsetup,Texec)).
  145.  
  146.  
  147.  
  148. :-cria_op_enc.
  149.  
  150.  
  151.  
  152. :-dynamic geracoes/1.
  153. :-dynamic populacao/1.
  154. :-dynamic prob_cruzamento/1.
  155. :-dynamic prob_mutacao/1.
  156.  
  157.  
  158. % tarefa(Id,TempoProcessamento,TempConc,PesoPenalizacao).
  159. %tarefa(t1,2,5,1).
  160. %tarefa(t2,4,7,6).
  161. %tarefa(t3,1,11,2).
  162. %tarefa(t4,3,9,3).
  163. %tarefa(t5,3,8,2).
  164.  
  165. % tarefas(NTarefas).
  166. %tarefas(5).
  167.  
  168. edd(LID):-
  169. findall(t(Id,TP,TC,PP),tarefa(Id,TP,TC,PP),Tarefas),
  170. sort(3,@=<,Tarefas,TarefasOrdenadas),converte(TarefasOrdenadas,L),
  171. getId(L,LID).
  172.  
  173. getId([],[]).
  174. getId([(Id,TP,TC,PP)|L],[Id|LID]):-getId(L,LID).
  175.  
  176. converte([],[]).
  177. converte([t(Id,TP,TC,PP)|TT],[(Id,TP,TC,PP)|L]):-converte(TT,L).
  178.  
  179.  
  180.  
  181.  
  182. % parameteriza��o
  183. inicializa:-write('Numero de novas Geracoes: '),read(NG), (retract(geracoes(_));true), asserta(geracoes(NG)),
  184. write('Dimensao da Populacao: '),read(DP),
  185. (retract(populacao(_));true), asserta(populacao(DP)),
  186. write('Probabilidade de Cruzamento (%):'), read(P1),
  187. PC is P1/100,
  188. (retract(prob_cruzamento(_));true), asserta(prob_cruzamento(PC)),
  189. write('Probabilidade de Mutacao (%):'), read(P2),
  190. PM is P2/100,
  191. (retract(prob_mutacao(_));true), asserta(prob_mutacao(PM)).
  192.  
  193.  
  194. adicionaEDD(T,Pop,Pop):-member(T, Pop).
  195. adicionaEDD(T,[X|Pop],[T|Pop]).
  196.  
  197. adicionaMS(T,Pop,Pop):-member(T, Pop).
  198. adicionaMS(T,[X|Pop],[X|Pop1]):-adicionaMS2(T,Pop,Pop1).
  199.  
  200. adicionaMS2(T,Pop,Pop):-member(T, Pop).
  201. adicionaMS2(T,[X|Pop],[T|Pop]).
  202.  
  203.  
  204. gera:-
  205. cria_Tarefas,
  206. edd(TarefasOrdenadas),
  207. min_slack(TarefasMS),
  208. inicializa,
  209. gera_populacao(Pop),
  210. adicionaEDD(TarefasOrdenadas,Pop,Pop2),
  211. adicionaMS(TarefasMS,Pop2,NPop),
  212. write('Pop='),write(NPop),nl,
  213. avalia_populacao(NPop,PopAv),
  214. write('PopAv='),write(PopAv),nl,
  215. ordena_populacao(PopAv,PopOrd),
  216. geracoes(NG),!,
  217. gera_geracao(0,NG,PopOrd).
  218.  
  219. gera_populacao(Pop):-
  220. populacao(TamPop),
  221. tarefas(NumT),
  222. findall(Tarefa,tarefa(Tarefa,_,_,_),ListaTarefas),
  223. gera_populacao(TamPop,ListaTarefas,NumT,Pop).
  224.  
  225. gera_populacao(0,_,_,[]):-!.
  226.  
  227. gera_populacao(TamPop,ListaTarefas,NumT,[Ind|Resto]):-
  228. TamPop1 is TamPop-1,
  229. gera_populacao(TamPop1,ListaTarefas,NumT,Resto),
  230. gera_individuo(ListaTarefas,NumT,Ind),
  231. not(member(Ind,Resto)).
  232. gera_populacao(TamPop,ListaTarefas,NumT,L):-
  233. gera_populacao(TamPop,ListaTarefas,NumT,L).
  234.  
  235. gera_individuo([G],1,[G]):-!.
  236.  
  237. gera_individuo(ListaTarefas,NumT,[G|Resto]):-
  238. NumTemp is NumT + 1, % To use with random
  239. random(1,NumTemp,N),
  240. retira(N,ListaTarefas,G,NovaLista),
  241. NumT1 is NumT-1,
  242. gera_individuo(NovaLista,NumT1,Resto).
  243.  
  244. retira(1,[G|Resto],G,Resto).
  245. retira(N,[G1|Resto],G,[G1|Resto1]):-
  246. N1 is N-1,
  247. retira(N1,Resto,G,Resto1).
  248.  
  249. avalia_populacao([],[]).
  250. avalia_populacao([Ind|Resto],[Ind*V|Resto1]):-
  251. avalia(Ind,V),
  252. avalia_populacao(Resto,Resto1).
  253.  
  254. avalia(Seq,V):-
  255. avalia(Seq,0,V).
  256.  
  257. avalia([],_,0).
  258. avalia([T|Resto],Inst,V):-
  259. tarefa(T,Dur,Prazo,Pen),
  260. InstFim is Inst+Dur,
  261. avalia(Resto,InstFim,VResto),
  262. (
  263. (InstFim =< Prazo,!, VT is 0)
  264. ;
  265. (VT is (InstFim-Prazo)*Pen)
  266. ),
  267. V is VT+VResto.
  268.  
  269. ordena_populacao(PopAv,PopAvOrd):-
  270. bsort(PopAv,PopAvOrd).
  271.  
  272. bsort([X],[X]):-!.
  273. bsort([X|Xs],Ys):-
  274. bsort(Xs,Zs),
  275. btroca([X|Zs],Ys).
  276.  
  277.  
  278. btroca([X],[X]):-!.
  279.  
  280. btroca([X*VX,Y*VY|L1],[Y*VY|L2]):-
  281. VX>VY,!,
  282. btroca([X*VX|L1],L2).
  283.  
  284. btroca([X|L1],[X|L2]):-btroca(L1,L2).
  285.  
  286. melhores1(Lista,Melhores,Restantes,NElementos):-
  287. length(Lista, Length), Length >= NElementos, melhores(Lista,Melhores,Restantes,NElementos).
  288. melhores1(Lista,Melhores,Restantes,NElementos):-
  289. length(Lista, Length),melhores(Lista,Melhores,Restantes,Length).
  290.  
  291. melhores(L,[],L,0).
  292. melhores([X|L],[X|T],Restantes,N):- N1 is N-1, melhores(L,T,Restantes,N1).
  293.  
  294.  
  295.  
  296. member1(X,[H|_]) :- X==H,!.
  297. member1(X,[_|T]) :- member1(X,T).
  298.  
  299. distinct([],[]).
  300. distinct([H|T],C) :- member1(H,T),!, distinct(T,C).
  301. distinct([H|T],[H|C]) :- distinct(T,C).
  302.  
  303. torneio([],[],[]).
  304. torneio([_|[]],[],[]).
  305. torneio([Ind1*X,Ind2*Y|L],[Vence|Vencedores],[Perde|Perdedores]):- torneio(L,Vencedores,Perdedores), A is Y / (X+Y),
  306. random(0,A,A1), B is X / (X+Y),random(0,B,B1), vencedor(Ind1*X,Ind2*Y,A1,B1,Vence,Perde).
  307.  
  308. vencedor(Ind1*X,Ind2*Y,A,B,Ind1*X,Ind2*Y):-A>B.
  309. vencedor(Ind1*X,Ind2*Y,A,B,Ind2*Y,Ind1*X).
  310.  
  311. parImpar(X,1):- R is rem(X,2),R==1.
  312. parImpar(X,2).
  313.  
  314. estaCompleto(MelhoresComVencedores,Perdedores,TamPop,MelhoresComVencedores):-
  315. length(MelhoresComVencedores, Tam), Tam==TamPop.
  316.  
  317. estaCompleto(MelhoresComVencedores,[P|Perdedores],TamPop,NovaPop):-
  318. estaCompleto([P|MelhoresComVencedores],Perdedores,TamPop,NovaPop).
  319.  
  320.  
  321.  
  322. gera_geracao(G,G,Pop):-!,
  323. write('Geraçao '), write(G), write(':'), nl, write(Pop), nl.
  324.  
  325. gera_geracao(N,G,Pop):-
  326. length(Pop, TamanhoPop),
  327. write('Geraçao '), write(N), write(':'), nl, write(Pop), nl,
  328. random_permutation(Pop,PopRandom),
  329. cruzamento(PopRandom,NPop1),
  330. mutacao(NPop1,NPop),
  331. avalia_populacao(NPop,NPopAv),
  332. ordena_populacao(NPopAv,NPopOrd),
  333.  
  334. append(Pop,NPopOrd,TodasPop),
  335. ordena_populacao(TodasPop,TodasPopOrd),
  336. distinct(TodasPopOrd, TodasSemRepetidos),
  337. length(TodasSemRepetidos, SemRepetidosLenght),
  338. parImpar(SemRepetidosLenght,NElementos),
  339. NumeroVagas is TamanhoPop - NElementos,
  340. melhores1(TodasSemRepetidos,Melhores,Restantes,NElementos),
  341.  
  342. torneio(Restantes,Vencedores,Perdedores),
  343. melhores1(Vencedores, MelhoresVencedores,RestantesVencedores,NumeroVagas),
  344. append(Melhores, MelhoresVencedores, MelhoresComVencedores),
  345.  
  346. append(RestantesVencedores, Perdedores,NaoEntraram),
  347. ordena_populacao(NaoEntraram,NaoEntraramOrd),
  348. estaCompleto(MelhoresComVencedores,NaoEntraramOrd,TamanhoPop,PopFinal),
  349. ordena_populacao(PopFinal,PopFinalOrdenada),
  350.  
  351. N1 is N+1,!,
  352. gera_geracao(N1,G,PopFinalOrdenada).
  353.  
  354. gerar_pontos_cruzamento(P1,P2):-
  355. gerar_pontos_cruzamento1(P1,P2).
  356.  
  357. gerar_pontos_cruzamento1(P1,P2):-
  358. tarefas(N),
  359. NTemp is N+1,
  360. random(1,NTemp,P11),
  361. random(1,NTemp,P21),
  362. P11\==P21,!,
  363. ((P11<P21,!,P1=P11,P2=P21);(P1=P21,P2=P11)).
  364. gerar_pontos_cruzamento1(P1,P2):-
  365. gerar_pontos_cruzamento1(P1,P2).
  366.  
  367.  
  368. cruzamento([],[]).
  369. cruzamento([Ind*_],[Ind]).
  370. cruzamento([Ind1*_,Ind2*_|Resto],[NInd1,NInd2|Resto1]):-
  371. gerar_pontos_cruzamento(P1,P2),
  372. prob_cruzamento(Pcruz),random(0.0,1.0,Pc),
  373. ((Pc =< Pcruz,!,
  374. cruzar(Ind1,Ind2,P1,P2,NInd1),
  375. cruzar(Ind2,Ind1,P1,P2,NInd2))
  376. ;
  377. (NInd1=Ind1,NInd2=Ind2)),
  378. cruzamento(Resto,Resto1).
  379.  
  380. preencheh([],[]).
  381.  
  382. preencheh([_|R1],[h|R2]):-
  383. preencheh(R1,R2).
  384.  
  385.  
  386. sublista(L1,I1,I2,L):-
  387. I1 < I2,!,
  388. sublista1(L1,I1,I2,L).
  389.  
  390. sublista(L1,I1,I2,L):-
  391. sublista1(L1,I2,I1,L).
  392.  
  393. sublista1([X|R1],1,1,[X|H]):-!,
  394. preencheh(R1,H).
  395.  
  396. sublista1([X|R1],1,N2,[X|R2]):-!,
  397. N3 is N2 - 1,
  398. sublista1(R1,1,N3,R2).
  399.  
  400. sublista1([_|R1],N1,N2,[h|R2]):-
  401. N3 is N1 - 1,
  402. N4 is N2 - 1,
  403. sublista1(R1,N3,N4,R2).
  404.  
  405. rotate_right(L,K,L1):-
  406. tarefas(N),
  407. T is N - K,
  408. rr(T,L,L1).
  409.  
  410. rr(0,L,L):-!.
  411.  
  412. rr(N,[X|R],R2):-
  413. N1 is N - 1,
  414. append(R,[X],R1),
  415. rr(N1,R1,R2).
  416.  
  417.  
  418. elimina([],_,[]):-!.
  419.  
  420. elimina([X|R1],L,[X|R2]):-
  421. not(member(X,L)),!,
  422. elimina(R1,L,R2).
  423.  
  424. elimina([_|R1],L,R2):-
  425. elimina(R1,L,R2).
  426.  
  427. insere([],L,_,L):-!.
  428. insere([X|R],L,N,L2):-
  429. tarefas(T),
  430. ((N>T,!,N1 is N mod T);N1 = N),
  431. insere1(X,N1,L,L1),
  432. N2 is N + 1,
  433. insere(R,L1,N2,L2).
  434.  
  435.  
  436. insere1(X,1,L,[X|L]):-!.
  437. insere1(X,N,[Y|L],[Y|L1]):-
  438. N1 is N-1,
  439. insere1(X,N1,L,L1).
  440.  
  441. cruzar(Ind1,Ind2,P1,P2,NInd11):-
  442. sublista(Ind1,P1,P2,Sub1),
  443. tarefas(NumT),
  444. R is NumT-P2,
  445. rotate_right(Ind2,R,Ind21),
  446. elimina(Ind21,Sub1,Sub2),
  447. P3 is P2 + 1,
  448. insere(Sub2,Sub1,P3,NInd1),
  449. eliminah(NInd1,NInd11).
  450.  
  451.  
  452. eliminah([],[]).
  453.  
  454. eliminah([h|R1],R2):-!,
  455. eliminah(R1,R2).
  456.  
  457. eliminah([X|R1],[X|R2]):-
  458. eliminah(R1,R2).
  459.  
  460. mutacao([],[]).
  461. mutacao([Ind|Rest],[NInd|Rest1]):-
  462. prob_mutacao(Pmut),
  463. random(0.0,1.0,Pm),
  464. ((Pm < Pmut,!,mutacao1(Ind,NInd));NInd = Ind),
  465. mutacao(Rest,Rest1).
  466.  
  467. mutacao1(Ind,NInd):-
  468. gerar_pontos_cruzamento(P1,P2),
  469. mutacao22(Ind,P1,P2,NInd).
  470.  
  471. mutacao22([G1|Ind],1,P2,[G2|NInd]):-
  472. !, P21 is P2-1,
  473. mutacao23(G1,P21,Ind,G2,NInd).
  474. mutacao22([G|Ind],P1,P2,[G|NInd]):-
  475. P11 is P1-1, P21 is P2-1,
  476. mutacao22(Ind,P11,P21,NInd).
  477.  
  478. mutacao23(G1,1,[G2|Ind],G2,[G1|Ind]):-!.
  479. mutacao23(G1,P,[G|Ind],G2,[G|NInd]):-
  480. P1 is P-1,
  481. mutacao23(G1,P1,Ind,G2,NInd).
  482.  
  483. :-dynamic produtos/1.
  484. :-dynamic tarefa/4.
  485. :-dynamic tarefas/1.
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492. cria_Tarefas:-
  493. retractall(tarefas(_)),retractall(tarefa(_,_,_,_)),% apaga os dados existentes
  494. cria_op_enc,
  495. produtosExistentes(TodosProdutos,NumeroProdutosExistentes),% obtem todos os produtos de todas as encomendas e o numero total
  496. asserta(tarefas(NumeroProdutosExistentes)), %restringe a existentia de tantas tarefas como o numero de produtos existentes
  497. cria_tarefas(TodosProdutos, NumeroProdutosExistentes,1),
  498. findall(tarefa(Id,TempoProcessamento,TempConc,PesoPenalizacao), tarefa(Id,TempoProcessamento,TempConc,PesoPenalizacao), Resultado),
  499. write(Resultado). % rever esta linha!!!!!
  500.  
  501. produtosExistentes(TodosProdutos,NumeroProdutosExistentes):-
  502. findall(Encomedas,encomenda(_,Encomedas),ConjuntoEncomendas),
  503. flatten(ConjuntoEncomendas,ListaEncomendas),
  504. obterProdutosEncomenda(ListaEncomendas,TodosProdutos),
  505. length(TodosProdutos,NumeroProdutosExistentes).
  506.  
  507.  
  508. obterProdutosEncomenda([],[]).
  509. obterProdutosEncomenda([Encomenda|RestoEncomendas],[Produto|TodosProdutos]):-
  510. obter_produto(Encomenda,Produto),
  511. obterProdutosEncomenda(RestoEncomendas,TodosProdutos).
  512.  
  513. obter_produto(e(Produto,_,_),Produto).
  514.  
  515.  
  516. cria_tarefas(_,NumeroProdutosExistentes,NumeroProdutosExistentes).
  517. cria_tarefas([Produto|RestantesProdutos], NumeroProdutosExistentes,Contador):-
  518. IdTarefa is Contador,
  519. cria_tarefaPorProduto(Produto,IdTarefa), % cria tarefa associada a cada produto ---- aqui entra o makespan!!!!
  520. ContadorAuxiliar is Contador + 1,
  521. cria_tarefas(RestantesProdutos, NumeroProdutosExistentes,ContadorAuxiliar).
  522.  
  523.  
  524. cria_tarefaPorProduto(Produto,IdTarefa):-
  525. obterOperacoesDoProduto(Produto,OperacoesDoProduto),
  526. obterOperacoesOrdenadasPeloMaiorTempoExecucao(OperacoesDoProduto,ParesOrdenadosDecrescente),
  527.  
  528. ParesOrdenadosDecrescente = [Operacao|OperacoesRestantes],
  529. obterTempoExecucaoPrimeiraOperacao(Operacao,MaiorTempoExecucao),
  530.  
  531. op_prod_client(_,_,_,Produto,Cliente,DimensaoLote,TempoConclusao,_,_),
  532.  
  533. TempoLote is (DimensaoLote *MaiorTempoExecucao),
  534. somaTempoExecaoRestante(OperacoesRestantes,SomaTempoExecaoRestante),
  535. Makespan is TempoLote + SomaTempoExecaoRestante,
  536. somaTemposPreparacao(ParesOrdenadosDecrescente,0,99999,TempoPreparacao),
  537. MakespanComTempoPreparacao is Makespan-TempoPreparacao,
  538. prioridade_cliente(Cliente,Prioridade),
  539.  
  540. asserta(tarefa(IdTarefa, MakespanComTempoPreparacao,TempoConclusao, Prioridade)).
  541.  
  542.  
  543. obterOperacoesDoProduto(Produto,OperacoesDoProduto):-findall((Texec-Op),op_prod_client(Op,_,_,Produto,_,_,_,_,Texec), OperacoesDoProduto).
  544.  
  545. %Obter uma lista de pares Operacao-tempo execucao ordenadas pelo tempo de execucao de forma decrescente
  546. obterOperacoesOrdenadasPeloMaiorTempoExecucao(OperacoesDoProduto,ParesOrdenadosDecrescente):-
  547. sort(OperacoesDoProduto,ListaParesOrdenadosPelaKey),
  548. reverse(ListaParesOrdenadosPelaKey,ParesOrdenadosDecrescente).
  549.  
  550.  
  551. obterTempoExecucaoPrimeiraOperacao( (TempoExecucao-_),TempoExecucao).
  552.  
  553. somaTempoExecaoRestante([],0).
  554. somaTempoExecaoRestante([(TempoExecucao-_)|Operacoes],SomaTempoExecaoRestante):-
  555. somaTempoExecaoRestante(Operacoes,Tempo),
  556. SomaTempoExecaoRestante is Tempo + TempoExecucao.
  557.  
  558.  
  559. somaTemposPreparacao([],_,MenorTOcupacao,MenorTOcupacao).
  560. somaTemposPreparacao([(_-Op)|ListaOperacoes], SomatorioTempoExecucao,MenorTO, TempoPreparacao):-
  561. op_prod_client(Op,_,_,_,_,_,_,Tsetup,Texecucao),
  562. TOcupacao is SomatorioTempoExecucao - Tsetup,
  563. SomatorioTempoExecucao1 is SomatorioTempoExecucao+Texecucao,
  564. (TOcupacao<MenorTO,MenorTO1 is TOcupacao; MenorTO1 is MenorTO),
  565. somaTemposPreparacao(ListaOperacoes, SomatorioTempoExecucao1,MenorTO1, TempoPreparacao).
  566.  
  567. split_primeiro([X|R],X, R).
  568.  
  569.  
  570. obtemMenor(T,MenorTO,T):- T<MenorTO.
  571. obtemMenor(T,MenorTO,MenorTO).
  572.  
  573.  
  574.  
  575.  
  576.  
  577. min_slack(Lista):-
  578. findall(tarefa(A,B,C,D), tarefa(A,B,C,D), ListaTarefas),
  579. calcular_min_slack(ListaTarefas,Lista,0).
  580.  
  581. calcular_min_slack([],[],_).
  582. calcular_min_slack(TarefasRestantes,[Id|Retorno], SomatorioFolgas):-
  583.  
  584. findall(
  585. (Id,Folga),
  586. (member(tarefa(Id,Makespan,TConc,_),TarefasRestantes),Folga is TConc - Makespan),
  587. IdComFolgas),
  588. sort(2, @=<, IdComFolgas, IdComFolgasOrdenada),
  589.  
  590. split_primeiro(IdComFolgasOrdenada,MenorFolga,Restantes),
  591. split_tarefa(MenorFolga,Id,Makespan),
  592. SomatorioFolgas1 is SomatorioFolgas + Makespan,
  593. apaga1(Id,TarefasRestantes,TarefasRestantesSemMenor),
  594. calcular_min_slack(TarefasRestantesSemMenor,Retorno,SomatorioFolgas1).
  595.  
  596.  
  597. split_tarefa((Id,Makespan),Id,Makespan).
  598. split_tarefa(tarefa(Id,Makespan,TempoConclusao,Prioridade),Id,Makespan,TempoConclusao,Prioridade).
  599.  
  600.  
  601. apaga1(_,[],[]).
  602. apaga1(Id,[tarefa(Id,_,_,_)|L],L):-!.
  603. apaga1(Id,[tarefa(Id2,Makespan,TConc,Prioridade)|L],[tarefa(Id2,Makespan,TConc,Prioridade)|L1]):-apaga1(Id,L,L1).
  604.  
  605.  
  606.  
  607.  
  608.  
  609. todas_permutas_com_findall(Pop):-
  610. cria_tarefas(L),!,
  611. findall(Id,member(tarefa(Id,_,_,_),L),LT),!,
  612. findall(X,(permute(LT,X)),LP),
  613. avalia_populacao(LP,XA),
  614. ordena_populacao(XA,Pop).
  615.  
  616. permute([], []).
  617. permute([X|Rest], L) :-
  618. permute(Rest, L1),
  619. select(X, L, L1).
  620.  
  621. :- dynamic melhor_sol_to/2.
  622. melhor_escalonamento_ocupacao_sem_findall(Lm,Tm):-
  623. get_time(Ti),
  624. cria_tarefas(L),!,
  625. findall(Id,member(tarefa(Id,_,_,_),L),LT),!,
  626. (melhor_escalonamento_ocupacao_sem_findall2(LT);true),retract(melhor_sol_to(Lm,Tm)),
  627. get_time(Tf),Tcomp is Tf-Ti,
  628. write('GERADO EM '),write(Tcomp),
  629. write(' SEGUNDOS'),nl.
  630.  
  631. melhor_escalonamento_ocupacao_sem_findall2(L):- asserta(melhor_sol_to(_,10000)),!,
  632. permute(L,LP),
  633. avalia(LP,Tempo),
  634. atualiza(LP,Tempo),
  635. fail.
  636.  
  637. atualiza(LP,T):-melhor_sol_to(_,Tm),
  638. T<Tm,retract(melhor_sol_to(_,_)),asserta(melhor_sol_to(LP,T)),!.
  639.  
  640.  
  641.  
  642.  
  643. :-dynamic valor/1.
  644.  
  645. gera_criterio_valor(Valor):-
  646. retractall(valor(_)),
  647. asserta(valor(Valor)),
  648. cria_tarefas(R),
  649. edd(TarefasOrdenadas),
  650. min_slack(TarefasMS),
  651. inicializa,
  652. gera_populacao(Pop),
  653. adicionaEDD(TarefasOrdenadas,Pop,Pop2),
  654. adicionaMS(TarefasMS,Pop2,NPop),
  655. write('Pop='),write(NPop),nl,
  656. avalia_populacao(NPop,PopAv),
  657. write('PopAv='),write(PopAv),nl,
  658. ordena_populacao(PopAv,PopOrd),
  659. geracoes(NG),!,
  660. gera_geracao_criterio_valor(0,NG,PopOrd).
  661.  
  662. gera_geracao_criterio_valor(NG,G,[Ind1*X|Pop]):-valor(V),X=<V ,!,
  663. write('Geraçao '), write(NG), write(':'), nl, write([Ind1*X|Pop]), nl.
  664.  
  665. gera_geracao_criterio_valor(G,G,Pop):-!,
  666. write('Geraçao '), write(G), write(':'), nl, write(Pop), nl.
  667.  
  668. gera_geracao_criterio_valor(N,G,Pop):-
  669. length(Pop, TamanhoPop),
  670. write('Geraçao '), write(N), write(':'), nl, write(Pop), nl,
  671. random_permutation(Pop,PopRandom),
  672. cruzamento(PopRandom,NPop1),
  673. mutacao(NPop1,NPop),
  674. avalia_populacao(NPop,NPopAv),
  675. ordena_populacao(NPopAv,NPopOrd),
  676.  
  677. append(Pop,NPopOrd,TodasPop),
  678. ordena_populacao(TodasPop,TodasPopOrd),
  679. distinct(TodasPopOrd, TodasSemRepetidos),
  680. length(TodasSemRepetidos, SemRepetidosLenght),
  681. (SemRepetidosLenght,NElementos),
  682. NumeroVagas is TamanhoPop - NElementos,
  683. melhores1(TodasSemRepetidos,Melhores,Restantes,NElementos),
  684.  
  685. torneio(Restantes,Vencedores,Perdedores),
  686. melhores1(Vencedores, MelhoresVencedores,RestantesVencedores,NumeroVagas),
  687. append(Melhores, MelhoresVencedores, MelhoresComVencedores),
  688.  
  689. append(RestantesVencedores, Perdedores,NaoEntraram),
  690. ordena_populacao(NaoEntraram,NaoEntraramOrd),
  691. estaCompleto(MelhoresComVencedores,NaoEntraramOrd,TamanhoPop,PopFinal),
  692. ordena_populacao(PopFinal,PopFinalOrdenada),
  693.  
  694. N1 is N+1,!,
  695. gera_geracao_criterio_valor(N1,G,PopFinalOrdenada).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement