Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.80 KB | None | 0 0
  1. % FÁBRICA
  2.  
  3. % Linhas
  4. linhas([lA]).
  5.  
  6. % Maquinas
  7. maquinas([ma]).
  8.  
  9. % Ferramentas
  10. ferramentas([fa,fa,fc]).
  11.  
  12. % Maquinas que constituem as Linhas
  13. tipos_maq_linha(lA,[ma]).
  14. % ...
  15.  
  16. % Operações
  17. tipo_operacoes([opt1,opt2,opt3]).
  18. % operacoes deve ser criado dinamicamente
  19. operacoes([op1,op2,op3,op4,op5]).
  20. %operacoes_atrib_maq depois deve ser criado dinamicamente
  21. operacoes_atrib_maq(ma,[op1,op2,op3,op4,op5]).
  22. %operacoes_atrib_maq(ma,[op1,op2]).
  23.  
  24. % classif_operacoes/2 deve ser criado dinamicamente %%atomic_concat(op,NumOp,Resultado)
  25. classif_operacoes(op1,opt1).
  26. classif_operacoes(op2,opt2).
  27. classif_operacoes(op3,opt1).
  28. classif_operacoes(op4,opt2).
  29. classif_operacoes(op5,opt3).
  30. % ...
  31.  
  32. % PRODUTOS
  33.  
  34. produtos([pA,pB,pC]).
  35.  
  36. operacoes_produto(pA,[opt1]).
  37. operacoes_produto(pB,[opt2]).
  38. operacoes_produto(pC,[opt3]).
  39.  
  40. % ENCOMENDAS
  41.  
  42. %Clientes
  43. clientes([clA,clB]).
  44.  
  45. % prioridades dos clientes
  46. prioridade_cliente(clA,1).
  47. prioridade_cliente(clB,2).
  48. % ...
  49.  
  50. % Encomendas do cliente,
  51. % termos e(<produto>,<n.unidades>,<tempo_conclusao>)
  52. encomenda(clA,[e(pA,1,100),e(pB,1,100)]).
  53. encomenda(clB,[e(pA,1,110),e(pB,1,150),e(pC,1,300)]).
  54. % ...
  55.  
  56. op_prod_client(op1,ma,fa,pA,clA,1,100,5,60).
  57. op_prod_client(op2,ma,fb,pB,clA,1,100,6,30).
  58. op_prod_client(op3,ma,fa,pA,clB,1,110,5,60).
  59. op_prod_client(op4,ma,fb,pB,clB,1,150,6,30).
  60. op_prod_client(op5,ma,fc,pC,clB,1,300,8,40).
  61. % ...
  62.  
  63. % :- dynamic operacoes_atrib_maq/2.
  64. % :- dynamic classif_operacoes/2.
  65. % :- dynamic op_prod_client/9.
  66. % :- dynamic operacoes/1.
  67.  
  68.  
  69. % Dado uma máquina retorna uma lista de operações e o tempo de ocupação
  70. heuristic_occupancy(M,L,T):-
  71. get_time(Ti),
  72. op_fe_sorted_list(M,L),
  73. occupation_time(semfer,L,T),
  74. get_time(Tf), Tcomp is Tf-Ti,
  75. write('Gerado em '), write(Tcomp),
  76. write(' segundos'),nl.
  77.  
  78. % Cria pares Ferramenta-Operacao
  79. op_fe_pair(O,F-O):-op_prod_client(O,_,F,_,_,_,_,_,_).
  80. % Cria uma lista de operacoes ordenada alfabeticamente pelas ferramentas das operações
  81. op_fe_sorted_list(M,S):- operacoes_atrib_maq(M,L), maplist(op_fe_pair,L,X), keysort(X,Y), pairs_values(Y,S).
  82. % Calcula tempo de ocupação de uma lista de operações
  83. occupation_time(_,[],0).
  84. occupation_time(F,[H|L],T):- op_prod_client(H,_,F1,_,_,_,_,Tset,Texec), occupation_time(F1,L,T1),
  85. ((F1==F,!,T is Texec+T1);T is Tset+Texec+T1).
  86.  
  87.  
  88. % Dado uma máquina retorna uma lista de operações e a soma dos tempos de atraso
  89. heuristic_delay(M,L,T):-
  90. get_time(Ti),
  91. op_pr_sorted_list(M,L),
  92. delay_time(semfer,L,T,0,0),
  93. get_time(Tf), Tcomp is Tf-Ti,
  94. write('Gerado em '), write(Tcomp),
  95. write(' segundos'),nl.
  96.  
  97. % Cria pares Prazo-Operacao
  98. op_pr_pair(O,P-O):-op_prod_client(O,_,_,_,_,_,P,_,_).
  99. % Cria uma lista de operacoes ordenada, ascendente, pelos prazos
  100. op_pr_sorted_list(M,S):- operacoes_atrib_maq(M,L), maplist(op_pr_pair,L,X), keysort(X,Y), pairs_values(Y,S).
  101. % Calcula soma dos tempos de atraso de uma lista de operações
  102. delay_time(_,[],T,_,Ta):- T is Ta,!.
  103. delay_time(F,[H|L],T,To,Ta):- op_prod_client(H,_,F1,_,_,_,Prazo,Tset,Texec),
  104. ((F==F1,!,To1 is To + Texec);To1 is To + Texec + Tset),
  105. ((To1<Prazo,!,Ta1 is Ta);Ta1 is To1-Prazo+Ta),
  106. delay_time(F1,L,T,To1,Ta1).
  107.  
  108.  
  109. % A* para tempos de ocupação
  110. aStar_occupancy(M,Cam,Custo):- operacoes_atrib_maq(M,L),aStar_occupancy2([(_,0,[],L)], Cam, Custo).
  111. aStar_occupancy2([(_,Custo,L,[])|_],Cam,Custo):- reverse(L,Cam).
  112. aStar_occupancy2([(_,Ca,LopTratadas,LOpFaltam)|Outros],Cam,Custo):-
  113. findall((CeX,CaX,Ltratadas,Lfaltam),
  114. (((LopTratadas==[],!,first_operation(Op,C));LopTratadas = [OpA|_], next_operation(OpA,Op,C)),
  115. delete(LOpFaltam,Op,Lfaltam),
  116. Ltratadas = [Op|LopTratadas],
  117. CaX is C + Ca,
  118. op_prod_client(Op,_,F,_,_,_,_,_,_),
  119. estimativa_occupancy(LOpFaltam,F,Ce),
  120. CeX is CaX + Ce,
  121. member(Op, LOpFaltam)),
  122. Novos),
  123. append(Outros,Novos,Todos),
  124. sort(Todos,Ordenados),
  125. aStar_occupancy2(Ordenados,Cam,Custo).
  126.  
  127. % Estimativa usada no A* para tempos de setup
  128. estimativa_occupancy(LOp,F,Estimativa):- findall(p(FOp,Tsetup),
  129. (member(Op,LOp),op_prod_client(Op,_,FOp,_,_,_,_,Tsetup,_)),LFTsetup),
  130. elimina_repetidos(LFTsetup,[p(F1,Tsetup)|L]),
  131. ((F==F1,!,soma_setups(L,Estimativa));soma_setups([p(F1,Tsetup)|L],Estimativa)).
  132. % Soma dos tempos de setup
  133. soma_setups([],0).
  134. soma_setups([p(_,Tsetup)|L],Ttotal):-soma_setups(L,T1), Ttotal is Tsetup+T1.
  135.  
  136.  
  137. % A* para tempos de atraso
  138. aStar_delay(M,Cam,Atraso):- operacoes_atrib_maq(M,L), aStar_delay2([(_,0,0,[],L)], Cam, Atraso,_).
  139. aStar_delay2([(_,Atraso,Custo,L,[])|_],Cam,Atraso,Custo):- reverse(L,Cam).
  140. aStar_delay2([(_,At,Ca,LopTratadas,LOpFaltam)|Outros],Cam,Atraso,Custo):-
  141. findall((CeX,AtX,CaX,Ltratadas,Lfaltam),
  142. (((LopTratadas==[],!,first_operation(Op,C));LopTratadas = [OpA|_], next_operation(OpA,Op,C)),
  143. delete(LOpFaltam,Op,Lfaltam),
  144. Ltratadas = [Op|LopTratadas],
  145. CaX is C + Ca,
  146. op_prod_client(Op,_,_,_,_,_,Prazo,_,_),
  147. (CaX<Prazo -> AtX is At; AtX is CaX-Prazo+At),
  148. op_prod_client(OpA,_,F,_,_,_,_,_,_),
  149. estimativa_delay(LOpFaltam,F,CaX,Ce),
  150. CeX is AtX + Ce,
  151. member(Op, LOpFaltam)),
  152. Novos),
  153. append(Outros,Novos,Todos),
  154. sort(Todos,Ordenados),
  155. aStar_delay2(Ordenados,Cam,Atraso,Custo).
  156.  
  157. % Estimativa usada no A* para tempos de setup
  158. estimativa_delay([],_,_,0).
  159. estimativa_delay([H|L],F,C,Estimativa):- estimativa_delay(L,F,C,Estimativa1),
  160. op_prod_client(H,_,F1,_,_,_,Prazo,Tset,Texec),
  161. (F==F1 -> Tocup is C+Texec; Tocup is C+Tset+Texec),
  162. (Tocup<Prazo -> Ta is 0; Ta is Tocup-Prazo),
  163. (Ta < Estimativa1 -> Estimativa is Ta;Estimativa is Estimativa1).
  164.  
  165. % Calculo do tempo da primeira operacao<
  166. first_operation(O,T):- op_prod_client(O,_,_,_,_,_,_,Tset,Texec), T is Tset + Texec.
  167. % Calculo do tempo da proxima operacao
  168. next_operation(C,O,T):- C \== O, op_prod_client(C,_,F,_,_,_,_,_,_), op_prod_client(O,_,F1,_,_,_,_,Tset,Texec),
  169. (F==F1 -> T is Texec; T is Tset + Texec).
  170.  
  171. % Elimina repetidos
  172. elimina_repetidos([],[]).
  173. elimina_repetidos([X|L],L1):-member(X,L),!,elimina_repetidos(L,L1).
  174. elimina_repetidos([X|L],[X|L1]):-elimina_repetidos(L,L1).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement