|
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,'(/