Electra |
Aquí se presenta el código fuente del programa Fortran para aplicar el método Electra en la selección
de tecnologías en Ingeniería Química. Se recomienda leer la documentación incluída en el
archivo Fuentes.Zip para tener todos los detalles y un ejemplo.
|
module utileria contains subroutine imprime_matriz(matriz,unidad) implicit none integer, dimension (:,:) :: matriz integer :: unidad,i do i=1,size(matriz,1) write (unidad,'(10i8)') matriz(i,1:size(matriz,2)) end do end subroutine end module program metodo_electra use utileria implicit none integer :: p,q,na,nc,i,j,k,suma,g,max,e integer, dimension(:,:), allocatable :: mat_cal, mat_dis, mat_con integer, dimension(:), allocatable :: lista namelist/datos/na,nc,p,q character (len=20) :: entrada, salida ! lee archivo de entrada y salida write (*,*) " Entrada > " read (*,*) entrada write (*,*) " Salida > " read (*,*) salida ! lee parámetros de archivo open(file=entrada,unit=10) read(10,nml=datos) ! dimensiona arreglos (filas x columnas) allocate(mat_cal(na+1,nc),mat_dis(na,na),mat_con(na,na),lista(na)) ! lee matriz de calificaciones y pesos do i=1,nc read(10,*) mat_cal(1:na+1,i) end do close(10) ! calcula matriz de concordancia do i=1,na do j=1,na ! evita la diagonal suma=0 if (i/=j) then do k=1,nc g=0 if(mat_cal(i,k)>=mat_cal(j,k)) g=1 suma=suma+g*mat_cal(na+1,k) end do end if mat_con(i,j)=suma end do end do ! calcula matriz de discordancia do i=1,na do j=1,na ! evita la diagonal mat_dis(i,j)=0 if (i/=j) then max=mat_cal(j,1)-mat_cal(i,1) do k=2,nc if((mat_cal(j,k)-mat_cal(i,k))>max) max=mat_cal(j,k)-mat_cal(i,k) end do mat_dis(i,j)=max if (max<0) mat_dis(i,j)=0 end if end do end do ! cálculo de p y q if (p==0) p=ceiling(real(sum(mat_con(1:na,1:na)),8)/real(na*na-na,8)) if (q==0) q=ceiling(real(sum(mat_dis(1:na,1:na)),8)/real((na*na-na))) ! resultados open(file=salida,unit=11) write(11,'(/" Matriz de calificaciones y pesos"/)') call imprime_matriz(mat_cal,11) write(11,'(/" Matriz de concordancias"/)') call imprime_matriz(mat_con,11) write(11,'(/" p = ",i5)') p write(11,'(/" Matriz de discordancias"/)') call imprime_matriz(mat_dis,11) write(11,'(/