Commit 69899d3b authored by Falucho's avatar Falucho

Se calcula el delay entre todo par de puntos

parent 93b59bca
package uy.edu.fing.lrt.controlador;
import uy.edu.fing.lrt.modelo.Arista;
import uy.edu.fing.lrt.modelo.Linea;
import uy.edu.fing.lrt.modelo.Nodo;
import uy.edu.fing.lrt.test.Parada;
import uy.edu.fing.lrt.util.GlpkUtil;
import uy.edu.fing.lrt.util.matrix.Matrix;
import java.util.ArrayList;
......@@ -22,6 +24,7 @@ public final class ProblemaControlador {
private HashMap<Integer, Parada> paradasOriginales;
private Matrix<Double> matrizOD;
private Matrix<Integer> matrizDelaysPuntoAPunto;
private ProblemaControlador() {
nodos = new HashMap<>();
......@@ -77,6 +80,23 @@ public final class ProblemaControlador {
public void addODvalue(String[] splited) {
matrizOD.setValueAt(Integer.parseInt(splited[0]),Integer.parseInt(splited[1]),Double.parseDouble(splited[2]));
}
private void preCalcularMatrizDelay() {
int cantNodos = cantNodos();
matrizDelaysPuntoAPunto = new Matrix<>(cantNodos + 1, cantNodos + 1);
matrizDelaysPuntoAPunto.setDefaultValue(0);
for (int i = 1; i <= cantNodos; i++) {
for (int j = i + 1; j <= cantNodos; j++) {
List<Arista> spp = GlpkUtil.SPP(getAristas(), i, j, Arista::getLargo);
Linea linea = new Linea(spp);
matrizDelaysPuntoAPunto.setValueAt(i, j, linea.getDelayDirecto());
matrizDelaysPuntoAPunto.setValueAt(j, i, linea.getDelayDirecto());
}
}
}
public int cantNodos() {
return nodos.size();
}
......@@ -85,6 +105,10 @@ public final class ProblemaControlador {
return aristasId.size();
}
public void datosCargados() {
preCalcularMatrizDelay();
}
public void check() {
System.out.println("cheking");
}
......
......@@ -541,7 +541,7 @@ public final class Principal extends javax.swing.JFrame {
individuo = Parte2.run();
List<Arista> aristas = ProblemaControlador.getInstance().getAristas();
individuo = GlpkUtil.SPP(aristas,4,55,Arista::getDelay);
individuo = GlpkUtil.SPP(aristas, 1, 54, Arista::getLargo);
Linea l = new Linea(individuo);
List<Integer> nodos = l.getNodos();
......@@ -685,6 +685,8 @@ public final class Principal extends javax.swing.JFrame {
brNod.lines().map(Nodo::new).forEach(problema::addNodo);
brAri.lines().map(Arista::new).forEach(problema::addArista);
brPar.lines().map(Parada::new).forEach(problema::addParada);
problema.datosCargados();
problema.check();
} catch (Exception ex) {
Logger.error(null, ex);
......
package uy.edu.fing.lrt.modelo;
import uy.edu.fing.lrt.controlador.PropiedadesControlador;
import uy.edu.fing.lrt.util.MathUtil;
import uy.edu.fing.lrt.util.PropiedadesEnum;
public final class Arista {
private int id;
......@@ -15,6 +19,11 @@ public final class Arista {
private final int delay;
public Arista(String line) {
final Integer tiempo = PropiedadesControlador.getIntProperty(PropiedadesEnum.ESTACION_TIEMPO_INTERCAMBIO);
final Integer velocidad = PropiedadesControlador.getIntProperty(PropiedadesEnum.BUS_VELOCIDAD);
final Double aceleracion = PropiedadesControlador.getDoubleProperty(PropiedadesEnum.BUS_ACELERACION);
String[] split = line.split("\t");
boolean tieneLargo = split.length == 5;
......@@ -26,7 +35,7 @@ public final class Arista {
if (tieneLargo) {
this.largo = Integer.valueOf(split[3]);
this.delay = Integer.valueOf(split[4]);
this.delay = tiempo + MathUtil.calcularTiempoPorDistancia(velocidad, aceleracion, this.largo);
} else {
this.largo = 0;
this.delay = Integer.valueOf(split[3]);
......
package uy.edu.fing.lrt.modelo;
import uy.edu.fing.lrt.controlador.PropiedadesControlador;
import uy.edu.fing.lrt.util.MathUtil;
import uy.edu.fing.lrt.util.PropiedadesEnum;
import java.util.*;
import java.util.stream.Collectors;
......@@ -9,10 +13,14 @@ public final class Linea {
private List<Nodo> nodos;
private String id = null;
private Integer delay = null;
private Integer delayDirecto = null;
private Integer frecuencia = null;
public Linea(Linea copy) {
this.id = copy.id;
this.delay = copy.delay;
this.delayDirecto = copy.delayDirecto;
this.frecuencia = copy.frecuencia;
this.tramos = new ArrayList<>(copy.tramos);
this.nodos = new ArrayList<>(copy.nodos);
}
......@@ -27,6 +35,11 @@ public final class Linea {
}
private void ordenarAristas() {
if (tramos.size() == 1) {
Nodo[] nodos = {tramos.get(0).getNodoA(), tramos.get(0).getNodoB()};
this.nodos = Arrays.asList(nodos);
return;
}
final Map<Integer, Nodo> cache = new HashMap<>();
final List<Arista> nuevoTramo = new ArrayList<>();
final List<Nodo> nodosOrdenados = new ArrayList<>();
......@@ -90,16 +103,27 @@ public final class Linea {
return delay;
}
public Integer getDelayDirecto() {
if (delayDirecto == null) {
calcularDelay();
}
return delayDirecto;
}
private void genId() {
tramos.sort(Comparator.comparing(Arista::getId));
id = tramos.stream().map(Arista::getId).map(Object::toString).collect(Collectors.joining("."));
}
private void calcularDelay() {
delay = 0;
for (Arista arista : tramos) {
delay += arista.getDelay();
}
final Integer tiempo = PropiedadesControlador.getIntProperty(PropiedadesEnum.ESTACION_TIEMPO_INTERCAMBIO);
final Integer velocidad = PropiedadesControlador.getIntProperty(PropiedadesEnum.BUS_VELOCIDAD);
final Double aceleracion = PropiedadesControlador.getDoubleProperty(PropiedadesEnum.BUS_ACELERACION);
this.delay = tramos.stream().mapToInt(Arista::getDelay).sum();
int largoTotal = tramos.stream().mapToInt(Arista::getLargo).sum();
this.delayDirecto = tiempo + MathUtil.calcularTiempoPorDistancia(velocidad, aceleracion, largoTotal);
}
public boolean igualA(Linea other) {
......
package uy.edu.fing.lrt.util;
public final class MathUtil {
//Clase con metodos estaticos
private MathUtil() {
}
/**
* Velocidad Final en KM/H
* Aceleracion en m/ss
* <p>
* este metodo es propio al porblema, se necesita el doble del resultado esperado
*
* @param velFinal
* @param aceleracion
* @return
*/
public static Double calcularDistanciaParaAlcanzarVelocidad(int velFinal, Double aceleracion) {
double v = ((double) velFinal) / 3.6;
return v * v / (aceleracion);
}
public static Double calcularTiempoParaAlcanzarVelocidad(int velFinal, Double aceleracion) {
double v = ((double) velFinal) / 3.6;
return 2 * v / (aceleracion);
}
public static int calcularTiempoPorDistancia(int velFinal, Double aceleracion, int distancia) {
double v = ((double) velFinal) / 3.6;
double tiempoAcelerando = v / (aceleracion);
double tiempoAyF = 2 * tiempoAcelerando;
double distanciaAyF = v * tiempoAcelerando;
Double result;
if (distancia < distanciaAyF) {
result = 2 * Math.sqrt(distancia / aceleracion);
} else {
result = tiempoAyF + (distancia - distanciaAyF) / v;
}
return result.intValue();
}
}
......@@ -9,6 +9,9 @@ public enum PropiedadesEnum {
DEBUG("debug.eneable", "false"),
SEED("seed", ""),
RUIDO("ruido", "0"),
FITNESS_A("fitness.peso.a", "1"),
FITNESS_B("fitness.peso.b", "1"),
FITNESS_C("fitness.peso.c", "1"),
GENERACIONES("ae.cant.generaciones", "50"),
GENERACIONES_INVARIANTES("ae.cant.generaciones.invariantes", "10"),
INICIALIZACION("inicializacion", "1"),
......@@ -24,6 +27,9 @@ public enum PropiedadesEnum {
CRUZAMIENTO_CANTIDAD("cruzamiento.cant", "25"),
CANT_SUMIDEROS("cantSumideros", "3"),
CANT_FUENTES("cantFuentes", "4"),
BUS_ACELERACION("problema.aceleracion", "0.98"),
BUS_VELOCIDAD("problema.velocidad", "70"),
ESTACION_TIEMPO_INTERCAMBIO("problema.bajada.tiempo", "60"),
ESPECIALES("especiales", "0;0;0;2;2;3;2"),
DELAYS("delays", "0;0;0;1263;1234;946;1107"),
COLORES("colores", "FF00CC;CC33FF;33CCFF;33FFFF;33FF66;FFCC33;FF9933;990099;009900;660099"),
......
......@@ -24,6 +24,7 @@ public class Matrix<T> {
public Matrix(Matrix<T> copy) {
this.data = copy.data.clone();
this.defaultValue = copy.defaultValue;
this.rows = copy.rows;
this.cols = copy.cols;
}
......@@ -33,7 +34,7 @@ public class Matrix<T> {
}
public T getValueAt(int x, int y) {
return data[x][y] == null ? defaultValue : data[x][y];
return safeGet(data[x][y]);
}
public Matrix<T> setValueAt(int x, int y, T value) {
......@@ -95,12 +96,16 @@ public class Matrix<T> {
return resultBuilder.toString();
}
public T safeGet(T value) {
return value == null ? defaultValue : value;
}
public void show() {
System.out.println("[");
Arrays.stream(data).forEachOrdered(row -> {
System.out.print("[");
Arrays.stream(row).map(value -> value + " ").forEachOrdered(System.out::print);
Arrays.stream(row).map(value -> safeGet(value) + " ").forEachOrdered(System.out::print);
System.out.println("]");
});
System.out.println("]");
......
......@@ -9,12 +9,16 @@ java.library.path=C:/Desarrollo/glpk-4.65/w64
seed=
ruido=100
fitness.peso.a=1
fitness.peso.b=1
fitness.peso.c=1
inicializacion=2
inicializacion.try=200
inicializacion.pop.size=200
inicializacion.try=250
inicializacion.pop.size=250
ae.cant.generaciones=1000
ae.cant.generaciones.invariantes=100
ae.cant.generaciones.invariantes=200
seleccion=1
seleccion.factor=100000
......@@ -28,6 +32,10 @@ mutacion.prob=10
mutacion.ruido=100
#Propiedades del problema
problema.aceleracion=0.98
problema.velocidad=70
problema.bajada.tiempo=60
cantSumideros=3
cantFuentes=4
especiales=0;0;0;2;2;3;2
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment