Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.43 KB | None | 0 0
  1.  
  2. :-dynamic geracoes/1.
  3. :-dynamic populacao/1.
  4. :-dynamic prob_cruzamento/1.
  5. :-dynamic prob_mutacao/1.
  6. :-dynamic best_member/2.
  7. :-dynamic estabiliza/1.
  8. :- use_module(library(http/thread_httpd)).
  9. :- use_module(library(http/http_dispatch)).
  10. :- use_module(library(http/http_parameters)).
  11. :- use_module(library(http/http_client)).
  12. :- use_module(library(http/http_ssl_plugin)).
  13. :- use_module(library(http/json)).
  14.  
  15.  
  16.  
  17. % Cria��o de servidor HTTP no porto 'Port'
  18. server(Port) :-
  19. http_server(http_dispatch, [port(Port)]).
  20.  
  21. :- http_handler('/Gen', gen, []).
  22. gen(_Request):-
  23. format('Content-type: text/plain~n~n'),
  24. gera.
  25.  
  26. % tarefa(Id,TempoProcessamento,TempConc,PesoPenalizacao).
  27. tarefa(t1,2,5,1).
  28. tarefa(t2,4,7,6).
  29. tarefa(t3,1,11,2).
  30. tarefa(t4,3,9,3).
  31. tarefa(t5,3,8,2).
  32.  
  33.  
  34. % tarefas(NTarefas).
  35. tarefas(5).
  36.  
  37. % parameteriza��o
  38. inicializa:-(retract(geracoes(_));true), asserta(geracoes(100)),
  39. (retract(populacao(_));true), asserta(populacao(10)),
  40. (retract(estabiliza(_));true), asserta(estabiliza(20)),
  41. (retract(populacao(best_member(_ , _)));true), asserta(best_member(mock, 0)),
  42. PC is 75/100,
  43. (retract(prob_cruzamento(_));true), asserta(prob_cruzamento(PC)),
  44. PM is 3/100,
  45. (retract(prob_mutacao(_));true), asserta(prob_mutacao(PM)).
  46.  
  47.  
  48. gera:-
  49. inicializa,!,
  50. gera_populacao(Pop),
  51. write('Pop='),write(Pop),nl,
  52. avalia_populacao(Pop,PopAv),
  53. write('PopAv='),write(PopAv),nl,
  54. ordena_populacao(PopAv,PopOrd),
  55. geracoes(NG),
  56. estabiliza(Estav),
  57. PopOrd = [M1 | Orders],
  58. gera_geracao(0, Estav, M1, NG,PopOrd).
  59.  
  60. gera_populacao(Pop):-
  61. populacao(TamaPop),
  62. TamPop is TamaPop-2,
  63. tarefas(NumT),
  64. findall(Tarefa,tarefa(Tarefa,_,_,_),ListaTarefas),
  65. gera_populacao(TamPop,ListaTarefas,NumT,Pop).
  66.  
  67. gera_populacao(0,_,_,L):-!,writeln('EDD'), edd(LL1),minSlack(LL2) ,L = [LL1, LL2| [] ].
  68.  
  69. gera_populacao(TamPop,ListaTarefas,NumT,[Ind|Resto]):-
  70. TamPop1 is TamPop-1,
  71. gera_populacao(TamPop1,ListaTarefas,NumT,Resto),
  72. gera_individuo(ListaTarefas,NumT,Ind),
  73. not(member(Ind,Resto)).
  74.  
  75. gera_populacao(TamPop,ListaTarefas,NumT,L):-
  76. gera_populacao(TamPop,ListaTarefas,NumT,L).
  77.  
  78. gera_individuo([G],1,[G]):-!.
  79.  
  80. gera_individuo(ListaTarefas,NumT,[G|Resto]):-
  81. NumTemp is NumT + 1, % To use with random
  82. random(1,NumTemp,N),
  83. retira(N,ListaTarefas,G,NovaLista),
  84. NumT1 is NumT-1,
  85. gera_individuo(NovaLista,NumT1,Resto).
  86.  
  87. retira(1,[G|Resto],G,Resto).
  88. retira(N,[G1|Resto],G,[G1|Resto1]):-
  89. N1 is N-1,
  90. retira(N1,Resto,G,Resto1).
  91.  
  92. avalia_populacao([],[]).
  93. avalia_populacao([Ind|Resto],[Ind*V|Resto1]):-
  94. avalia(Ind,V),
  95. avalia_populacao(Resto,Resto1).
  96.  
  97. avalia(Seq,V):-
  98. avalia(Seq,0,V).
  99.  
  100. avalia([],_,0).
  101. avalia([T|Resto],Inst,V):-
  102. tarefa(T,Dur,Prazo,Pen),
  103. InstFim is Inst+Dur,
  104. avalia(Resto,InstFim,VResto),
  105. (
  106. (InstFim =< Prazo,!, VT is 0)
  107. ;
  108. (VT is (InstFim-Prazo)*Pen)
  109. ),
  110. V is VT+VResto.
  111.  
  112. ordena_populacao(PopAv,PopAvOrd):-
  113. bsort(PopAv,PopAvOrd).
  114.  
  115. bsort([X],[X]):-!.
  116. bsort([X|Xs],Ys):-
  117. bsort(Xs,Zs),
  118. btroca([X|Zs],Ys).
  119.  
  120.  
  121. btroca([X],[X]):-!.
  122.  
  123. btroca([X*VX,Y*VY|L1],[Y*VY|L2]):-
  124. VX>VY,!,
  125. btroca([X*VX|L1],L2).
  126.  
  127. btroca([X|L1],[X|L2]):-btroca(L1,L2).
  128.  
  129. gera_geracao(N ,0 ,_ ,_,Pop):-!,writeln('Paragem por estabilização'),
  130. write('Geracao '), write(N), write(':'), nl, write(Pop), nl.
  131.  
  132.  
  133. gera_geracao(G ,_ ,_ ,G,Pop):-!,writeln('Paragem por num max de gerações'),
  134. write('Geracao '), write(G), write(':'), nl, write(Pop), nl.
  135.  
  136. gera_geracao(N,NumIte,Melhor,G,Pop):-
  137. Pop = [M1| Out],
  138. write('Geracao '), write(N), write(':'), nl, write(Pop), nl,
  139. random_permutation(Pop , RandomPop),
  140.  
  141. cruzamento(RandomPop,NPop1),
  142. mutacao(NPop1,NPop),
  143. avalia_populacao(NPop,NPopAv),
  144. ordena_populacao(NPopAv,NPopOrd),
  145. N1 is N+1,
  146. % write('ListaComPopNova'), writeln(NPopOrd),
  147. % write('ListaComPop'), writeln(Pop),
  148.  
  149.  
  150. append(Pop , NPopOrd , ListaTudo),
  151. % write('ListaComTodosAntesSort'), writeln(ListaTudo),
  152.  
  153. sort(ListaTudo , ListaUnicos),
  154. random_permutation(ListaUnicos ,ListaUnicosRandom),
  155. %write('ListaComTodos'), writeln(ListaUnicosRandom),
  156. torneioTotal(ListaUnicosRandom , FinalList),
  157. %writeln('HUGAY'),
  158.  
  159. (\+member(M1, FinalList) ->!, ( reverse(FinalList , NewList),
  160. NewList= [Worst| BestList],
  161. reverse(BestList , NewPopOrd1), NewPopOrd = [M1 | NewPopOrd1]) ;(NewPopOrd = FinalList) ),
  162.  
  163. ((M1 = Melhor)-> (NumeroConcat is NumIte-1);(estabiliza(Estav) ,NumeroConcat is Estav)),
  164. ordena_populacao(NewPopOrd,PopComMelhores),
  165. gera_geracao(N1, NumeroConcat,M1 ,G,PopComMelhores).
  166.  
  167. gerar_pontos_cruzamento(P1,P2):-
  168. gerar_pontos_cruzamento1(P1,P2).
  169.  
  170. gerar_pontos_cruzamento1(P1,P2):-
  171. tarefas(N),
  172. NTemp is N+1,
  173. random(1,NTemp,P11),
  174. random(1,NTemp,P21),
  175. P11\==P21,!,
  176. ((P11<P21,!,P1=P11,P2=P21);(P1=P21,P2=P11)).
  177. gerar_pontos_cruzamento1(P1,P2):-
  178. gerar_pontos_cruzamento1(P1,P2).
  179.  
  180.  
  181. cruzamento([],[]).
  182. cruzamento([Ind*_],[Ind]).
  183. cruzamento([Ind1*_,Ind2*_|Resto],[NInd1,NInd2|Resto1]):-
  184. gerar_pontos_cruzamento(P1,P2),
  185. prob_cruzamento(Pcruz),random(0.0,1.0,Pc),
  186. ((Pc =< Pcruz,!,
  187. cruzar(Ind1,Ind2,P1,P2,NInd1),
  188. cruzar(Ind2,Ind1,P1,P2,NInd2))
  189. ;
  190. (NInd1=Ind1,NInd2=Ind2)),
  191. cruzamento(Resto,Resto1).
  192.  
  193. preencheh([],[]).
  194.  
  195. preencheh([_|R1],[h|R2]):-
  196. preencheh(R1,R2).
  197.  
  198.  
  199. sublista(L1,I1,I2,L):-
  200. I1 < I2,!,
  201. sublista1(L1,I1,I2,L).
  202.  
  203. sublista(L1,I1,I2,L):-
  204. sublista1(L1,I2,I1,L).
  205.  
  206. sublista1([X|R1],1,1,[X|H]):-!,
  207. preencheh(R1,H).
  208.  
  209. sublista1([X|R1],1,N2,[X|R2]):-!,
  210. N3 is N2 - 1,
  211. sublista1(R1,1,N3,R2).
  212.  
  213. sublista1([_|R1],N1,N2,[h|R2]):-
  214. N3 is N1 - 1,
  215. N4 is N2 - 1,
  216. sublista1(R1,N3,N4,R2).
  217.  
  218. rotate_right(L,K,L1):-
  219. tarefas(N),
  220. T is N - K,
  221. rr(T,L,L1).
  222.  
  223. rr(0,L,L):-!.
  224.  
  225. rr(N,[X|R],R2):-
  226. N1 is N - 1,
  227. append(R,[X],R1),
  228. rr(N1,R1,R2).
  229.  
  230.  
  231. elimina([],_,[]):-!.
  232.  
  233. elimina([X|R1],L,[X|R2]):-
  234. not(member(X,L)),!,
  235. elimina(R1,L,R2).
  236.  
  237. elimina([_|R1],L,R2):-
  238. elimina(R1,L,R2).
  239.  
  240. insere([],L,_,L):-!.
  241. insere([X|R],L,N,L2):-
  242. tarefas(T),
  243. ((N>T,!,N1 is N mod T);N1 = N),
  244. insere1(X,N1,L,L1),
  245. N2 is N + 1,
  246. insere(R,L1,N2,L2).
  247.  
  248.  
  249. insere1(X,1,L,[X|L]):-!.
  250. insere1(X,N,[Y|L],[Y|L1]):-
  251. N1 is N-1,
  252. insere1(X,N1,L,L1).
  253.  
  254. cruzar(Ind1,Ind2,P1,P2,NInd11):-
  255. sublista(Ind1,P1,P2,Sub1),
  256. tarefas(NumT),
  257. R is NumT-P2,
  258. rotate_right(Ind2,R,Ind21),
  259. elimina(Ind21,Sub1,Sub2),
  260. P3 is P2 + 1,
  261. insere(Sub2,Sub1,P3,NInd1),
  262. eliminah(NInd1,NInd11).
  263.  
  264.  
  265. eliminah([],[]).
  266.  
  267. eliminah([h|R1],R2):-!,
  268. eliminah(R1,R2).
  269.  
  270. eliminah([X|R1],[X|R2]):-
  271. eliminah(R1,R2).
  272.  
  273. mutacao([],[]).
  274. mutacao([Ind|Rest],[NInd|Rest1]):-
  275. prob_mutacao(Pmut),
  276. random(0.0,1.0,Pm),
  277. ((Pm < Pmut,!,mutacao1(Ind,NInd));NInd = Ind),
  278. mutacao(Rest,Rest1).
  279.  
  280. mutacao1(Ind,NInd):-
  281. gerar_pontos_cruzamento(P1,P2),
  282. mutacao22(Ind,P1,P2,NInd).
  283.  
  284. mutacao22([G1|Ind],1,P2,[G2|NInd]):-
  285. !, P21 is P2-1,
  286. mutacao23(G1,P21,Ind,G2,NInd).
  287. mutacao22([G|Ind],P1,P2,[G|NInd]):-
  288. P11 is P1-1, P21 is P2-1,
  289. mutacao22(Ind,P11,P21,NInd).
  290.  
  291. mutacao23(G1,1,[G2|Ind],G2,[G1|Ind]):-!.
  292. mutacao23(G1,P,[G|Ind],G2,[G|NInd]):-
  293. P1 is P-1,
  294. mutacao23(G1,P1,Ind,G2,NInd).
  295.  
  296.  
  297. edd(Res):-
  298. findall((Te,Ta),(tarefa(Ta,_,TConc,Peso) ,Te is TConc*Peso ),L),
  299. sort(L,T),
  300. removeTimes(T , Res).
  301.  
  302. removeTimes([] , []):-!.
  303. removeTimes([(H , T)| N] , [T|Res]):-removeTimes(N , Res).
  304.  
  305.  
  306.  
  307. minSlack(T):-findall(Ta , tarefa(Ta, _, _, _) , All) ,minSlack2(All , 0,[],E ) , reverse(E , T ) .
  308. minSlack2([] , _,L ,L):- !.
  309. minSlack2(LRealizadas , Tempo,LPorRealizar, L ):- minSlackCalcEach(LRealizadas , Tempo , ListaCalculos) ,
  310. sort(ListaCalculos , Sort),
  311. reverse(Sort , Sortd),
  312. removeHeads(Sortd , Sorted),
  313. Sorted = [M| OUTROS] , tarefa(M , TempoPro ,_,_) , Tempo1 is Tempo + TempoPro , apaga(M, LRealizadas , LIstaPorRealizar),
  314.  
  315. minSlack2( LIstaPorRealizar, Tempo1 ,[M|LPorRealizar] , L).
  316.  
  317. minSlackCalcEach([] ,_ ,[]):- !.
  318. minSlackCalcEach([X|LPorCalculadas], TA, [TCalc*X|LCalc]):- minSlackCalcEach(LPorCalculadas, TA, LCalc)
  319. ,tarefa(X ,TProc, TEntr, TPen ), TFinal is TProc+TA, TAtraso is TFinal-TEntr,
  320. ((TAtraso > 0)-> (!, TCalc is TAtraso * TPen) ; (TCalc is TAtraso / TPen)) .
  321.  
  322. removeHeads([] , []):-!.
  323. removeHeads([X|Sortd] , [Num|Sorted]):- X=_*Num, removeHeads(Sortd,Sorted).
  324.  
  325.  
  326. apaga(_, [], []).
  327. apaga(X, [X|L1], L2):-
  328. apaga(X, L1, L2),!.
  329. apaga(X, [Y|L1], [Y|L2]):-
  330. apaga(X, L1, L2).
  331.  
  332.  
  333. test(T):-T>5.
  334.  
  335.  
  336. torneioTotal(Lista,Resp):-% writeln('Torney'),
  337. torneioIgual(Lista , Mortos , Vencedores),
  338. populacao(Pops), length(Vencedores, NumFilhos),
  339.  
  340. Req is Pops -NumFilhos,
  341. addLosers(Req , Mortos , L),
  342. append(Vencedores, L , Resp).
  343.  
  344.  
  345. addLosers(0 , _ , []):-!.
  346.  
  347. addLosers(Num ,[X|Mortos] ,[X|Lista] ):-Num1 is Num -1 , addLosers(Num1, Mortos, Lista).
  348.  
  349. %torneioGeral(Todos,Tot):-torneioIgual(Todos , Mortos , Vencedores), writeln(Vencedores),populacao(Pops),writeln(Pops),
  350. %length(Vencedores, NumFilhos),writeln(NumFilhos) , Tot is Vencedores.
  351.  
  352.  
  353. torneioIgual([] ,[],[]):-!.
  354. torneioIgual([_|[]] ,[],[]):-!.
  355.  
  356.  
  357. torneioIgual([Combatente1 , Combatente2 | Espetadores] ,Mortos, Vencedores):- Combatente1 = _*PontosAtaque1,
  358. Combatente2 = _*PontosAtaque2,
  359. SomaAtaques is PontosAtaque1 + PontosAtaque2,
  360. Total1 is PontosAtaque2/SomaAtaques,
  361. Total2 is PontosAtaque1/SomaAtaques,
  362. random(0,Total1,Dano1),
  363. random(0,Total2,Dano2),
  364.  
  365. torneioIgual(Espetadores , M1 , V1),
  366. (Total1 > Total2 ->(!, append([Combatente1], V1 , Vencedores) , append([Combatente2],M1 , Mortos)) ;(append([Combatente2], V1 , Vencedores) , append([Combatente1] , M1 , Mortos ))).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement