lunes, 16 de marzo de 2015

Método ROC de ordenación de células de fabricación

Siguiendo con la entrada dedicada al método PFA de ordenación de células en un proceso productivo, que podéis visitar aquí: http://cypascal.blogspot.com.es/2015/03/metodo-pfa-para-celulas-de-fabriacion.html
Publicamos ahora una nueva entrada dedicada a un método cuyo objetivo es el mismo, pero con un procedimiento diferente. La programación también se realiza en MatLab. El método se denomina ROC (Rank Order Clustering)
Lo que se persigue es diagonalizar la matriz pero din duplicar las máquinas que participan en el proceso. Por lo que en la distribución que se obtenga finalmente, solo habra una máquina de cada tipo. Será trabajo vuestro el decidir que máquinas duplicar para mejorar la distribución.
Este algoritmo de ordenación de células de manufactura es mucho más sencillo que el PFA. Simplemente hay que tomar las filas y columnas de 1 y 0, como si fueran números binarios, y ordenar filas y columnas, de mayor a menor, de derecha a izquierda y de arriba a abajo.

El algoritmo escrito en MatLab es el siguiente;

M=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43;
   1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0;
   2 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0;
   3 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0;
   4 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
   5 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1;
   6 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 0 1 1;
   7 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
   8 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1;
   9 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0;
   10 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0;
   11 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0;
   12 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0;
   13 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0;
   14 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
   15 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0;
   16 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1;
   ];

fil = 16+1;
col = 43+1;
cambios = 1;

 while cambios
     cambios = 0;
     AuxFil=zeros(fil,1);
     AuxCol=zeros(col,1);
     %Calcula valores Filas
     for i = 2:fil
         AuxFil(i)=0;
         for j = 2:col
             AuxFil(i)=AuxFil(i)+M(i,j)*2^(col+1-j);
         end
     end
     %Ordena Filas
     max(1)=0;
     max(2)=0;
     for i = 2:fil
         %Se calcula el máximo
         for j = i:fil
             if AuxFil(j)>max(1)
                 max(1)=AuxFil(j);
                 max(2)=j;
             end
         end
         %Se intercambia posición
         if max(2) ~= i
             cambios = 1;
             for j = 1:col
                aux=M(i,j);
                M(i,j)=M(max(2),j);
                M(max(2),j)=aux;
             end
         end
         max(1)=0;
         max(2)=0;
     end
     
     %Calcula valores Columnas
     for j = 2:col
         AuxCol(j)=0;
         for i = 2:fil
             AuxCol(j)=AuxCol(j)+M(i,j)*2^(fil+1-i);
         end
     end
     %Ordena Columnas
     max(1)=0;
     max(2)=0;
     for j = 2:col
         %Se calcula el máximo
         for i = j:col
             if AuxCol(i)>max(1)
                 max(1)=AuxCol(i);
                 max(2)=i;
             end
         end
         %Se intercambia posición
         if max(2) ~= j
             cambios = 1;
             for i = 1:fil
                aux=M(i,j);
                M(i,j)=M(i,max(2));
                M(i,max(2))=aux;
             end
         end
         max(1)=0;
         max(2)=0;
     end
 end


No hay comentarios:

Publicar un comentario