ANEXO E: PROGRAMA VALORACIÓN_COSTES.FOR: Listado del programa utilizado para valorar los costes de transporte de cada combinación y seleccionar la más económica, verificando limitación de transporte capilar (ver capítulo 5.7): dimension idistancias(49,49) dimension iconsumos(49) c c open (unit=3,file='ncomb.dat',status='old') lectura del número de plantas y donde estan read (3,*)np lectura del número de almacenes write (6,*)'número de almacenes?' read (5,*)na call leedistancias (idistancias) call leeconsumos (iconsumos) call zonario (iconsumos,idistancias,np,na) end subroutine leedistancias(id) dimension id (49,49) open (unit=1,file='idistancias.dat',status='old') do icont=1,2401 read (1,*)i,j,idist id(i,j)=idist enddo close (1) end subroutine leeconsumos (iconsumos) dimension iconsumos(49) open (unit=1,file='consumos.dat',status='old') do i=1,49 read (1,*) iconsumos(i) enddo close (1) end subroutine zonario (iconsumos,id,np,na) dimension id(49,49) dimension ivplantas(np) dimension ivalmacenes(na) dimension ivjerarquico(49,2) dimension ivjalmacenes(na) dimension ivjdefinitivo(49) dimension ivjadefinitivo(na) dimension iconsumos(49) dimension ipesosalmacenes(49) dimension ivplantmejor(np) dimension ivalmmejor(na) open (unit=2,file='resultado.res',status='unknown') c Lectura de donde estan las plantas do i=1,np read (3,*)ivplantas(i) enddo c lectura de la distancia maxima que permitiremos a los capilares write (6,*)'distancia maxima de capilar?' read (5,*)icaplim c lectura del número de combinaciones que hay que comprobar read (3,*)ncomb,idmin close (3) open (unit=3,file='combinpos.dat',status='old') write (2,*)'número de plantas:',np write (2,*)'número de almacenes:',na write (2,*)'distnacia mínima entre alm/plantas',idmin write (2,*)'número de combinaciones evaluadas',ncomb acostetptetotalopt=1000000000 c tantos do's como combinaciones existan: do kik=1,ncomb c limpieza de vectores jerarquicos do i=1,49 do j=1,2 ivjerarquico(i,j)=0 enddo enddo do i=1,na ivjalmacenes(i)=0 enddo read (3,*)ivalmacenes(1),ivalmacenes(2),ivalmacenes(3), + ivalmacenes(4),ivalmacenes(5),ivalmacenes(6), + ivalmacenes(7),ivalmacenes(8),ivalmacenes(9) do i=1,49 idistasusup=10000 do j=1,np idistasusup=min(idistasusup,id(i,ivplantas(j))) if (idistasusup.eq.id (i,ivplantas(j))) + isusup=ivplantas(j) enddo ivjerarquico(i,2)=isusup do j=1,na idistasusup=min(idistasusup,id(i,ivalmacenes(j))) if (idistasusup.eq.id (i,ivalmacenes(j))) + isusup=ivalmacenes(j) enddo ivjerarquico(i,1)=isusup enddo 100 format (1I2,22x,1I2,14x,1I4) do i=1,na idistasusup=10000 do j=1,np idistasusup=min(idistasusup,id(ivalmacenes(i),ivplantas(j))) if (idistasusup.eq.id(ivalmacenes(i),ivplantas(j))) + isusup=ivplantas(j) enddo ivjalmacenes(i)=isusup enddo c Cálculo costes total: asumatotal=0 do i=1,49 if (ivjerarquico(i,1).eq.i) then aprecioi=30.764+30*0.0589 asumatotal=asumatotal+aprecioi*iconsumos(i)*1000 else apreciodircap=30.764+id(i,ivjerarquico(i,2))*0.0589 costedirectoi=apreciodircap*iconsumos(i)*1000 if (ivjerarquico(i,1).eq.ivjerarquico(i,2)) then asumatotal=asumatotal+costedirectoi else do j=1,na if (ivjerarquico(i,1).eq.ivalmacenes(j))icontaux=j enddo aprecioindcap=30.764+id(i,ivjerarquico(i,1))*0.0589 aprecioindprim=0.012*id(ivjerarquico(i,1) + ,ivjalmacenes(icontaux)) costeindirectoi=iconsumos(i)*(aprecioindcap+ + aprecioindprim)*1000 if (costedirectoi.lt.costeindirectoi) then if (id(i,ivjerarquico(i,2)).lt.icaplim) then ivjerarquico(i,1)=ivjerarquico(i,2) asumatotal=asumatotal+costedirectoi else asumatotal=asumatotal+costeindirectoi endif else asumatotal=asumatotal+costeindirectoi endif endif endif enddo c comprobación de que se cumple la condicion de icapmax: icapmax=1 do ic=1,49 if (id(ic,ivjerarquico(ic,1)).gt.icapmax) then icapmax=id(ic,ivjerarquico(ic,1)) ies=ic endif enddo if (icaplim.gt.icapmax) then if (asumatotal.lt.acostetptetotalopt) then icapmaxreal=icapmax iesreal=ies acostetptetotalopt=asumatotal do i=1,np ivplantmejor(i)=ivplantas(i) enddo do i=1,na ivalmmejor(i)=ivalmacenes(i) enddo do i=1,49 ivjdefinitivo(i)=ivjerarquico(i,1) enddo do i=1,na ivjadefinitivo(i)=ivjalmacenes(i) enddo endif write (*,*)'combinacion numero',kik,asumatotal,acostetptetotalopt endif enddo write (2,*)'suma ponderada optima',acostetptetotalopt write (2,*)'capilar de maxima distancia',iesreal write (2,*)'distancia maxima de capilar',icapmaxreal write (2,*)'almacenes su planta' do i=1,na write (2,*)ivalmmejor(i),ivjadefinitivo(i) enddo write (2,*)'plantas' do i=1,np write (2,*)ivplantmejor(i) enddo write(2,*)'zona su superior' do i=1,49 write(2,*)i,ivjdefinitivo(i) enddo close (2) close (3) end