/* * @(#)FloydWarshall.java ver 1.2 6/20/2005 * * Modified by Weishuai Yang (wyang@cs.binghamton.edu). * Originally written by Rahul Simha * */ package org.cloudbus.cloudsim.network; /** * FloydWarshall algorithm to calculate the predecessor matrix * and the delay between all pairs of nodes. * * @author Rahul Simha * @author Weishuai Yang * @version 1.2, 6/20/2005 * @since CloudSim Toolkit 1.0 */ public class FloydWarshall_Float { /** * Number of vertices (nodes). */ private int numVertices; /** * Matrices used in dynamic programming. */ private float[][] Dk, Dk_minus_one; /** * The predecessor matrix. Matrix used by dynamic programming. */ private int[][] Pk; /** * Matrix used by dynamic programming. */ private int[][] Pk_minus_one; /** * Initialization the matrix. * * @param numVertices number of nodes * @todo The class doesn't have a constructor. This should be the constructor. */ public void initialize(int numVertices) { this.numVertices = numVertices; // Initialize Dk matrices. Dk = new float[numVertices][]; Dk_minus_one = new float[numVertices][]; for (int i = 0; i < numVertices; i++) { Dk[i] = new float[numVertices]; Dk_minus_one[i] = new float[numVertices]; } // Initialize Pk matrices. Pk = new int[numVertices][]; Pk_minus_one = new int[numVertices][]; for (int i = 0; i < numVertices; i++) { Pk[i] = new int[numVertices]; Pk_minus_one[i] = new int[numVertices]; } } /** * Calculates the delay between all pairs of nodes. * * @param adjMatrix original delay matrix * @return the delay matrix */ public float[][] allPairsShortestPaths(float[][] adjMatrix) { // Dk_minus_one = weights when k = -1 for (int i = 0; i < numVertices; i++) { for (int j = 0; j < numVertices; j++) { if (adjMatrix[i][j] != 0) { Dk_minus_one[i][j] = adjMatrix[i][j]; Pk_minus_one[i][j] = i; } else { Dk_minus_one[i][j] = Float.MAX_VALUE; Pk_minus_one[i][j] = -1; } // NOTE: we have set the value to infinity and will exploit // this to avoid a comparison. } } // Now iterate over k. for (int k = 0; k < numVertices; k++) { // Compute Dk[i][j], for each i,j for (int i = 0; i < numVertices; i++) { for (int j = 0; j < numVertices; j++) { if (i != j) { // D_k[i][j] = min ( D_k-1[i][j], D_k-1[i][k] + D_k-1[k][j]. if (Dk_minus_one[i][j] <= Dk_minus_one[i][k] + Dk_minus_one[k][j]) { Dk[i][j] = Dk_minus_one[i][j]; Pk[i][j] = Pk_minus_one[i][j]; } else { Dk[i][j] = Dk_minus_one[i][k] + Dk_minus_one[k][j]; Pk[i][j] = Pk_minus_one[k][j]; } } else { Pk[i][j] = -1; } } } // Now store current Dk into D_k-1 for (int i = 0; i < numVertices; i++) { for (int j = 0; j < numVertices; j++) { Dk_minus_one[i][j] = Dk[i][j]; Pk_minus_one[i][j] = Pk[i][j]; } } } // end-outermost-for return Dk; } /** * Gets predecessor matrix. * * @return predecessor matrix */ public int[][] getPK() { return Pk; } }