Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // VARIÁVEIS DA INSTÂNCIA
- int N = 20; // Número de itens distintos
- int Nf = 5;
- range Itens = 1..N+Nf; // Para criar listas com tamanho N
- range ItensF = N..N+Nf;
- int T = 12; // Número de períodos
- range Periodos = 1..T;
- int P = 100; // Número máximo de itens em um palete
- // Demanda de cada item em cada período
- int d[Periodos][Itens];
- int demandaMedia[Itens];
- execute DADOS {
- for (var j in Itens) {
- demandaMedia[j] = 40 + Opl.rand() % (700 - 40 + 1);
- }
- for (var j in Itens) {
- for (var t in Periodos) {
- d[t][j] = Opl.floor(demandaMedia[j] / 2) + Opl.rand() % (Opl.floor(3 * demandaMedia[j] / 2) - Opl.floor(demandaMedia[j] / 2) + 1);
- }
- }
- }
- // Custo de setup (é o mesmo para todos os itens e periodos)
- int s = 100;
- // Custo de estoque baixo
- int h = 1; // Alternativa (custo alto): h = 3 | 1
- // Custo de atraso (mil vezes o custo de estoque)
- int b = h * 1000;
- // Tempo de produção do item j (é o mesmo para todos)
- int r = 1;
- int c0 = 0;
- // Custo de transporte baixo
- int c1 = 150; // Alternativa (custo alto): c1 = 150 | 50
- int c2 = 500; // Alternativa (custo alto): c2 = 500 | 200
- int c3 = 700; // Alternativa (custo alto): c2 = 700 | 300
- // Limite de paletes a serem transportados
- int R;
- float demanda_total = 0;
- float FR = 1/6;
- // Capacidade de produção
- int Capt[Periodos];
- // Tempo de setup [30, 150] para cada máquina
- int qj[Itens];
- execute MAISDADOS {
- // Calcular a demanda total
- for (var t in Periodos) {
- for (var j in Itens) {
- demanda_total += d[t][j];
- }
- }
- R = Opl.round((demanda_total / T) * FR) // Calcular R
- // writeln("Demanda total: ", demanda_total);
- // writeln("R: ", R);
- for (var t in Periodos) {
- Capt[t] = 0;
- }
- for (var t in Periodos){ // Calcular Capt
- for (var p in Periodos){
- for (var j in Itens) {
- Capt[t] += r * d[t][j] + qj[j];
- }
- }
- }
- // for (var t in Periodos) {
- // writeln("Capacidade periodo ", t, ": ", Capt[t]);
- // }
- for (var j in Itens) { // Calcular tempo de setup
- qj[j] = 30 + Opl.rand() % (150 - 30 + 1);
- }
- }
- // Talvez colocar pico de demanda nos periodos 4 e 10. Multiplicando-a por 1.5 (eles colocam no artigo)
- // VARIÁVEIS DE DECISÃO:
- // Número de pallets transportados no período t com a taxa c1
- dvar int+ A[Periodos];
- // Número de pallets transportados no período t com a taxa c2
- dvar int+ B[Periodos];
- // Número de pallets de itens frágeis transportados no período t com a taxa c3
- dvar int+ C[Periodos];
- // Quantidade do item j produzida no período t
- dvar int+ X[Periodos][Itens];
- // Variável binária que indica a produção (Y=1) ou não (Y=0) do item j no período t
- dvar boolean Y[Periodos][Itens];
- // Quantidade em estoque do item j no fim do período t
- dvar int+ I_plus[Periodos][Itens];
- // Quantidade em atraso do item j no fim do período t
- dvar int+ I_minus[Periodos][Itens];
- ////////////////////// Objetivo e restrições ///////////////////////////
- minimize
- sum (t in Periodos, j in Itens)
- (h*I_plus[t][j] + b*I_minus[t][j] + s*Y[t][j]) + sum (t in Periodos) (c0 + c1*A[t] + c2*B[t] + c3*C[t]);
- subject to {
- forall (j in Itens, t in Periodos)
- if (t > 1){
- I_plus[t-1][j] - I_minus[t-1][j] + X[t][j] == d[t][j] + I_plus[t][j] - I_minus[t][j];
- }
- forall (j in Itens, t in Periodos)
- // X[t][j] <= Y[t][tj] * sum (t in Periodos, j in Itens) d[t][j];
- X[t][j] <= Y[t][j] * d[t][j];
- forall (t in Periodos)
- sum (j in Itens)
- (r * X[t][j] + qj[j] * Y[t][j]) <= Capt[t];
- forall (t in Periodos)
- A[t] + B[t] >= (sum (j in Itens) (X[t][j])) * 1/P;
- forall (t in Periodos)
- C[t] >= (sum (j in ItensF) (X[t][j])) * 1/P;
- forall (t in Periodos)
- A[t] >= 0 && A[t] <= R;
- }
- int somatorio = 0;
- execute {
- for (var t in Periodos){
- somatorio = 0;
- for (var j in Itens){
- somatorio += X[t][j];
- }
- writeln("Produzidos periodo ", t, ": ", somatorio);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement