Electra
Versión Fortran 90

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,'(/" q = ",i5)') q
        ! dominancia hacia
        write(11,'(/" Domina a :"/)')
        do i=1,na
            lista=0; e=0
            do j=1,na
                if(i/=j) then
                    if (mat_con(i,j)>=p) then
                        if (mat_dis(i,j)<=q) then
                            e=e+1
                            lista(e)=j
                        end if    
                    end if
                end if    
            end do    
            ! escribe en archivo
            if (e==0) then
                write(11,'(i5,"  :  ---")') i
            else
                write(11,'(i5,"  :  ",10i5)') i,lista(1:e)
            end if    
        end do
        ! dominancia desde
        write(11,'(/" Es dominada por :"/)')
        do j=1,na
            lista=0; e=0
            do i=1,na
                if(i/=j) then
                    if (mat_con(i,j)>=p) then
                        if (mat_dis(i,j)<=q) then
                            e=e+1
                            lista(e)=i
                        end if    
                    end if
                end if    
            end do    
            ! escribe en archivo
            if (e==0) then
                write(11,'(i5,"  :  ---")') j
            else
                write(11,'(i5,"  :  ",10i5)') j,lista(1:e)
            end if    
        end do
    close(11)
    deallocate(mat_cal, mat_dis, mat_con)
    stop "Fin de programa"
end program

 

Regresar a Electra