ANEXO D: PROGRAMA CREADOR.FOR: Listado del programa utilizado para generar las combinaciones a verificar (ver capítulo 5.6): dimension id(49,49) na=9 write (6,*)'numero de plantas?' read (5,*)np call leedist(id) call generador (na,np,id) end subroutine generador(na,np,id) dimension id(49,49) dimension ivalmacenes(na) dimension ivpuntosposibles(49) dimension iconteoparcial(49,na) dimension ivplantas(np) do i=1,np write (6,*)'planta',i,'?' read (5,*)ivplantas(i) enddo open (unit=2,file='combinpos.res',status='unknown') kkk=1 c c distancia mínima a la que pueden situarse 2 almacenes o almacen respecto planta: write (6,*)'distancia minima?' read (5,*)idmin limpieza de iconteoparcial do i=1,49 do j=1,na iconteoparcial(i,j)=0 enddo enddo c creacion ivpuntosposibles do i=1,49 ivpuntosposibles(i)=1 enddo c eliminacion puntos donde hay plantas do i=1,np ivpuntosposibles(ivplantas(i))=0 enddo c eliminación puntos cercanos a plantas do i=1,np do j=1,49 if (id(ivplantas(i),j).lt.idmin) then ivpuntosposibles(j)=0 endif enddo enddo c Posicion del almacen 1 do i1=1,49 k=1 if (ivpuntosposibles(i1).eq.1) then call posalm (i1,k,na,ivpuntosposibles,ivalmacenes,iconteoparcial, + idmin,id) c Posición del almacen 2 do i2=i1,49 k=2 if (ivpuntosposibles(i2).eq.1) then call posalm (i2,k,na,ivpuntosposibles,ivalmacenes,iconteoparcial, + idmin,id) c Posición del almacen 3 do i3=i2,49 k=3 if (ivpuntosposibles(i3).eq.1) then call posalm (i3,k,na,ivpuntosposibles,ivalmacenes,iconteoparcial, + idmin,id) c Posición del almacen 4 do i4=i3,49 k=4 if (ivpuntosposibles(i4).eq.1) then call posalm (i4,k,na,ivpuntosposibles,ivalmacenes,iconteoparcial, + idmin,id) c Posición del almacen 5 do i5=i4,49 k=5 if (ivpuntosposibles(i5).eq.1) then call posalm (i5,k,na,ivpuntosposibles,ivalmacenes,iconteoparcial, + idmin,id) c Posición del almacen 6 do i6=i5,49 k=6 if (ivpuntosposibles(i6).eq.1) then call posalm (i6,k,na,ivpuntosposibles,ivalmacenes,iconteoparcial, + idmin,id) c Posición del almacen 7 do i7=i6,49 k=7 if (ivpuntosposibles(i7).eq.1) then call posalm (i7,k,na,ivpuntosposibles,ivalmacenes,iconteoparcial, + idmin,id) c Posición del almacen 8 do i8=i7,49 k=8 if (ivpuntosposibles(i8).eq.1) then call posalm (i8,k,na,ivpuntosposibles,ivalmacenes,iconteoparcial, + idmin,id) c Posición del almacen 9 do i9=i8,49 k=9 if (ivpuntosposibles(i9).eq.1) then call posalm (i9,k,na,ivpuntosposibles,ivalmacenes,iconteoparcial, + idmin,id) write (*,100) ivalmacenes(1),ivalmacenes(2),ivalmacenes(3) + ,ivalmacenes(4),ivalmacenes(5),ivalmacenes(6), + ivalmacenes(7),ivalmacenes(8),ivalmacenes(9),kkk write (2,100) ivalmacenes(1),ivalmacenes(2),ivalmacenes(3) + ,ivalmacenes(4),ivalmacenes(5),ivalmacenes(6), + ivalmacenes(7),ivalmacenes(8),ivalmacenes(9) 100 format (9(1I2,3X),1I10) kkk=kkk+1 c c c k=9 reposición del ivpuntosposibles tras 9 call repos (i9,k,na,ivpuntosposibles,iconteoparcial) endif enddo k=8 reposición del ivpuntosposibles tras 8 call repos (i8,k,na,ivpuntosposibles,iconteoparcial) endif enddo k=7 reposición del ivpuntosposibles tras 7 call repos (i7,k,na,ivpuntosposibles,iconteoparcial) endif enddo c c c c c c k=6 reposición del ivpuntosposibles tras 6 call repos (i6,k,na,ivpuntosposibles,iconteoparcial) endif enddo k=5 reposición del ivpuntosposibles tras 5 call repos (i5,k,na,ivpuntosposibles,iconteoparcial) endif enddo k=4 reposición del ivpuntosposibles tras 4 call repos (i4,k,na,ivpuntosposibles,iconteoparcial) endif enddo k=3 reposición del ivpuntosposibles tras 3 call repos (i3,k,na,ivpuntosposibles,iconteoparcial) endif enddo k=2 reposición del ivpuntosposibles tras 2 call repos (i2,k,na,ivpuntosposibles,iconteoparcial) endif enddo k=1 reposición del ivpuntosposibles tras 1 call repos (i1,k,na,ivpuntosposibles,iconteoparcial) endif enddo close (2) kkk=kkk-1 open (unit=2,file='ncomb.res',status='unknown') write (2,*)np do i=1,np write (2,*)ivplantas(i) enddo write (2,*)kkk,idmin close (2) end subroutine posalm (i,k,na,ivpuntosposibles,ivalmacenes, + iconteoparcial,idmin,id) dimension ivpuntosposibles(49) dimension ivalmacenes(na) dimension iconteoparcial(49,na) dimension id(49,49) ivalmacenes(k)=i ivpuntosposibles(i)=0 do j=1,49 if (id(ivalmacenes(k),j).lt.idmin) then if (ivpuntosposibles(j).eq.1) then c write (*,*)'puntos anulados en paso',kkk,j ivpuntosposibles(j)=0 iconteoparcial(j,k)=1 endif endif enddo end c subroutine repos (i,k,na,ivpuntosposibles,iconteoparcial) dimension ivpuntosposibles(49) dimension iconteoparcial(49,na) do j=1,49 if (iconteoparcial(j,k).eq.1) then write (*,*)'puntos repuestos en paso',kkk,j ivpuntosposibles(j)=1 iconteoparcial(j,k)=0 endif enddo ivpuntosposibles(i)=1 end subroutine lectura(ndist) dimension ndist(49,49) open (unit=1,file='distcolumn.dat',status='old') do i=1,49 do j=1,49 read (1,*) ndist(i,j) enddo enddo close (1) end subroutine leedist(id) dimension id(49,49) open (unit=1,file='idistancias.dat',status='old') do ipp=1,2401 read (1,*) i,j,ij id(i,j)=ij enddo close (1) end