Advertisement
EduPsEudo

Codigo Final Lotes Cplex

Oct 27th, 2023
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1. // VARIÁVEIS DA INSTÂNCIA
  2.  
  3. int N = 20; // Número de itens distintos
  4. int Nf = 5;
  5. range Itens = 1..N+Nf; // Para criar listas com tamanho N
  6. range ItensF = N..N+Nf;
  7. int T = 12; // Número de períodos
  8. range Periodos = 1..T;
  9. int P = 100; // Número máximo de itens em um palete
  10.  
  11. // Demanda de cada item em cada período
  12. int d[Periodos][Itens];
  13. int demandaMedia[Itens];
  14.  
  15. execute DADOS {
  16. for (var j in Itens) {
  17. demandaMedia[j] = 40 + Opl.rand() % (700 - 40 + 1);
  18. }
  19. for (var j in Itens) {
  20. for (var t in Periodos) {
  21. d[t][j] = Opl.floor(demandaMedia[j] / 2) + Opl.rand() % (Opl.floor(3 * demandaMedia[j] / 2) - Opl.floor(demandaMedia[j] / 2) + 1);
  22. }
  23. }
  24. }
  25.  
  26. // Custo de setup (é o mesmo para todos os itens e periodos)
  27. int s = 100;
  28.  
  29. // Custo de estoque baixo
  30. int h = 1; // Alternativa (custo alto): h = 3 | 1
  31.  
  32. // Custo de atraso (mil vezes o custo de estoque)
  33. int b = h * 1000;
  34.  
  35. // Tempo de produção do item j (é o mesmo para todos)
  36. int r = 1;
  37.  
  38. int c0 = 0;
  39. // Custo de transporte baixo
  40. int c1 = 150; // Alternativa (custo alto): c1 = 150 | 50
  41. int c2 = 500; // Alternativa (custo alto): c2 = 500 | 200
  42. int c3 = 700; // Alternativa (custo alto): c2 = 700 | 300
  43.  
  44. // Limite de paletes a serem transportados
  45. int R;
  46. float demanda_total = 0;
  47. float FR = 1/6;
  48. // Capacidade de produção
  49. int Capt[Periodos];
  50.  
  51. // Tempo de setup [30, 150] para cada máquina
  52. int qj[Itens];
  53.  
  54. execute MAISDADOS {
  55.  
  56. // Calcular a demanda total
  57. for (var t in Periodos) {
  58. for (var j in Itens) {
  59. demanda_total += d[t][j];
  60. }
  61. }
  62. R = Opl.round((demanda_total / T) * FR) // Calcular R
  63.  
  64. // writeln("Demanda total: ", demanda_total);
  65. // writeln("R: ", R);
  66.  
  67. for (var t in Periodos) {
  68. Capt[t] = 0;
  69. }
  70. for (var t in Periodos){ // Calcular Capt
  71. for (var p in Periodos){
  72. for (var j in Itens) {
  73. Capt[t] += r * d[t][j] + qj[j];
  74. }
  75. }
  76. }
  77.  
  78. // for (var t in Periodos) {
  79. // writeln("Capacidade periodo ", t, ": ", Capt[t]);
  80. // }
  81.  
  82. for (var j in Itens) { // Calcular tempo de setup
  83. qj[j] = 30 + Opl.rand() % (150 - 30 + 1);
  84. }
  85. }
  86.  
  87. // Talvez colocar pico de demanda nos periodos 4 e 10. Multiplicando-a por 1.5 (eles colocam no artigo)
  88.  
  89. // VARIÁVEIS DE DECISÃO:
  90. // Número de pallets transportados no período t com a taxa c1
  91. dvar int+ A[Periodos];
  92.  
  93. // Número de pallets transportados no período t com a taxa c2
  94. dvar int+ B[Periodos];
  95.  
  96. // Número de pallets de itens frágeis transportados no período t com a taxa c3
  97. dvar int+ C[Periodos];
  98.  
  99. // Quantidade do item j produzida no período t
  100. dvar int+ X[Periodos][Itens];
  101.  
  102. // Variável binária que indica a produção (Y=1) ou não (Y=0) do item j no período t
  103. dvar boolean Y[Periodos][Itens];
  104.  
  105. // Quantidade em estoque do item j no fim do período t
  106. dvar int+ I_plus[Periodos][Itens];
  107.  
  108. // Quantidade em atraso do item j no fim do período t
  109. dvar int+ I_minus[Periodos][Itens];
  110.  
  111. ////////////////////// Objetivo e restrições ///////////////////////////
  112.  
  113. minimize
  114. sum (t in Periodos, j in Itens)
  115. (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]);
  116.  
  117. subject to {
  118.  
  119. forall (j in Itens, t in Periodos)
  120. if (t > 1){
  121. I_plus[t-1][j] - I_minus[t-1][j] + X[t][j] == d[t][j] + I_plus[t][j] - I_minus[t][j];
  122. }
  123.  
  124. forall (j in Itens, t in Periodos)
  125. // X[t][j] <= Y[t][tj] * sum (t in Periodos, j in Itens) d[t][j];
  126. X[t][j] <= Y[t][j] * d[t][j];
  127.  
  128. forall (t in Periodos)
  129. sum (j in Itens)
  130. (r * X[t][j] + qj[j] * Y[t][j]) <= Capt[t];
  131.  
  132. forall (t in Periodos)
  133. A[t] + B[t] >= (sum (j in Itens) (X[t][j])) * 1/P;
  134.  
  135. forall (t in Periodos)
  136. C[t] >= (sum (j in ItensF) (X[t][j])) * 1/P;
  137.  
  138. forall (t in Periodos)
  139. A[t] >= 0 && A[t] <= R;
  140. }
  141.  
  142. int somatorio = 0;
  143.  
  144. execute {
  145. for (var t in Periodos){
  146. somatorio = 0;
  147. for (var j in Itens){
  148. somatorio += X[t][j];
  149. }
  150. writeln("Produzidos periodo ", t, ": ", somatorio);
  151. }
  152. }
  153.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement