Este documento presenta un resumen de 3 oraciones o menos:
El documento describe un proyecto que implementa el algoritmo de Floyd para encontrar rutas críticas en un grafo. Explica el proceso de planificación y desarrollo del proyecto, incluyendo la investigación, análisis del problema, creación del algoritmo, pruebas y codificación. También incluye un análisis del método de rutas críticas para organizar las tareas del proyecto y asegurar su compleción en tiempo.
LA PRÁCTICA DE LA ENSEÑANZA. LA PREPARACIÓN DEL MATERIAL DIDÁCTICO.
Ruta critica
1. TECNOLOGICO DE ESTUDIOS SUPERIORES TIENGUISTENCO
DIVISION DE INGENIERIA EN SISTEMAS COMPUTACIONALES
ASIGNATURA:
Investigación de Operaciones
ALUMNO:
Eduardo González Ortiz
MATRICULA:
201123042
GRUPO:
3302
PROFESOR:
Rodrigo Tapia Zapote
“RUTAS CRITICAS”
2. Introducción
Has pensado todo lo que implica realizar una tarea o proceso de manera adecuada, si tu
respuesta es no imagina una situación tan cotidiana como el asistir a la escuela o trabajo,
esta es una actividad tan simple que en ocasiones no se le presta mucha atención a lo
que realizas pero tan solo detente y piensa en la secuencia de las actividades que llevas a
cabo antes de partir de tu hogar, si te das cuenta todo lleva un orden y por más simple
que parezca la actividad consume tiempo y en ocasiones este puede ser crucial para
llegar a tu destino en tiempo y forma..
Pero en problemas de mayor magnitud/complejidad cada tarea tienen un papel importante
algunas con mayor importancia que otros, esto nos da a entender que no pueden ser
retrasadas, en caso de ser así afectarían las posteriores actividades impidiendo cumplir
los objetivos incluso llegar a ocasionar perdidas.
Pongamos el ejemplo de empresas que proveen materias a otras instituciones, si esta
sufriera de un contratiempo en su línea de producción no solo se afectaría a si misma si
no a los que les provee de sus servicios reflejando una perdida fatal en tiempo y cotos
tanto para ella como para los consumidores.
Con este pequeño ejemplo ya tendrás en cuenta lo importante que es organizar tiempos
y decidir a qué actividades darles mayor importancia por lo cual se requiere de una
organización casi perfecta.
En el presente escrito se redacta un proyecto que consta de la implementación de
procesos que nos permiten visualizar el orden en que se llevan a cabo tales tareas
llegando así a una solución que nos mostrara la importancia e influencia que tiene una
actividad.
3. Justificación
La realización de una tarea implica primordialmente definir lo que se desea obtener, por lo
cual en el presente trabajo se busca exponer al lector la importancia que tiene la
determinación de tiempos, pretendiendo ser una guía para los alumnos y docentes que
toman o imparten la materia de Investigación de Operaciones para planificar y desarrollar
el siguiente tema.
La Asignatura de Investigación de Operaciones, tiene como objetivo desarrollar el
Algoritmo del Floyd por medio de análisis, investigación y complementar la parte teórica
vista en clase para resolver algún problema de este tema. Además de construir modelos
de decisión basadas en descripciones matemáticas, con el objetivo de proporcionar al
alumno la madurez y los conocimientos necesarios para enfrentar una gran variedad de
problemas que se les presentan.
El método ya mencionado anteriormente será aplicado en compañía del tema visto en
clase que es llamado ruta crítica al igual que de la materia de programación, llevando a
cabo la elaboración de un programa el cual nos mostrara como hoy en día el avance
tecnológico y de conocimientos llegan a facilitar tareas, con fines de poner en práctica los
pasos pertenecientes al tema (Ruta critica), la elaboración del programa no solo constara
de su creación si no que mostraremos todo lo que implico su elaboración redactando las
acciones a seguir y el cómo cada una llega a tener una influencia muy resaltada o poco
notable pero no menos importante.
ALCANCES Y LIMITACIONES
Como ya tenemos entendido la realización de un proyecto implica de una buena
organización aunque en ocasiones nos llegaremos a topar con obstáculos que nos
impidan la creación de un proyecto perfecto en su totalidad.
En esta ocasión no fue la excepción pero como equipo hemos tratado de realizar un
proyecto respetable y entendible hacia el público.
4. Alcances
Con la creación de este trabajo no pretendemos realizar un proyecto detallado en su
totalidad si no solo mostrar a los alumnos de Investigación de Operaciones un ejemplo
que desde nuestro punto de vista es más comprensible a los mostrados en otras fuentes.
Limitaciones
Para cumplir con la presentación de este trabajo nos llegamos a encontrar con varios
obstáculos que impidieron que creáramos un proyecto que describa en su totalidad el
comportamiento del método Floyd y ruta critica, pero que posiblemente resolverá algunas
dudas obtenidas en clase.
Como limitantes nos encontramos con el hecho de que al ser un trabajo en equipo no
siempre los integrantes contaremos con una disposición total de tiempo, afectando así en
su totalidad el desarrollo del trabajo, aunque se nos informó sobre el proyecto con
antelación y se comenzó casi de inmediato con su elaboración nos topamos con un gran
obstáculo el cual es la comprensión total o parcial de la programación, aunque
actualmente nos encontramos cursando el 3er semestres de la carrera en ISC (Ingeniería
en Sistemas Computacionales) y que por lógica debemos manipular este aspecto al
derecho y al revés pues no ha sido fácil ya que carecemos de ciertos fundamentos
relacionados al tema por lo cual se nos ha dificultado un poco la elaboración de un
programas funcional en su totalidad, ya que al hacer uso de matrices fue necesaria la
Investigación de este tema y el cómo implementar el algoritmo de Floyd en un ambiente
de programación, se buscó en diferentes fuentes Bibliográfica pero no obtuvimos
respuestas muy constructivas por lo cual tuvimos que investigar más afondo con asesores
de la institución y otras fuentes para poder realizando, esto represento un gran consumo
de tiempo.
A pesar de las limitantes mencionadas anteriormente hemos puesto un gran empeño en la
realización de esta encomienda, por lo cual nos enfocaremos más en hacer mejor
entendible el tema.
5. PLANTEAMIENTO DEL PROBLEMA
Como problema o reto tenemos la elaboración de un programa que sea capaz de hacer
uso del método de Floyd pero durante su creación se tiene que hacer uso de la
herramienta ruta crítica.
Ósea que se tendrá que resumir paso a paso como se ha logrado llegar a la creación de
tal proyecto y que actividades han influido con mayor intensidad.
A continuación solo se describirá lo realizado ya posteriormente se le dará un enfoque con
uso del tema de rutas críticas.
En el área de programación el error más grave que se puede cometer en querer realizar
un proyecto sin antes haber analizado el problema que se nos pide solucionar, es aquí
donde comienza a tomar parte el tema de ruta crítica, el cual nos dice que para lograr la
solución de un problema se debe de empezar por definir nuestro objetivo posteriormente
enlistar las acciones a realizar mientras se hace esto es recomendable darles un orden y
tiempos que tardara cada actividad en ser realizada.
A sí que comencemos por definir qué queremos que lleve a cabo nuestra aplicación,
según el método Floyd es un algoritmo de análisis sobre grafos para encontrar el camino
mínimo en grafos dirigidos ponderados. El algoritmo encuentra el camino entre todos los
pares de vértices en una única ejecución. El algoritmo de Floyd-Warshall es un ejemplo
de programación dinámica.
Esto nos quiere decir que en un grafo contaremos con nodos los cuales interactuaran con
otros nodos, los cuales estarán comunicados por una serie de arcos con distancias, como
se muestra a continuación:
NOTA: Este tipo de grafos es posible
representarlos de manera matricial para
una mejor comprensión.
6. En esta parte es donde entra el razonamiento como resolver o trasladar un problema de
este tipo a un entorno de programación.
Bueno primero investiguemos un poco sobre el comportamiento de una matriz, tras
investigar tenemos que existen conjuntos de datos que por su naturaleza son mejor
representados mediante tablas o matrices multidimensionales que por vectores.
Por ejemplo, se puede representar las calificaciones de 4 asignaturas cursadas por 6
estudiantes mediante una tabla como la que abajo se ilustra:
Columna 1 Columna 2 Columna 3 Columna 4
Fila 1
Fila 2
Fila 3
Fila 4
Fila 5
Fila 6
donde cada fila correspondería a un estudiante y cada columna a una asignatura. Cada
dato individual (la calificación de un estudiante en una asignatura dada) es un elemento
de esta tabla y ocupa una celda identificable por el número de la fila y el número de la
columna.
7. Columna 1 Columna 2 Columna 3 Columna 4
Fila 1 M(1,1) M(1,2) M(1,3) M(1,4)
Fila 2 M(2,1) M(2,2) M(2,3) M(2,4)
Fila 3 M(3,1) M(3,2) M(3,3) M(3,4)
Fila 4 M(4,1) M(4,2) M(4,3) M(4,4)
Fila 5 M(5,1) M(5,2) M(5,3) M(5,4)
Fila 6 M(6,1) M(6,2) M(6,3) M(6,4)
De esta manera, cada elemento de la tabla queda completamente identificado mediante
dos subíndices: el primero para identificar la fila y el segundo para identificar la columna.
M( i , j )
Cada elemento de la matriz representaría la calificación de un estudiante dado en una
asignatura dada. Por ejemplo:
M(4,2) = C
Significa que el estudiante número 4 obtuvo C en la asignatura 2. La posición del
elemento dentro de la matriz corresponde a la celda sombreada en la tabla de la figura de
arriba.
La matriz de arriba representa un arreglo bidimensional con (6x4) 24 elementos, donde
i = 1, 2, 3,4,5,6 j = 1, 2, 3, 4
En una matriz multidimensional cada dimensión tiene su propio rango.
Con frecuencia se manejan arreglos de más de dos dimensiones, correspondiendo un
subíndice a cada dimensión.
El programador debe tener presente que la memoria de las computadoras es lineal, por lo
que la mayoría de los compiladores almacenan en memoria los elementos de una matriz
linealizandola por filas; es decir, todos los elementos de la primera fila primero, los de la
segunda después y así sucesivamente.
Ahora que tenemos noción de cómo funcionan las matrices mostraremos como se
comportó esta parte en nuestra aplicación.
8. El algoritmo de Floyd compara todos los posibles caminos a través del grafo entre cada
par de vértices. El algoritmo es capaz de hacer esto con sólo comparaciones (esto es
notable considerando que puede haber hasta aristas en el grafo, y que cada
combinación de aristas se prueba). Lo hace mejorando paulatinamente una estimación del
camino más corto entre dos vértices, hasta que se sabe que la estimación es óptima.
Sea un grafo G con conjunto de vértices V, numerados de 1 a N. Sea además una
función caminocorto(i,j,k) que devuelve el camino mínimo de i a j usando únicamente
los vértices de 1 a k como puntos intermedios en el camino. Ahora, dada esta función,
nuestro objetivo es encontrar el camino mínimo desde cada i a cada j usando únicamente
los vértices de 0 hasta k-1.
Hay dos candidatos para este camino: un camino mínimo, que utiliza únicamente los
vértices del conjunto (0…k); o bien existe un camino que va desde i hasta k-1, y de
k-1 hasta j, que es mejor. Sabemos que el camino óptimo de i a j que únicamente utiliza
los vértices de 0 hasta k está definido por camino Mínimo(i,j,k), y está claro que si
hubiera un camino mejor de i a k-1 a j, la longitud de este camino sería la concatenación
del camino mínimo de i a k-1 (utilizando vértices de(0….k)) y el camino mínimo de k-1 a j
(que también utiliza los vértices en (0…k)).
Por lo tanto, podemos definir camino Mínimo (i, j, k) de forma recursiva:
caminoMinimo(i,j,k)=min(caminoMinimo(i,j,k)),caminoMinimo(i,k,)+caminoMinimo(k,j
));
Camino Mínimo (i,j,0)=Arista(i,j),
Esta fórmula es la base del algoritmo Floyd Funciona ejecutando primero camino Mínimo
(i,j,0) para todos los pares (i,j), usándolos para después hallar camino Mínimo(i,j,2) para
todos los pares (i,j)... Este proceso continúa hasta que k=n, y habremos encontrado el
camino más corto para todos los pares de vértices (i,j) usando algún vértice intermedio.
9. Ahora pasaremos a la explicación de cómo se creó la aplicación haciendo uso de Métodos de
Rutas críticas empezando por:
Delimitación de tareas.
Actividades Tiempo(minutos)
A Investigación del tema 180
B Análisis del tema 60
C Delimitación del problema (objetivo) 90
D Análisis del problema (objetivos) 160
E Creación de algoritmo 220
F Realización de prueba de escritorio 50
G Codificación del algoritmo en un ambiente de
180
programación
H Corrección de errores 120
I Realización de escrito (parte teórica). 240
J Revisión y Análisis del Escrito (Tenga
90
coherencia)
K Presentación del Proyecto (Finalización) 160
10. A B C D
0 180 180 240 0 90 90 250
580 760 760 820 -120 -30 -30 130
580 580 120 120
E F G H
250 470 470 520 520 700 700 820
130 350 350 400 400 580 580 700
120 120 120 120
I J K
820 1010 1010 1100 1100 1260
820 1010 1010 1100 1100 1260
0 0 0
COMO CONCLUSION TENEMOS QUE NUESTRO PROYECTO CONSUMIO UN TOTAL DE 21
hrs.
ADJUNTOS
Algoritmo:
Dado un grafo se puede aplicar el algoritmo de Floyd para resolver el problema de encontrar el
camino más corto de todos los vértices entre sí, a continuacion se muestra el comportamiento de
cada uno de los for mensionados anteriormente.
Inicio
Armar la matriz de distancias minimas Floyd, teniendo en cuenta que F(i,j)=0. Además dónde no
exista camino se debe indicar con infinito.
Para k desde 0 hasta n-1
Para i desde 0 hasta n-1
Para j desde 0 hasta n-1
11. Floyd[i,j]=min(F[i,j], F[i,k] + F[k,j])
Fin para j
Fin para i
Fin para k
En la k-esima vuelta F[i, j] contendrá el valor del camino más corto que una al vértice i con el j tal
que dicho camino no pase por un vértice con número mayor que k.
La matriz resultante es la de los mínimos caminos entre cada nodo. Si se quiere saber cual es
dicho camino, se debe armar un árbol a medida tomando como numero de nodo a k cada vez que
se detecta que hubo una optimización.
Pseudocodigo
Inicio
Creación de matriz (Floyd)
Declaración de variables de tipo entero y su inicialización i, j, n;
Imprime “Nota; El infinito se presenta por un -1
Solicita Dato “Dimensión de la Matriz “
Almacena Dato n;
Inicio de la Matriz Bidimensional;
Para i desde 0; i menor a n; hasta j;
Para j desde 0; j menor a n; hasta j;
Solicita Dato “Distancia del Nodo i al nodo j;
Almacena Dato matriz;
Para k desde 0 hasta n-1; // Comienzo del avance posición k
Para i desde 0 hasta n-1; // Avance En filas en La Matriz;
Para j desde 0 hasta n-1; // Avance el Columnas en La matriz;
Si Floyd i, k es diferente o igual que -1 y si Floyd k, j es diferente o igual que -1;
12. Imprime Floyd i, j;
Imprime “Nuevas Distancias”;
Para i desde 0; i menor a n hasta i;
Para j desde 0 j menor a n hasta j;
Imprime “Valor de la Posicion (i,j) Floyd posición i j“;
Declaración de Clase Comparaciones parámetros A, B;
// A almacena el dato altual de la celda i, j
// B almacena la suma de los valores de la sumas adyacentes al valor que se esta Evaluando;
Imprime “” A , “”B;
Si A es menor que -1 && B es igual que -1
Retorna -1
si A es igual que -1
Retorna B
Si no B es igual que -1
;
Retorna A;
Si no A es mayor que B;
Retorna B;
Si no Retorna A;
FIN
Código fuente
A continuación se muestra el Código del Programa que tuvo como fin Implementar el
Algoritmo de Floyd.
import java.io.*;
13. public class FloydAlgoritmo {
static int [][] Floyd;
static BufferedReader leer=new BufferedReader(new InputStreamReader(System.in));
public static void main(String[]a) {
/**
* Delclaracion E inicializacion de Las Varibles
* k Realiza comparaciones Entre celdas
* i Recorre Filas de la Matriz
* j Recorre Columnas de La Matriz
*/
int i=0,j=0,k=0;
int n=0;
try{
System.err.println("NOTA: El infinito se representa por un -1");
/**
* Ingresa La Dimension de la Matriz
*/
System.out.println("DIMENSION DE MATRIZ");
n=Integer.parseInt(leer.readLine());
/*
* Recorrido de La Matriz
*/
Floyd=new int [n][n];
for( i=0; i<n; i++)
14. for( j=0; j<n; j++)
{
/*
* Muestra La discia del vertice i al vetice j
*/
System.out.println("Distancia del nodo( "+i+ ")al nodo ("+j+")");
Floyd[i][j]=Integer.parseInt(leer.readLine());
}//for avance
}//try
catch (Exception e ){}
for( k=0; k<=n-1 ; k++){
for( i=0; i<=n-1; i++){
for( j=0; j<=n-1; j++)
if ((Floyd[i][k]!=-1)&&(Floyd[k][j]!=-1)){
Floyd[i][j]=comparaciones(Floyd[i][j],Floyd[i][k]+Floyd[k][j]);
System.out.println(""+Floyd[i][j]);
}
}
}
/**
* Muestra las nuevas Distancias q' existen entre i & j
*/
System.out.println("Nuevas distancias:");
for ( i=0; i<n; i++){
15. for( j=0; j<n; j++)
/**
* Imprime los Valores de las Posiciones
*/
System.out.println("VALOR DE LA POSICION("+i+")("+j+")es: "+Floyd[i][j]);
System.out.println();
}
}
/**
*
* @param A Valor de la celda en la q' se Encuentra el Avance
* @param B Guarda la Suma
public static int comparaciones(int A,int B){
System.out.println(""+A+" "+B);
if((A==-1)&&(B==-1))
return -1;
else if(A==-1)
return B;
else if (B==-1)
return A;
else if (A>B)
return B;
else return A;
}}