Advertisement
moreiramota

Untitled

Jan 5th, 2020
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 38.76 KB | None | 0 0
  1. % F�BRICA
  2.  
  3. % Linhas
  4.  
  5. linhas([lA,lB]).
  6.  
  7.  
  8. % Maquinas
  9.  
  10. % as m�quinas mf at� mj s�o iguais �s m�quinas ma at� me e constituem a linha lB igual a lA
  11. % as m�quinas mk at� mm constituem a linha lC
  12. maquinas([ma,mb,mc,md,me,mf,mg,mh,mi,mj,mk,ml,mm]).
  13.  
  14.  
  15.  
  16. % Ferramentas
  17.  
  18. % as ferramentas fa1 at� fj1 s�o iguais �s ferramentas fa a fj, sendo usadas pelas m�quinas mf at� mj
  19.  
  20. ferramentas([fa,fb,fc,fd,fe,ff,fg,fh,fi,fj,fa1,fb1,fc1,fd1,fe1,ff1,fg1,fh1,fi1,fj1,fk,fl,fm]).
  21.  
  22.  
  23. % Maquinas que constituem as Linhas
  24.  
  25. tipos_maq_linha(lA,[ma,mb,mc,md,me]).
  26. tipos_maq_linha(lB,[mf,mg,mh,mi,mj]).
  27. %tipos_maq_linha(lC,[mk,ml,mm]).
  28.  
  29. % ...
  30.  
  31.  
  32. % Opera��es
  33.  
  34. tipo_operacoes([opt1,opt2,opt3,opt4,opt5,opt6,opt7,opt8,opt9,opt10,opt11,opt12,opt13]).
  35.  
  36. % operacoes/1 vai ser criado dinamicamente
  37. %no exemplo dara' uma lista com 92 opera��es: 50 operacoes pelos 10 lotes de produtos * 5 operacoes que poder�o ir para as linhas lA ou lB mais 14 lotes de produtos * 3 opera��es que ir�o para a linha lC
  38.  
  39. %operacoes_atrib_maq/2 vai ser criado dinamicamente
  40. %no exemplo as m�quinas mk a mm ter�o 14 operacoes atribuidas, uma por cada lote de produtos que ir� para lC; as opera��es atribu�das �s m�quinas ma at� mj dependem do balanceamento que for feito
  41.  
  42. % classif_operacoes/2 deve ser criado dinamicamente
  43. %no exemplo teremos 92 factos deste tipo, um para cada operacao
  44.  
  45.  
  46. % Afeta��o de tipos de opera��es a tipos de m�quinas
  47. % com ferramentas, tempos de setup e tempos de execucao)
  48.  
  49. operacao_maquina(opt1,ma,fa,1,1).
  50. operacao_maquina(opt2,mb,fb,2.5,2).
  51. operacao_maquina(opt3,mc,fc,1,3).
  52. operacao_maquina(opt4,md,fd,1,1).
  53. operacao_maquina(opt5,me,fe,2,3).
  54. operacao_maquina(opt6,mb,ff,1,4).
  55. operacao_maquina(opt7,md,fg,2,5).
  56. operacao_maquina(opt8,ma,fh,1,6).
  57. operacao_maquina(opt9,me,fi,1,7).
  58. operacao_maquina(opt10,mc,fj,20,2).
  59. operacao_maquina(opt1,mf,fa1,1,1).
  60. operacao_maquina(opt2,mg,fb1,2.5,2).
  61. operacao_maquina(opt3,mh,fc1,1,3).
  62. operacao_maquina(opt4,mi,fd1,1,1).
  63. operacao_maquina(opt5,mj,fe1,2,3).
  64. operacao_maquina(opt6,mg,ff1,1,4).
  65. operacao_maquina(opt7,mi,fg1,2,5).
  66. operacao_maquina(opt8,mf,fh1,1,6).
  67. operacao_maquina(opt9,mj,fi1,1,7).
  68. operacao_maquina(opt10,mh,fj1,20,2).
  69. operacao_maquina(opt11,mk,fk,3,2).
  70. operacao_maquina(opt12,ml,fl,1,4).
  71. operacao_maquina(opt13,mm,fm,1,3).
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78. %...
  79.  
  80.  
  81. % PRODUTOS
  82.  
  83. % os produtos pA at� pF podem ser fabricados em lA ou lB
  84. % os produtos pG at� pJ s� podem ser fabricados em lC
  85.  
  86. produtos([pA,pB,pC,pD,pE,pF,pG,pH,pI,pJ]).
  87.  
  88. operacoes_produto(pA,[opt1,opt2,opt3,opt4,opt5]).
  89. operacoes_produto(pB,[opt1,opt6,opt3,opt4,opt5]).
  90. operacoes_produto(pC,[opt1,opt2,opt3,opt7,opt5]).
  91. operacoes_produto(pD,[opt8,opt2,opt3,opt4,opt5]).
  92. operacoes_produto(pE,[opt1,opt2,opt3,opt4,opt9]).
  93. operacoes_produto(pF,[opt1,opt2,opt10,opt4,opt5]).
  94. operacoes_produto(pG,[opt11,opt12,opt13]).
  95. operacoes_produto(pH,[opt11,opt12,opt13]).
  96. operacoes_produto(pI,[opt11,opt12,opt13]).
  97. operacoes_produto(pJ,[opt11,opt12,opt13]).
  98.  
  99.  
  100.  
  101. % ENCOMENDAS
  102.  
  103. %Clientes
  104.  
  105. clientes([clA,clB,clC,clD,clE,clF,clG]).
  106.  
  107.  
  108. % prioridades dos clientes
  109.  
  110. prioridade_cliente(clA,2).
  111. prioridade_cliente(clB,1).
  112. prioridade_cliente(clC,3).
  113. prioridade_cliente(clD,1).
  114. prioridade_cliente(clE,1).
  115. prioridade_cliente(clF,1).
  116. prioridade_cliente(clG,1).
  117. prioridade_cliente(clJ,1).
  118.  
  119. % ...
  120.  
  121. % Encomendas do cliente,
  122. % termos e(<produto>,<n.unidades>,<tempo_conclusao>)
  123.  
  124. % encomendas que poder�o ir para a linha lA ou lB
  125. encomenda(clA,[e(pA,4,50)]).
  126. encomenda(clA,[e(pB,4,70)]).
  127. encomenda(clB,[e(pC,3,30)]).
  128. encomenda(clB,[e(pD,5,200)]).
  129. encomenda(clC,[e(pE,4,60)]).
  130. encomenda(clC,[e(pF,6,120)]).
  131. encomenda(clA,[e(pD,1,500)]).
  132. %encomenda(clA,[e(pF,20,450)]).
  133. %encomenda(clB,[e(pB,4,100)]).
  134. %encomenda(clC,[e(pA,3,100)]).
  135. % encomendas que ir�o para a linha lC
  136. %encomenda(clD,[e(pG,5,40)]).
  137. %encomenda(clE,[e(pH,3,30)]).
  138. %encomenda(clF,[e(pI,4,60)]).
  139. %encomenda(clJ,[e(pJ,5,140)]).
  140. %encomenda(clD,[e(pJ,5,200)]).
  141. %encomenda(clE,[e(pG,4,150)]).
  142. %encomenda(clF,[e(pH,3,180)]).
  143. %encomenda(clJ,[e(pI,2,100)]).
  144. %encomenda(clA,[e(pI,4,100)]).
  145. %encomenda(clA,[e(pH,5,170)]).
  146. %encomenda(clB,[e(pG,5,230)]).
  147. %encomenda(clB,[e(pJ,3,250)]).
  148. %encomenda(clC,[e(pG,6,280)]).
  149. %encomenda(clC,[e(pH,6,300)]).
  150.  
  151. % cria_op_enc - fizeram-se correcoes face a versao anterior
  152.  
  153. :- dynamic operacoes_atrib_maq/2.
  154. :- dynamic classif_operacoes/2.
  155. :- dynamic op_prod_client/9.
  156. :- dynamic operacoes/1.
  157.  
  158.  
  159. cria_op_enc:-retractall(operacoes(_)),
  160. retractall(operacoes_atrib_maq(_,_)),retractall(classif_operacoes(_,_)),
  161. retractall(op_prod_client(_,_,_,_,_,_,_,_,_)),
  162. findall(t(Cliente,Prod,Qt,TConc),
  163. (encomenda(Cliente,LE),member(e(Prod,Qt,TConc),LE)),
  164. LT),cria_ops(LT,0),
  165. findall(Op,classif_operacoes(Op,_),LOp),asserta(operacoes(LOp)),
  166. maquinas(LM),
  167. findall(_,
  168. (member(M,LM),
  169. findall(Opx,op_prod_client(Opx,M,_,_,_,_,_,_,_),LOpx),
  170. assertz(operacoes_atrib_maq(M,LOpx))),_).
  171.  
  172. cria_ops([],_).
  173. cria_ops([t(Cliente,Prod,Qt,TConc)|LT],N):-
  174. operacoes_produto(Prod,LOpt),
  175. cria_ops_prod_cliente(LOpt,Cliente,Prod,Qt,TConc,N,N1),
  176. cria_ops(LT,N1).
  177.  
  178.  
  179. cria_ops_prod_cliente([],_,_,_,_,Nf,Nf).
  180. cria_ops_prod_cliente([Opt|LOpt],Client,Prod,Qt,TConc,N,Nf):-
  181. cria_ops_prod_cliente2(Opt,Prod,Client,Qt,TConc,N,Ni),
  182. cria_ops_prod_cliente(LOpt,Client,Prod,Qt,TConc,Ni,Nf).
  183.  
  184.  
  185. cria_ops_prod_cliente2(Opt,Prod,Client,Qt,TConc,N,Ni):-
  186. Ni is N+1,
  187. atomic_concat(op,Ni,Op),
  188. assertz(classif_operacoes(Op,Opt)),
  189. operacao_maquina(Opt,M,F,Tsetup,Texec),
  190. assertz(op_prod_client(Op,M,F,Prod,Client,Qt,TConc,Tsetup,Texec)).
  191.  
  192.  
  193.  
  194. :-cria_op_enc.
  195.  
  196. %=============================================================================================================================
  197. % CIRA TAREFAS SPIRNT 2
  198. %=============================================================================================================================
  199. %CRIA TAREFAS DINAMICAMENTE ---- Referente ao sprint 2
  200. % Notas:
  201. %produto corresponde a uma tarefa
  202.  
  203. :-dynamic dados_produto_cliente_da_tarefa/5.
  204. :-dynamic produtos/1.
  205. :-dynamic tarefa/4.
  206. :-dynamic tarefas/1.
  207.  
  208. cria_tarefas(Resultado):-
  209. retractall(tarefas(_)),retractall(tarefa(_,_,_,_)),(retractall(dados_produto_cliente_da_tarefa(_,_,_,_,_));true),% apaga os dados existentes
  210. cria_op_enc,
  211. produtosExistentes(TodosProdutos,NumeroProdutosExistentes),% obtem todos os produtos de todas as encomendas e o numero total
  212. asserta(tarefas(NumeroProdutosExistentes)), %restringe a existentia de tantas tarefas como o numero de produtos existentes
  213. cria_tarefas(TodosProdutos, NumeroProdutosExistentes,0),
  214. findall(tarefa(Id,TempoProcessamento,TempConc,PesoPenalizacao), tarefa(Id,TempoProcessamento,TempConc,PesoPenalizacao), Resultado).
  215.  
  216.  
  217. produtosExistentes(TodosProdutos,NumeroProdutosExistentes):-
  218. findall(Encomedas,encomenda(_,Encomedas),ConjuntoEncomendas),
  219. flatten(ConjuntoEncomendas,ListaEncomendas),
  220. obterProdutosEncomenda(ListaEncomendas,TodosProdutos),
  221. length(TodosProdutos,NumeroProdutosExistentes).
  222.  
  223.  
  224. obterProdutosEncomenda([],[]).
  225. obterProdutosEncomenda([Encomenda|RestoEncomendas],[Produto|TodosProdutos]):-
  226. obter_produto(Encomenda,Produto),
  227. obterProdutosEncomenda(RestoEncomendas,TodosProdutos).
  228.  
  229. obter_produto(e(Produto,_,_),Produto).
  230.  
  231.  
  232. cria_tarefas(_,NumeroProdutosExistentes,NumeroProdutosExistentes).
  233. cria_tarefas([Produto|RestantesProdutos], NumeroProdutosExistentes,Contador):-
  234. IdTarefa is Contador+1,
  235. cria_tarefaPorProduto(Produto,IdTarefa), % cria tarefa associada a cada produto ---- aqui entra o makespan!!!!
  236. cria_tarefas(RestantesProdutos, NumeroProdutosExistentes,IdTarefa).
  237.  
  238.  
  239. cria_tarefaPorProduto(Produto,IdTarefa):-
  240. obterOperacoesDoProduto(Produto,OperacoesDoProduto),
  241. obterOperacoesOrdenadasPeloMaiorTempoExecucao(OperacoesDoProduto,ParesOrdenadosDecrescente),
  242.  
  243. ParesOrdenadosDecrescente = [Operacao|OperacoesRestantes],
  244. obterTempoExecucaoPrimeiraOperacao(Operacao,MaiorTempoExecucao),
  245.  
  246. op_prod_client(_,_,_,Produto,Cliente,DimensaoLote,TempoConclusao,_,_),
  247.  
  248. TempoLote is (DimensaoLote *MaiorTempoExecucao),
  249. somaTempoExecaoRestante(OperacoesRestantes,SomaTempoExecaoRestante),
  250. Makespan is TempoLote + SomaTempoExecaoRestante,
  251. somaTemposPreparacao(ParesOrdenadosDecrescente,0,99999,TempoPreparacao),
  252. MakespanComTempoPreparacao is Makespan-TempoPreparacao,
  253. prioridade_cliente(Cliente,Prioridade),
  254.  
  255. asserta(dados_produto_cliente_da_tarefa(IdTarefa,Produto,Cliente,DimensaoLote,TempoConclusao)),
  256. asserta(tarefa(IdTarefa, MakespanComTempoPreparacao,TempoConclusao, Prioridade)).
  257.  
  258.  
  259. obterOperacoesDoProduto(Produto,OperacoesDoProduto):-findall((Texec-Op),op_prod_client(Op,_,_,Produto,_,_,_,_,Texec), OperacoesDoProduto).
  260.  
  261. %Obter uma lista de pares Operacao-tempo execucao ordenadas pelo tempo de execucao de forma decrescente
  262. obterOperacoesOrdenadasPeloMaiorTempoExecucao(OperacoesDoProduto,ParesOrdenadosDecrescente):-
  263. sort(OperacoesDoProduto,ListaParesOrdenadosPelaKey),
  264. reverse(ListaParesOrdenadosPelaKey,ParesOrdenadosDecrescente).
  265.  
  266.  
  267. obterTempoExecucaoPrimeiraOperacao( (TempoExecucao-_),TempoExecucao).
  268.  
  269. somaTempoExecaoRestante([],0).
  270. somaTempoExecaoRestante([(TempoExecucao-_)|Operacoes],SomaTempoExecaoRestante):-
  271. somaTempoExecaoRestante(Operacoes,Tempo),
  272. SomaTempoExecaoRestante is Tempo + TempoExecucao.
  273.  
  274.  
  275. somaTemposPreparacao([],_,MenorTOcupacao,MenorTOcupacao).
  276. somaTemposPreparacao([(_-Op)|ListaOperacoes], SomatorioTempoExecucao,MenorTO, TempoPreparacao):-
  277. op_prod_client(Op,_,_,_,_,_,_,Tsetup,Texecucao),
  278. TOcupacao is SomatorioTempoExecucao - Tsetup,
  279. SomatorioTempoExecucao1 is SomatorioTempoExecucao+Texecucao,
  280. (TOcupacao<MenorTO,MenorTO1 is TOcupacao; MenorTO1 is MenorTO),
  281. somaTemposPreparacao(ListaOperacoes, SomatorioTempoExecucao1,MenorTO1, TempoPreparacao).
  282.  
  283. %=============================================================================================================================
  284. % BALANCIAMENTO DAS LINHAS E CRIAÇÃO DE AGENDAS SPIRNT 3
  285. %=============================================================================================================================
  286.  
  287. :-dynamic agenda_maq/3.
  288. :-dynamic linha_escalonamento/2. % irá conter a linha e as respetivas tarefas (Linha,ListaTarefas)
  289.  
  290. balanciamento_Linhas_Com_Criacao_Agendas:-
  291. cria_tarefas(ListaTarefas),
  292. sort(3,=<,ListaTarefas,TarefasOrdenadas), % ordena as tarfas por ordem crescente do tempo de conclusao(3. parametro da tarefa)
  293. cria_e_preenche_Linhas(TarefasOrdenadas,LinhasPreenchidas),
  294. write(LinhasPreenchidas),
  295. inicia_e_cria_Agendas(LinhasPreenchidas).
  296.  
  297. cria_e_preenche_Linhas(ListaTarefasOrdenadas,LinhasPreenchidas):-
  298. findall(Linhas,linhas(Linhas),Lista),
  299. flatten(Lista,LinhasExistentes),
  300. write(LinhasExistentes),
  301. iniciaLinhas(LinhasExistentes,ListaLinhas),
  302. write(ListaLinhas),
  303. atribui_tarefa_linha(ListaTarefasOrdenadas,ListaLinhas,LinhasPreenchidas).
  304.  
  305. iniciaLinhas([],[]).
  306. iniciaLinhas([L|Linhas],[ l(L,0,[])| TarefasLinha ]):-
  307. iniciaLinhas(Linhas,TarefasLinha).
  308.  
  309. atribui_tarefa_linha([],TarefasLinhas,TarefasLinhas).
  310. atribui_tarefa_linha([Tarefa|Tarefas],TarefasLinha,TarefasLinhaFinal):-
  311. sort(2,@=<,TarefasLinha,TarefasLinhaOrd),
  312. get_menor_linha(Tarefa,TarefasLinhaOrd,MenorLinha),
  313. delete(TarefasLinha,MenorLinha,Restantes),
  314. MenorLinha = l(Linha,MakeSpanAcomulado,T),
  315. Tarefa=tarefa(_,Makespan,_,_),
  316. MK1 is MakeSpanAcomulado + Makespan,
  317. atribui_tarefa_linha(Tarefas,[l(Linha,MK1,[Tarefa|T])|Restantes],TarefasLinhaFinal).
  318.  
  319. get_menor_linha(_,[],erro).
  320. get_menor_linha(Tarefa,[TarefaLinha|TarefasLinha],MenorLinha):-
  321. Tarefa=tarefa(IdTarefa,_,_,_),
  322. TarefaLinha=l(Linha,_,_),
  323. obterOperacoesdaLinhaSemRepetidos(Linha,OperacoesLinhaSemRepetidos),
  324. dados_produto_cliente_da_tarefa(IdTarefa,Produto,_,_,_),
  325. operacoes_produto(Produto,OperacoesProduto),!,
  326. ((allMembers(OperacoesProduto,OperacoesLinhaSemRepetidos),!,MenorLinha=TarefaLinha);get_menor_linha(Tarefa,TarefasLinha,MenorLinha)).
  327.  
  328.  
  329.  
  330. obterOperacoesdaLinhaSemRepetidos(Linha,OperacoesLinhaSemRepetidos):-
  331. tipos_maq_linha(Linha,TiposMaquinaLinha),
  332. findall(Operacao,(member(Maquina,TiposMaquinaLinha), operacao_maquina(Operacao,Maquina,_,_,_) ),OperacoesLinha),
  333. sort(0,@<,OperacoesLinha,OperacoesLinhaSemRepetidos).
  334.  
  335. %=====================ESTAMOS AQUI NESTE METODO ==========================
  336. inicia_e_cria_Agendas(LinhasPreenchidas):-
  337. brute_force(LinhasPreenchidas,Populacoes),!,
  338. inicializa_agendas,
  339. ((retractall(linha_escalonamento(_,_)));true),
  340. cria_pre_agendas(Populacoes,[],PreAgendasFinal),
  341. write(PreAgendasFinal),
  342. %preenche_agendas(PreAgendasFinal),
  343. findall((Linha,Maquina,Detalhes),agenda_maq(Linha,Maquina,Detalhes),Lista),
  344. write(Lista).
  345. %otimiza_escalonamento.
  346. %=====================ESTAMOS AQUI NESTE METODO ==========================
  347.  
  348.  
  349. brute_force([],[]).
  350. brute_force([TarefaLinha|TarefasLinha],[l(Linha,Pop)|Populacoes]):-
  351. brute_force(TarefasLinha,Populacoes),
  352. (retract(tarefas(_));true), (retractall(tarefa(_,_,_,_));true),
  353. TarefaLinha=l(Linha,_,Tarefas),
  354. length(Tarefas, NumTarefas),
  355. asserta(tarefas(NumTarefas)),
  356. assert_tarefas(Tarefas),
  357. geraListasdeTarefas(Pop,X).
  358.  
  359. assert_tarefas([]).
  360. assert_tarefas([Tarefa|Tarefas]):-
  361. assert_tarefas(Tarefas),
  362. Tarefa=tarefa(Id,MK,TConc,Prio),
  363. asserta(tarefa(Id,MK,TConc,Prio)).
  364.  
  365. inicializa_agendas:-
  366. retractall(agenda_maq(_,_,_)),
  367. linhas(Linhas),
  368. obter_Maquinas_Da_Linha_E_Assert(Linhas,Lista),
  369. write(Lista).
  370.  
  371. obter_Maquinas_Da_Linha_E_Assert(Linhas,ListaMaquinasLinha):-
  372. findall( (Linha,Maquina),
  373. ( member(Linha,Linhas),tipos_maq_linha(Linha,ListaMaquinas),
  374. member(Maquina,ListaMaquinas),
  375. assertz(agenda_maq(Linha,Maquina,[]))
  376. ),ListaMaquinasLinha).
  377.  
  378. cria_pre_agendas([],PreAgendas,PreAgendas).
  379. cria_pre_agendas([Pop|Populacoes],PreAgendas,PreAgendasFinal):-
  380. Pop = l(Linha,Genes),
  381. asserta(linha_escalonamento(Linha,Genes)),
  382. cria_pre_agenda(Linha,Genes,PreAgenda),
  383. cria_pre_agendas(Populacoes,[PreAgenda|PreAgendas],PreAgendasFinal).
  384.  
  385. cria_pre_agenda(_,[],[]).
  386. cria_pre_agenda(Linha,[Tarefa|Tarefas],[Lista|PreAgenda]):-
  387. cria_pre_agenda(Linha,Tarefas,PreAgenda),
  388. tipos_maq_linha(Linha,MaquinasLinha),
  389. obter_Dados_Relativos_Linha_Tarefa_Produto_Cliente_Tempos(Linha,Tarefa,MaquinasLinha,Lista).
  390.  
  391. obter_Dados_Relativos_Linha_Tarefa_Produto_Cliente_Tempos(Linha,Tarefa,MaquinasLinha,Lista):-
  392. dados_produto_cliente_da_tarefa(Tarefa,Produto,Client,Qt,TConc),
  393. findall( l(Linha,Tarefa,Op,M,F,Produto,Client,Qt,TConc,Tsetup,Texec),
  394. (op_prod_client(Op,_,_,Produto,Client,Qt,TConc,_,_),
  395. classif_operacoes(Op,Opt),
  396. operacao_maquina(Opt,M,F,Tsetup,Texec),
  397. member(M, MaquinasLinha)
  398. ),Lista).
  399.  
  400. isMemberOf(X,[X|_]).
  401. isMemberOf(X,[_|T]):- isMemberOf(X,T).
  402.  
  403. allMembers([],_).
  404. allMembers([H|T],L):- allMembers(T,L),isMemberOf(H,L).
  405.  
  406.  
  407.  
  408.  
  409. preenche_agendas([]).
  410. preenche_agendas([PreAgendaLinha|PreAgendas]):-
  411. preenche_linha(PreAgendaLinha,0),
  412. preenche_agendas(PreAgendas).
  413.  
  414. preenche_linha([],_).
  415. preenche_linha(PreAgendaLinha,InstanteInicial):-
  416. PreAgendaLinha=[PreAgendaTarefa|PreAgendasLinha],
  417. agendas(InstanteInicial,PreAgendaTarefa,[],0,0,0,InstanteFinal),
  418. preenche_linha(PreAgendasLinha,InstanteFinal).
  419.  
  420.  
  421. agendas(InstanteInicial,[],_,_,_,ExecFim,ExecFim).
  422. agendas(InstanteInicial,[Tarefa|Tarefas],Anteriores,Instante,TExecAnterior,ExecFimAnterior,InstanteFinal):-
  423. Tarefa = l(Linha1,Tarefa1,Op1,Maquina1,Ferramenta1,Produto1,Cliente1,Qt1,TConc1,TSetup1,TExec1),
  424.  
  425. ( ( Instante==0,!,SetupVirtual is InstanteInicial);( SetupVirtual is Instante - TSetup1)),
  426.  
  427. ( ( SetupVirtual<InstanteInicial,!,Deslizamento is InstanteInicial-SetupVirtual, SetupInicio is InstanteInicial)
  428. ; ( SetupInicio is SetupVirtual ,Deslizamento is 0 )),
  429.  
  430. SetupFim is SetupInicio + TSetup1,
  431. ExecInicio is SetupFim,
  432. ((( TExecAnterior<TExec1,!,ExecFim is Qt1 * TExec1 + ExecInicio,Cadencia is TExec1))
  433. ;(ExecFim is ExecFimAnterior + TExec1 ,Cadencia is TExecAnterior + TExec1 )),
  434.  
  435. desliza(Anteriores,Deslizamento, InstanteInicial),
  436.  
  437. Setup = t(SetupInicio,SetupFim,setup,Ferramenta1),
  438. Detalhes = detalhes(Op1,Qt1,Produto1,Cliente1,Tarefa1),
  439. Execucao=t(ExecInicio, ExecFim,exec,Detalhes),
  440. agenda_maq(Linha1,Maquina1,Sequencia),
  441. ((retract(agenda_maq(Linha1,Maquina1,_)));true),
  442. reverse(Sequencia,SequenciaReversed),
  443.  
  444. Sequencia1=[Setup|SequenciaReversed],
  445. Sequencia2=[Execucao|Sequencia1],
  446. reverse(Sequencia2,SequenciaAtualizada),
  447. asserta(agenda_maq(Linha1,Maquina1,SequenciaAtualizada)),
  448. InstanteSeguinte is ExecInicio + TExec1,
  449. agendas(InstanteInicial,Tarefas,[Tarefa|Anteriores],InstanteSeguinte,Cadencia,ExecFim,InstanteFinal).
  450.  
  451. desliza(_,0,_).
  452. desliza([],_,_).
  453. desliza([(Linha1,_,_,Maquina1,_,_,_,_,_,_,_)|Outras],Deslizamento,ValorInicio):-
  454. agenda_maq(Linha1,Maquina1,Sequencia),
  455. desliza2(Linha1,Maquina1,Sequencia,Deslizamento,SequenciaAtualizada,ValorInicio),
  456. ((retract(agenda_maq(Linha1,Maquina1,_)));true),
  457. asserta(agenda_maq(Linha1,Maquina1,SequenciaAtualizada)),
  458. desliza(Outras,Deslizamento,ValorInicio).
  459.  
  460. %Linha,Maquina,[],Deslizamento,[],ValorInicio
  461. desliza2(_,_,[],_,[],_).
  462. desliza2(Linha,Maquina,[t(Inicio,Fim,setup,Ferr)|Restantes],Deslizamento,
  463. [t(NovoInicio,NovoFim,setup,Ferr)|SequenciaAtualizada],ValorInicio):-
  464. desliza2(Linha,Maquina,Restantes,Deslizamento,SequenciaAtualizada,ValorInicio),
  465. ( ( Inicio >= ValorInicio,!,NovoInicio is Inicio + Deslizamento,
  466. NovoFim is Fim + Deslizamento);( NovoInicio is Inicio, NovoFim is Fim )) .
  467.  
  468. desliza2(Linha,Maquina,[t(Inicio,Fim,exec,detalhes(Op1,Qt1,Produto1,Cliente1,Tarefa1))|Restantes],
  469. Deslizamento,[t(NovoInicio,NovoFim,exec,detalhes(Op1,Qt1,Produto1,Cliente1,Tarefa1))|SequenciaAtualizada],ValorInicio):-
  470. desliza2(Linha,Maquina,Restantes,Deslizamento,SequenciaAtualizada,ValorInicio),
  471. ( ( Inicio >= ValorInicio,!,NovoInicio is Inicio + Deslizamento,
  472. NovoFim is Fim + Deslizamento);( NovoInicio is Inicio, NovoFim is Fim )) .
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503. obterDadosExtradaTarefa(ListaDadosExtra):- findall((Produto,Tarefa,Cliente,Qauntidade,TempoConclusao),dados_produto_cliente_da_tarefa(Produto,Tarefa,Cliente,Qauntidade,TempoConclusao),ListaDadosExtra).
  504. %=============================================================================================================================
  505. % FIM BALANCIAMENTO DAS LINHAS E CRIAÇÃO DE AGENDAS SPIRNT 3
  506. %=============================================================================================================================
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513. %=============================================================================================================================
  514. % SPRINT 1
  515. %=============================================================================================================================
  516. %=============================================================================================================================
  517. % EXERCICIO 1 SPRINT 1
  518. %=============================================================================================================================
  519. %1.1-gerar sequenciamentos de opera??es para 1 m?quina considerando tempos de setup (prepara??o da m?quina com a ferramenta necess?ria) e tentar encontrar o melhor sequenciamento segundo o crit?rio de menor tempo de execu??o
  520. %Dado uma m?quina retorna uma lista de opera??es e o tempo de ocupa??o
  521. %%parametros:
  522. % - M:maquina
  523. % -L lista Opera??es da maquina
  524. % -T lista resultatante
  525.  
  526. ocupacao(M,L,T):-
  527. get_time(Ti),
  528. ordenaOperacoesPorFerramenta(M,L),
  529. tempoOcupacao(semfer,L,T),
  530. get_time(Tf), Tcomp is Tf-Ti,
  531. write('Gerado em '), write(Tcomp),
  532. write(' segundos'),nl.
  533.  
  534. % Cria pares Ferramenta-Operacao
  535. parOperacaoFerramenta(OP,FE-OP):-op_prod_client(OP,_,FE,_,_,_,_,_,_).
  536. % Cria uma lista de operacoes ordenada alfabeticamente pelas ferramentas das opera??es
  537. % M- Maquina
  538. % LO- lista de operaceos da maquina
  539. % SLK- lista ordenada pelas keys
  540. % S- lista resultante ordenada
  541. % PL- lista de pares operacoes ferramentas
  542. ordenaOperacoesPorFerramenta(M,S):- operacoes_atrib_maq(M,LO), maplist(parOperacaoFerramenta,LO,PL), keysort(PL,SLK), pairs_values(SLK,S).
  543. % Calcula tempo de ocupa??o de uma lista de opera??es
  544. % F- ferramenta
  545. % Lista no segundo parametro: lista que contem as opera??es ordenandas pela ferramenta
  546. % T- variavel que ir? conter o somat?rio do tempo de ocupa??o das opera??es
  547. tempoOcupacao(_,[],0).
  548. tempoOcupacao(F,[H|L],T):- op_prod_client(H,_,F1,_,_,_,_,Tset,Texec), tempoOcupacao(F1,L,T1),
  549. ((F1==F,!,T is Texec+T1);T is Tset+Texec+T1).
  550.  
  551. % 1.2-Dado uma m?quina retorna uma lista de opera??es e a soma dos tempos de atraso
  552. atraso(M,L,T):-
  553. get_time(Ti),
  554. ordenaOperacoesPorPrazo(M,L),
  555. reverse(L,S),
  556. tempoAtraso(semfer,S,T,0,0),
  557. get_time(Tf), Tcomp is Tf-Ti,
  558. write('Gerado em '), write(Tcomp),
  559. write(' segundos'),nl.
  560.  
  561. % Cria pares Prazo-Operacao
  562. parPrazoOperacao(O,P-O):-op_prod_client(O,_,_,_,_,_,P,_,_).
  563. % Cria uma lista de operacoes ordenada, ascendente, pelos prazos
  564. % M-maquina
  565. % S- lista contendo as opera??es ordenadas pelo prazo
  566. % Y- lista ordenada pelas keys
  567. % L- lista de operaceos da maquina
  568. % X- lista de pares operacoes prazo
  569. ordenaOperacoesPorPrazo(M,S):- operacoes_atrib_maq(M,L), maplist(parPrazoOperacao,L,X), keysort(X,Y), pairs_values(Y,S).
  570. % Calcula soma dos tempos de atraso de uma lista de opera??es
  571. % % F- ferramenta
  572. % Lista no segundo parametro: lista que contem as opera??es ordenandas pelo prazo
  573. % T- variavel que ir? conter o somat?rio do tempo de atraso das opera??es
  574. % Tocupacao- variavel que guarsa o tempo de ocupa??o
  575. % Tatraso- variavel que guarsa o tempo de atrasp
  576. tempoAtraso(_,[],T,_,Tatraso):- T is Tatraso,!.
  577. tempoAtraso(F,[O|L],T,Tocupacao,Tatraso):- op_prod_client(O,_,F1,_,_,_,Prazo,Tset,Texec),
  578. ((F==F1,!,To1 is Tocupacao + Texec);To1 is Tocupacao+Texec+Tset),
  579. ((To1<Prazo,!,Ta1 is Tatraso);Ta1 is To1-Prazo+Tatraso),
  580. tempoAtraso(F1,L,T,To1,Ta1).
  581. %=============================================================================================================================
  582. % EXERCICIO 2 SPRINT 1
  583. %=============================================================================================================================
  584. % melhor escalonamento com findall, gera todas as solucoes e escolhe melhor
  585. % ------------------------------------------------TEMPO OCUPA??O-----------------------------------------------------------
  586. :- dynamic melhor_sol_to/2.
  587. melhor_escalonamentoComTempoOcupacaoComFindAll(M,Lm,Tm):-
  588. get_time(Ti),
  589. findall(p(LP,Tempo),
  590. permuta_tempo(M,LP,Tempo), LL),
  591. melhor_permuta(LL,Lm,Tm),
  592. get_time(Tf),Tcomp is Tf-Ti,
  593. write('GERADO EM '),write(Tcomp),
  594. write(' SEGUNDOS'),nl.
  595.  
  596. melhor_permuta([p(LP,Tempo)],LP,Tempo):-!.
  597. melhor_permuta([p(LP,Tempo)|LL],LPm,Tm):-
  598. melhor_permuta(LL,LP1,T1),
  599. ((Tempo<T1,!,Tm is Tempo,LPm=LP);(Tm is T1,LPm=LP1)).
  600.  
  601. melhor_escalonamentoComTempoOcupacaoSemFindAll(M,Lm,Tm):-
  602. get_time(Ti),
  603. (melhor_escalonamentoOcupacao(M);true),retract(melhor_sol_to(Lm,Tm)),
  604. get_time(Tf),Tcomp is Tf-Ti,
  605. write('GERADO EM '),write(Tcomp),
  606. write(' SEGUNDOS'),nl.
  607.  
  608. melhor_escalonamentoOcupacao(M):- asserta(melhor_sol_to(_,10000)),!,
  609. permuta_tempoComTempoOcupacao(M,LP,Tempo),
  610. atualiza(LP,Tempo),
  611. fail.
  612.  
  613. permuta_tempoComTempoOcupacao(M,LP,Tempo):-
  614. operacoes_atrib_maq(M,L),
  615. permuta(L,LP),
  616. tempoOcupacao(semfer,LP,Tempo).
  617.  
  618. atualiza(LP,T):-melhor_sol_to(_,Tm),T<Tm,retract(melhor_sol_to(_,_)),asserta(melhor_sol_to(LP,T)),!.
  619.  
  620. %----------------------------------------------TEMPO ATRASO--------------------------------------------------------%
  621. melhor_escalonamentoComTempoAtrasoComFindAll(M,Lm,Tm):-
  622. get_time(Ti),
  623. findall(p(LP,Tempo),
  624. permuta_tempoComTempoAtraso(M,LP,Tempo), LL),
  625. melhor_permuta(LL,Lm,Tm),
  626. get_time(Tf),Tcomp is Tf-Ti,
  627. write('GERADO EM '),write(Tcomp),
  628. write(' SEGUNDOS'),nl.
  629.  
  630. melhor_escalonamentoComTempoAtrasoSemFindAll(M,Lm,Tm):-
  631. get_time(Ti),
  632. (melhor_escalonamentoAtraso(M);true),retract(melhor_sol_to(Lm,Tm)),
  633. get_time(Tf),Tcomp is Tf-Ti,
  634. write('GERADO EM '),write(Tcomp),
  635. write(' SEGUNDOS'),nl.
  636.  
  637. permuta_tempoComTempoAtraso(M,LP,Tempo):-
  638. operacoes_atrib_maq(M,L),
  639. permuta(L,LP),
  640. tempoAtraso(semfer,LP,Tempo,0,0).
  641.  
  642. melhor_escalonamentoAtraso(M):-
  643. asserta(melhor_sol_to(_,10000)),!,
  644. permuta_tempoComTempoAtraso(M,LP,Tempo),
  645. atualiza(LP,Tempo),
  646. fail.
  647. %=============================================================================================================================
  648. % EXERCICIO 3 SPRINT 1
  649. % HEURÍSTICAS
  650. %=============================================================================================================================
  651. estimativa(LOp,Estimativa):-
  652. findall(p(FOp,Tsetup),
  653. (member(Op,LOp),op_prod_client(Op,_,FOp,_,_,_,_,Tsetup,_)),
  654. LFTsetup),
  655. elimina_repetidos(LFTsetup,L),
  656. soma_setups(L,Estimativa).
  657.  
  658. elimina_repetidos([],[]).
  659. elimina_repetidos([X|L],L1):-member(X,L),!,elimina_repetidos(L,L1).
  660. elimina_repetidos([X|L],[X|L1]):-elimina_repetidos(L,L1).
  661. soma_setups([],0).
  662. soma_setups([p(_,Tsetup)|L],Ttotal):- soma_setups(L,T1), Ttotal is Tsetup+T1.
  663.  
  664. obterTemposPorOperacao(Op1,M,F,Ts,Te):-
  665. classif_operacoes(Op1,Opt1), %obtem o tipo de operacao conforme a operacao
  666. operacao_maquina(Opt1,M,F,Ts,Te). % obtem e retorna nas variaveis Ts maquina e ferramenta
  667.  
  668. verificarFerramenta(M,F,[Op2|ROperacoes]):-
  669. obterTemposPorOperacao(Op2,_,F,_,_). % verifica se a ferramenta F e igual a ferramenta da Op2
  670.  
  671. estimativaS(LOp,Estimativa,CustoAtual):-
  672. findall(p(Op,Atraso),
  673. (member(Op,LOp),op_prod_client(Op,M,F,_,_,_,To,Ts,Te),
  674. ((verificarFerramenta(M,F,LOp),!,CX is Te);CX is Ts+Te),
  675. Aux2 is CustoAtual + CX,
  676. Atraso is Aux2 - To ),
  677. LFTsetup),
  678. soma_atrasos(LFTsetup,Estimativa).
  679.  
  680. soma_atrasos([],0).
  681. soma_atrasos([p(_,Atraso)|L],Ttotal):- soma_atrasos(L,T1), Ttotal is Atraso+T1.
  682. %=============================================================================================================================
  683. % FINAL SPRINT 1
  684. %=============================================================================================================================
  685.  
  686.  
  687.  
  688.  
  689. %=============================================================================================================================
  690. % SPRINT 2
  691. %=============================================================================================================================
  692. %=============================================================================================================================
  693. % SECÇAO GENÉTICO
  694. %=============================================================================================================================
  695. :-dynamic geracoes/1.
  696. :-dynamic populacao/1.
  697. :-dynamic prob_cruzamento/1.
  698. :-dynamic prob_mutacao/1.
  699.  
  700.  
  701.  
  702. % parameteriza��o
  703. inicializa:-write('Numero de novas Geracoes: '),read(NG), (retract(geracoes(_));true), asserta(geracoes(NG)),
  704. write('Dimensao da Populacao: '),read(DP),
  705. (retract(populacao(_));true), asserta(populacao(DP)),
  706. write('Probabilidade de Cruzamento (%):'), read(P1),
  707. PC is P1/100,
  708. (retract(prob_cruzamento(_));true), asserta(prob_cruzamento(PC)),
  709. write('Probabilidade de Mutacao (%):'), read(P2),
  710. PM is P2/100,
  711. (retract(prob_mutacao(_));true), asserta(prob_mutacao(PM)).
  712.  
  713.  
  714. gera:-
  715. cria_tarefas(R),
  716. inicializa,
  717. gera_populacao(Pop),
  718. write('Pop='),write(Pop),nl,
  719. avalia_populacao(Pop,PopAv),
  720. write('PopAv='),write(PopAv),nl,
  721. ordena_populacao(PopAv,PopOrd),
  722. geracoes(NG),!,
  723. gera_geracao(0,NG,PopOrd).
  724.  
  725. gera_populacao(Pop):-
  726. populacao(TamPop),
  727. tarefas(NumT),
  728. findall(Tarefa,tarefa(Tarefa,_,_,_),ListaTarefas),
  729. gera_populacao(TamPop,ListaTarefas,NumT,Pop).
  730.  
  731. gera_populacao(0,_,_,[]):-!.
  732.  
  733. gera_populacao(TamPop,ListaTarefas,NumT,[Ind|Resto]):-
  734. TamPop1 is TamPop-1,
  735. gera_populacao(TamPop1,ListaTarefas,NumT,Resto),
  736. gera_individuo(ListaTarefas,NumT,Ind),
  737. not(member(Ind,Resto)).
  738. gera_populacao(TamPop,ListaTarefas,NumT,L):-
  739. gera_populacao(TamPop,ListaTarefas,NumT,L).
  740.  
  741. gera_individuo([G],1,[G]):-!.
  742.  
  743. gera_individuo(ListaTarefas,NumT,[G|Resto]):-
  744. NumTemp is NumT + 1, % To use with random
  745. random(1,NumTemp,N),
  746. retira(N,ListaTarefas,G,NovaLista),
  747. NumT1 is NumT-1,
  748. gera_individuo(NovaLista,NumT1,Resto).
  749.  
  750. retira(1,[G|Resto],G,Resto).
  751. retira(N,[G1|Resto],G,[G1|Resto1]):-
  752. N1 is N-1,
  753. retira(N1,Resto,G,Resto1).
  754.  
  755. avalia_populacao([],[]).
  756. avalia_populacao([Ind|Resto],[Ind*V|Resto1]):-
  757. avalia(Ind,V),
  758. avalia_populacao(Resto,Resto1).
  759.  
  760. avalia(Seq,V):-
  761. avalia(Seq,0,V).
  762.  
  763. avalia([],_,0).
  764. avalia([T|Resto],Inst,V):-
  765. tarefa(T,Dur,Prazo,Pen),
  766. InstFim is Inst+Dur,
  767. avalia(Resto,InstFim,VResto),
  768. (
  769. (InstFim =< Prazo,!, VT is 0)
  770. ;
  771. (VT is (InstFim-Prazo)*Pen)
  772. ),
  773. V is VT+VResto.
  774.  
  775. ordena_populacao(PopAv,PopAvOrd):-
  776. bsort(PopAv,PopAvOrd).
  777.  
  778. bsort([X],[X]):-!.
  779. bsort([X|Xs],Ys):-
  780. bsort(Xs,Zs),
  781. btroca([X|Zs],Ys).
  782.  
  783.  
  784. btroca([X],[X]):-!.
  785.  
  786. btroca([X*VX,Y*VY|L1],[Y*VY|L2]):-
  787. VX>VY,!,
  788. btroca([X*VX|L1],L2).
  789.  
  790. btroca([X|L1],[X|L2]):-btroca(L1,L2).
  791.  
  792.  
  793. parImpar(X,1):- R is rem(X,2),R==1.
  794. parImpar(X,2).
  795.  
  796.  
  797.  
  798. melhores1(Lista,Melhores,Restantes,NElementos):-
  799. length(Lista, Length), Length >= NElementos,
  800. melhores(Lista,Melhores,Restantes,NElementos).
  801.  
  802.  
  803. melhores(L,[],L,0).
  804. melhores([X|L],[X|T],Restantes,N):- N1 is N-1, melhores(L,T,Restantes,N1).
  805.  
  806. gera_geracao(G,G,Pop):-!,
  807. write('Geraçao '), write(G), write(':'), nl, write(Pop), nl.
  808.  
  809. gera_geracao(N,G,Pop):-
  810. length(Pop, TamanhoPop),
  811. write('Geraçao '), write(N), write(':'), nl, write(Pop), nl,
  812. random_permutation(Pop,PopRandom), %usamos para garantir haver mais variadade
  813. cruzamento(PopRandom,NPop1), %para determinar onde vai existir os cruzamentos
  814. mutacao(NPop1,NPop), %gera a nova populacao conforme os cruzamentos realizado a mutacao
  815. avalia_populacao(NPop,NPopAv),
  816. ordena_populacao(NPopAv,NPopOrd),
  817.  
  818. append(Pop,NPopOrd,TodasPop), %adiciona a geracao antiga à gerada
  819. ordena_populacao(TodasPop,TodasPopOrd),
  820. elimina_repetidos(TodasPopOrd, TodasSemRepetidos), % elimina os repetidos apos adicionar
  821.  
  822. length(TodasSemRepetidos, SemRepetidosLenght),
  823. parImpar(SemRepetidosLenght,NElementos),
  824. NumeroVagas is TamanhoPop - NElementos,
  825. melhores1(TodasSemRepetidos,Melhores,Restantes,NElementos),
  826. melhores1(Restantes,Melhores2,Restantes1,NumeroVagas),
  827. melhores1(Restantes1,Melhores3,Restantes2,NumeroVagas),
  828. melhores1(Restantes2,Melhores4,Restantes3,NumeroVagas),
  829.  
  830. append(Melhores,Melhores4,Ma),
  831. append(Melhores2,Melhores3,Ma1),
  832. append(Ma,Ma1,PopFinal),
  833.  
  834. ordena_populacao(PopFinal,PopFinalOrdenada),
  835.  
  836. N1 is N+1,!,gera_geracao(N1,G,PopFinalOrdenada).
  837.  
  838. gerar_pontos_cruzamento(P1,P2):-
  839. gerar_pontos_cruzamento1(P1,P2).
  840.  
  841. gerar_pontos_cruzamento1(P1,P2):-
  842. tarefas(N),
  843. NTemp is N+1,
  844. random(1,NTemp,P11),
  845. random(1,NTemp,P21),
  846. P11\==P21,!,
  847. ((P11<P21,!,P1=P11,P2=P21);(P1=P21,P2=P11)).
  848. gerar_pontos_cruzamento1(P1,P2):-
  849. gerar_pontos_cruzamento1(P1,P2).
  850.  
  851.  
  852. cruzamento([],[]).
  853. cruzamento([Ind*_],[Ind]).
  854. cruzamento([Ind1*_,Ind2*_|Resto],[NInd1,NInd2|Resto1]):-
  855. gerar_pontos_cruzamento(P1,P2),
  856. prob_cruzamento(Pcruz),random(0.0,1.0,Pc),
  857. ((Pc =< Pcruz,!,
  858. cruzar(Ind1,Ind2,P1,P2,NInd1),
  859. cruzar(Ind2,Ind1,P1,P2,NInd2))
  860. ;
  861. (NInd1=Ind1,NInd2=Ind2)),
  862. cruzamento(Resto,Resto1).
  863.  
  864.  
  865. preencheh([],[]).
  866.  
  867. preencheh([_|R1],[h|R2]):-
  868. preencheh(R1,R2).
  869.  
  870.  
  871. sublista(L1,I1,I2,L):-
  872. I1 < I2,!,
  873. sublista1(L1,I1,I2,L).
  874.  
  875. sublista(L1,I1,I2,L):-
  876. sublista1(L1,I2,I1,L).
  877.  
  878. sublista1([X|R1],1,1,[X|H]):-!,
  879. preencheh(R1,H).
  880.  
  881. sublista1([X|R1],1,N2,[X|R2]):-!,
  882. N3 is N2 - 1,
  883. sublista1(R1,1,N3,R2).
  884.  
  885. sublista1([_|R1],N1,N2,[h|R2]):-
  886. N3 is N1 - 1,
  887. N4 is N2 - 1,
  888. sublista1(R1,N3,N4,R2).
  889.  
  890. rotate_right(L,K,L1):-
  891. tarefas(N),
  892. T is N - K,
  893. rr(T,L,L1).
  894.  
  895. rr(0,L,L):-!.
  896.  
  897. rr(N,[X|R],R2):-
  898. N1 is N - 1,
  899. append(R,[X],R1),
  900. rr(N1,R1,R2).
  901.  
  902.  
  903. elimina([],_,[]):-!.
  904.  
  905. elimina([X|R1],L,[X|R2]):-
  906. not(member(X,L)),!,
  907. elimina(R1,L,R2).
  908.  
  909. elimina([_|R1],L,R2):-
  910. elimina(R1,L,R2).
  911.  
  912. insere([],L,_,L):-!.
  913. insere([X|R],L,N,L2):-
  914. tarefas(T),
  915. ((N>T,!,N1 is N mod T);N1 = N),
  916. insere1(X,N1,L,L1),
  917. N2 is N + 1,
  918. insere(R,L1,N2,L2).
  919.  
  920.  
  921. insere1(X,1,L,[X|L]):-!.
  922. insere1(X,N,[Y|L],[Y|L1]):-
  923. N1 is N-1,
  924. insere1(X,N1,L,L1).
  925.  
  926. cruzar(Ind1,Ind2,P1,P2,NInd11):-
  927. sublista(Ind1,P1,P2,Sub1),
  928. tarefas(NumT),
  929. R is NumT-P2,
  930. rotate_right(Ind2,R,Ind21),
  931. elimina(Ind21,Sub1,Sub2),
  932. P3 is P2 + 1,
  933. insere(Sub2,Sub1,P3,NInd1),
  934. eliminah(NInd1,NInd11).
  935.  
  936.  
  937. eliminah([],[]).
  938.  
  939. eliminah([h|R1],R2):-!,
  940. eliminah(R1,R2).
  941.  
  942. eliminah([X|R1],[X|R2]):-
  943. eliminah(R1,R2).
  944.  
  945. mutacao([],[]).
  946. mutacao([Ind|Rest],[NInd|Rest1]):-
  947. prob_mutacao(Pmut),
  948. random(0.0,1.0,Pm),
  949. ((Pm < Pmut,!,mutacao1(Ind,NInd));NInd = Ind),
  950. mutacao(Rest,Rest1).
  951.  
  952. mutacao1(Ind,NInd):-
  953. gerar_pontos_cruzamento(P1,P2),
  954. mutacao22(Ind,P1,P2,NInd).
  955.  
  956. mutacao22([G1|Ind],1,P2,[G2|NInd]):-
  957. !, P21 is P2-1,
  958. mutacao23(G1,P21,Ind,G2,NInd).
  959. mutacao22([G|Ind],P1,P2,[G|NInd]):-
  960. P11 is P1-1, P21 is P2-1,
  961. mutacao22(Ind,P11,P21,NInd).
  962.  
  963. mutacao23(G1,1,[G2|Ind],G2,[G1|Ind]):-!.
  964. mutacao23(G1,P,[G|Ind],G2,[G|NInd]):-
  965. P1 is P-1,
  966. mutacao23(G1,P1,Ind,G2,NInd).
  967. %=============================================================================================================================
  968. % FIM SECÇAO GENÉTICO
  969. %=============================================================================================================================
  970.  
  971.  
  972. %=============================================================================================================================
  973. % SECÇAO HEURÍSTICAS
  974. %=============================================================================================================================
  975. edd():-
  976. findall((Ind,M,TC,P),tarefa(Ind,M,TC,P),ListaTarefas),
  977. ordena_populacao(ListaTarefas,ListaTarefasOrdenada).
  978.  
  979.  
  980. menorAtrasoEncomendaComPrioridades_SemShortestpath(Lm,T):-
  981. get_time(Ti),
  982. menorAtrasoEncomendaComPrioridades_SemShortestpath1(Lm,T),!,
  983. get_time(Tf),Tcomp is Tf-Ti,
  984. write('GERADO EM '),write(Tcomp),
  985. write(' SEGUNDOS'),nl.
  986.  
  987. menorAtrasoEncomendaComPrioridades_SemShortestpath1(Lm,T):-
  988. listaOrdenadaSemShortestPath(Lm),
  989. avalia(Lm,T).
  990.  
  991. menorAtrasoEncomendaComPrioridades_Shortestpath(Lm,T):-
  992. get_time(Ti),
  993. menorAtrasoEncomendaComPrioridades_Shortestpath1(Lm,T),!,
  994. get_time(Tf),Tcomp is Tf-Ti,
  995. write('GERADO EM '),write(Tcomp),
  996. write(' SEGUNDOS'),nl.
  997.  
  998. menorAtrasoEncomendaComPrioridades_Shortestpath1(Lm,T):-
  999. listaOrdenadaShortestPath(Lm),
  1000. avalia(Lm,T).
  1001.  
  1002.  
  1003. parPrioridadeTempoConclusaoSemShortestPath(IdTarefa,PesoPenalizacao-IdTarefa):-tarefa(IdTarefa,_,TConclusao,Prioridade), PesoPenalizacao is (TConclusao * ((15-Prioridade)/10)).
  1004.  
  1005. parPrioridadeTempoConclusaoShortestPath(IdTarefa,PesoPenalizacao-IdTarefa):-tarefa(IdTarefa,Makespan,_,Prioridade), PesoPenalizacao is (Makespan * ((15-Prioridade)/10)).
  1006.  
  1007. listaOrdenadaSemShortestPath(S):-
  1008. findall(Id, tarefa(Id,_,_,_), L),
  1009. maplist(parPrioridadeTempoConclusaoSemShortestPath,L,X),
  1010. keysort(X,Y),
  1011. pairs_values(Y,S).
  1012. listaOrdenadaShortestPath(S):-
  1013. findall(Id, tarefa(Id,_,_,_), L),
  1014. maplist(parPrioridadeTempoConclusaoShortestPath,L,X),
  1015. keysort(X,Y),
  1016. pairs_values(Y,S).
  1017.  
  1018.  
  1019.  
  1020.  
  1021. geraListasdeTarefas(Lm,T):-
  1022. get_time(Ti),
  1023. geraListasdeTarefas1(Lm,T),!,
  1024. get_time(Tf),Tcomp is Tf-Ti,
  1025. write('GERADO EM '),write(Tcomp),
  1026. write(' SEGUNDOS'),nl.
  1027.  
  1028. geraListasdeTarefas1(Lm,T):-
  1029. listaOrdenada(Lm),
  1030. avalia(Lm,X).
  1031. %obterTarefasObjeto(X,T).
  1032.  
  1033.  
  1034. parComTempoConclusao(IdTarefa,TConclusao-IdTarefa):-tarefa(IdTarefa,_,TConclusao,_).
  1035.  
  1036. listaOrdenada(S):-
  1037. findall(Id, tarefa(Id,_,_,_), L),
  1038. maplist(parComTempoConclusao,L,X),
  1039. keysort(X,Y),
  1040. pairs_values(Y,S).
  1041.  
  1042.  
  1043. %=============================================================================================================================
  1044. % FIM SECÇAO HEURÍSTICAS
  1045. %=============================================================================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement