Este algoritmo implementa el algoritmo de Escalamiento Multidimensional (MDS) para transformar matrices de distancias en coordenadas cartesianas utilizando la librería "Apache Commons Math".
Requisitos:
- NetBeans IDE
- Apache Commons Math (versión 3.6.1)
Pasos:
1. Descarga la librería Apache Commons Math 3.6.1 desde:
https://archive.apache.org/dist/commons/math/binaries/
2. Busca y descarga el archivo "commons-math3-3.6.1-bin.zip".
3. En NetBeans, añadir la librería al proyecto.
Código Java (DistanceToCoordinates.java):
package distancetocoordinates;
import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.EigenDecomposition;
import org.apache.commons.math3.linear.RealMatrix;
public class DistanceToCoordinates {
private final double[][] distanceMatrix;
private final int dimensions;
public DistanceToCoordinates(double[][] distanceMatrix) {
this.distanceMatrix = distanceMatrix;
this.dimensions = distanceMatrix.length;
}
public double[][] calculateCoordinates() {
// Paso 1: Calcular la matriz B
double[][] B = calculateBMatrix();
// Paso 2: Realizar la descomposición en valores propios de B
EigenDecomposition eigen = new EigenDecomposition(new Array2DRowRealMatrix(B));
// Paso 3: Obtener los valores propios y vectores propios
double[] eigenvalues = eigen.getRealEigenvalues();
RealMatrix eigenvectors = eigen.getV();
// Paso 4: Ordenar los valores propios en orden descendente
Integer[] indices = new Integer[dimensions];
for (int i = 0; i < dimensions; i++) {
indices[i] = i;
}
java.util.Arrays.sort(indices, (a, b) -> Double.compare(eigenvalues[b], eigenvalues[a]));
// Paso 5: Calcular las coordenadas
double[][] coordinates = new double[dimensions][dimensions];
for (int i = 0; i < dimensions; i++) {
for (int j = 0; j < dimensions; j++) {
coordinates[i][j] = Math.sqrt(Math.max(0, eigenvalues[indices[j]])) * eigenvectors.getEntry(i, indices[j]);
}
}
return coordinates;
}
private double[][] calculateBMatrix() {
double[][] B = new double[dimensions][dimensions];
double[] rowMeans = new double[dimensions];
double totalMean = 0;
// Calcular los cuadrados de las distancias
for (int i = 0; i < dimensions; i++) {
for (int j = 0; j < dimensions; j++) {
B[i][j] = -0.5 * distanceMatrix[i][j] * distanceMatrix[i][j];
rowMeans[i] += B[i][j];
totalMean += B[i][j];
}
rowMeans[i] /= dimensions;
}
totalMean /= (dimensions * dimensions);
// Centrar la matriz B
for (int i = 0; i < dimensions; i++) {
for (int j = 0; j < dimensions; j++) {
B[i][j] = B[i][j] - rowMeans[i] - rowMeans[j] + totalMean;
}
}
return B;
}
public static void main(String[] args) {
double[][] distanceMatrix = {
{0, 3538196.0, 3735982.0, 6458578.0, 4011596.0, 1278244.0, 4456652.0, 7001752.0},
{3538196.0, 0, 6073624.0, 9765551.0, 5373577.0, 8563521.0, 9075418.0, 7378972.0},
{3735982.0, 6073624.0, 0, 4434730.0, 1077102.0, 1125242.0, 3435080.0, 2347484.0},
{6458578.0, 9765551.0, 4434730.0, 0, 7999311.0, 3946544.0, 1846094.0, 1283370.0},
{4011596.0, 5373577.0, 1077102.0, 7999311.0, 0, 8920411.0, 1777521.0, 7183199.0},
{1278244.0, 8563521.0, 1125242.0, 3946544.0, 8920411.0, 0, 6221466.0, 7883823.0},
{4456652.0, 9075418.0, 3435080.0, 1846094.0, 1777521.0, 6221466.0, 0, 2385324.0},
{7001752.0, 7378972.0, 2347484.0, 1283370.0, 7183199.0, 7883823.0, 2385324.0, 0}
};
DistanceToCoordinates calculator = new DistanceToCoordinates(distanceMatrix);
double[][] coordinates = calculator.calculateCoordinates();
// Imprimir las coordenadas
for (int i = 0; i < coordinates.length; i++) {
System.out.print("Nodo " + (char) ('A' + i) + ": [ ");
for (int j = 0; j < coordinates[i].length; j++) {
System.out.printf("%.4f ", coordinates[i][j]);
}
System.out.println("]");
}
}
}
Resultado:
run:
Nodo A: [ -2109176,7652 -2280795,2868 943542,6755 1167238,5398 -0,0000 -0,0000 -0,0000 0,0000 ]
Nodo B: [ -5501880,3926 -340732,2628 -2558730,8576 335704,8847 -0,0000 0,0000 0,0000 0,0000 ]
Nodo C: [ 100046,1854 -133636,2798 255465,7042 -1991154,7275 -0,0000 -0,0000 -0,0000 0,0000 ]
Nodo D: [ 4430934,9160 -101468,6811 -792915,6722 616290,8194 -0,0000 0,0000 -0,0000 0,0000 ]
Nodo E: [ -2944669,9418 2839449,1084 2485778,2633 -376992,5883 -0,0000 0,0000 -0,0000 -0,0000 ]
Nodo F: [ 1720031,9254 -4810714,6137 579380,6506 -443374,3002 -0,0000 -0,0000 0,0000 -0,0000 ]
Nodo G: [ 2087917,4093 2241964,4880 1969418,4176 812990,9949 -0,0000 -0,0000 0,0000 0,0000 ]
Nodo H: [ 2216796,6634 2585933,5278 -2881939,1813 -120703,6228 -0,0000 -0,0000 -0,0000 -0,0000 ]
BUILD SUCCESSFUL (total time: 0 seconds)
Una forma sencilla y rápida de aprender JAVA, observando y deduciendo cómo se comporta el lenguaje a través de ejemplos prácticos.
Archivo del blog
-
►
2012
(38)
- ► septiembre (3)
-
►
2020
(12)
- ► septiembre (1)
-
▼
2024
(29)
-
▼
agosto
(17)
- Problema del Viajante de Comercio TSP (V.1). Métod...
- Problema del Viajante de Comercio TSP (V.2). Métod...
- Problema del Viajante de Comercio TSP (V.3). Métod...
- Problema del viajante de Comercio TSP (IV.2). Méto...
- Problema del Viajante de Comercio TSP (V.3.1). Aná...
- Matriz de conectividad circular.
- Problema del viajante de Comercio TSP (VI). Método...
- Problema del viajante de Comercio TSP (VII). Métod...
- Problema del viajante de Comercio TSP (VIII). Méto...
- Problema del viajante de Comercio TSP (IX). Método...
- Problema del viajante de Comercio TSP (X). Método ...
- Problema del viajante de Comercio TSP (XI). Método...
- Problema del viajante de Comercio TSP (XII). Métod...
- Problema del viajante de Comercio TSP (XIII). Méto...
- Problema del viajante de Comercio TSP (XIV). Métod...
- Problema del viajante de Comercio TSP (XV). Método...
- Juegos VII. La Mansión Misteriosa: Un juego de tex...
-
▼
agosto
(17)
jueves, 11 de julio de 2024
Conversor matriz de distancias a coordenadas cartesianas(MDS) usando librería "Apache Commons Math".
Suscribirse a:
Entradas (Atom)
Con la tecnología de Blogger.