encomenda(1,4). encomenda(2,6). encomenda(3,3). encomenda(4,2). maxstock(7). custosprods([0,1000,1300,1450,1525]). maxprod(4). custostock(100). membro([X|_],X) :- !. membro([_|R],X) :- membro(R,X). membros([Nf|_],Nf,[Cf|_],[Ef|_],Cf,Ef) :- !. membros([_|Nsf],Nf,[_|Csf],[_|Esf],Cf,Ef) :- membros(Nsf,Nf,Csf,Esf,Cf,Ef). sublist([],_). sublist([X|R],L) :- membro(L,X), sublist(R,L). optimiza(F,c(Ni,Ci,Ei),c(Nf,Cf,Ef)) :- analise_frente(1,F,[[Ni],[Ci],[Ei]],StatesF), StatesF = [Nsf,Csf,Esf], membros(Nsf,Nf,Csf,Esf,Cf,Ef). analise_frente(F,F,States,States). analise_frente(I,F,StatesI,StatesF) :- I < F, maxstock(MaxStock), custostock(CStock), custosprods(CProds), maxprod(ProdMax), N in 0..MaxStock, encomenda(I,EncI), StatesI = [StocksI,CustosI,EstratI], element(IState,StocksI,Stock), element(IState,CustosI,Custo), Prod in 0..ProdMax, Prod1 #= Prod+1, element(Prod1,CProds,CProd), N #= Stock-EncI+Prod, COpt #= Custo+CStock*N+CProd, findall(c(N,COpt,EOpt),estado(N,COpt,IState,EstratI,Prod,I,EOpt),StatesNxt), separa(StatesNxt,NxtNs,OptNs,ENs), StatesNxtS = [NxtNs,OptNs,ENs], Inxt is I+1, analise_frente(Inxt,F,StatesNxtS,StatesF). separa([],[],[],[]). separa([c(N,C,E)|R],[N|Rn],[C|Rc],[E|Re]) :- separa(R,Rn,Rc,Re). estado(N,CustoOpt,IState,EstratI,Prod,I,[produz(I,Prod)|Estrat]) :- indomain(N), labeling([minimize(CustoOpt)],[IState,Prod]), elemento(IState,EstratI,Estrat). elemento(1,[X|_],X) :- !. elemento(K,[_|R],X) :- K > 1, Kk is K-1, elemento(Kk,R,X).