Commit dc20cfe4 authored by Falucho's avatar Falucho

Retoques

parent c80a2a26
......@@ -12,6 +12,7 @@ import java.awt.*;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public final class GuiHelper {
......@@ -89,7 +90,9 @@ public final class GuiHelper {
String tiempo = AEControlador.getInstance().getTime();
int gen = AEControlador.getInstance().getGeneracion();
lblEstado.setText("Generacion: " + gen + " | Costo Individuo: " + best.getCosto() + " | Tiempo: " + tiempo);
String frecs = best.getLineas().stream().map(l -> l.getFrecuencia() + "").collect(Collectors.joining("-"));
lblEstado.setText("Generacion: " + gen + " | Frecuencias: " + frecs + " | Costo Total: " + best.getCosto() + " | Costo USD: " + best.getCostoDinero() + " | Tiempo: " + tiempo);
dibujarLinas(best, consentradoresActivos);
}
}
......
......@@ -494,23 +494,24 @@ public final class Principal extends javax.swing.JFrame {
try {
Thread.sleep(5000);
int gen = 0;
Individuo individuoAux = AEControlador.getInstance().getBest();
Individuo individuoAE = AEControlador.getInstance().getBest();
while (AEControlador.getInstance().isRunning()) {
Individuo individuoAE = AEControlador.getInstance().getBest();
while (individuoAE == null) {
Individuo individuoTMP = AEControlador.getInstance().getBest();
while (individuoTMP == null) {
Thread.sleep(200);
individuoAux = individuoAE = AEControlador.getInstance().getBest();
individuoAE = individuoTMP = AEControlador.getInstance().getBest();
GuiHelper.dibujarBest(consentradoresActivos);
}
if (individuoAux.getCosto() > individuoAE.getCosto()) {
if (individuoAE.getCosto() > individuoTMP.getCosto()) {
GuiHelper.dibujarBest(consentradoresActivos);
individuoAux = individuoAE;
individuoAE = individuoTMP;
individuo = individuoAE.getAristas();
}
String tiempo = AEControlador.getInstance().getTime();
gen = AEControlador.getInstance().getGeneracion();
lblEstado.setText("Generacion: " + gen + " | Costo Individuo: " + individuoAE.getCosto() + " | Tiempo: " + tiempo);
String frecs = individuoTMP.getLineas().stream().map(l -> l.getFrecuencia() + "").collect(Collectors.joining("-"));
lblEstado.setText("Generacion: " + gen + " | Frecuencias: " + frecs + " | Costo Total: " + individuoTMP.getCosto() + " | Costo USD: " + individuoTMP.getCostoDinero() + " | Tiempo: " + tiempo);
Thread.sleep(500);
}
......
......@@ -2,6 +2,7 @@ package uy.edu.fing.lrt.modelo;
import uy.edu.fing.lrt.controlador.ProblemaControlador;
import uy.edu.fing.lrt.controlador.PropiedadesControlador;
import uy.edu.fing.lrt.util.MathUtil;
import uy.edu.fing.lrt.util.PropiedadesEnum;
import java.util.*;
......@@ -10,11 +11,16 @@ import java.util.stream.IntStream;
public final class Individuo {
private Integer costo = null;
private Integer costoConstruccion = null;
private Integer costoOperacion = null;
private Integer costoUsuario = null;
private String id = null;
private Concentrador[] concentradores;
public Individuo(Individuo copy) {
this.costoConstruccion = copy.costoConstruccion;
this.costoOperacion = copy.costoOperacion;
this.costoUsuario = copy.costoUsuario;
this.concentradores = new Concentrador[copy.concentradores.length];
IntStream.range(0, concentradores.length).forEach(i -> this.concentradores[i] = new Concentrador(copy.concentradores[i]));
}
......@@ -24,10 +30,21 @@ public final class Individuo {
}
public Integer getCosto() {
if (costo == null) {
calcularCosto();
if (costoUsuario == null) {
calcularCostoUsuario();
}
return costo;
return getCostoDinero() + costoUsuario;
}
public Integer getCostoDinero() {
if (costoConstruccion == null) {
calcularCostoConstruccion();
}
if (costoOperacion == null) {
calcularCostoOperacion();
}
return costoConstruccion + costoOperacion;
}
private void checkOperacion() {
......@@ -37,18 +54,20 @@ public final class Individuo {
}
}
private void calcularCosto() {
Integer factorA = PropiedadesControlador.getIntProperty(PropiedadesEnum.FITNESS_A);
Integer factorB = PropiedadesControlador.getIntProperty(PropiedadesEnum.FITNESS_B);
Integer factorC = PropiedadesControlador.getIntProperty(PropiedadesEnum.FITNESS_C);
private void calcularCostoConstruccion() {
Double factorA = PropiedadesControlador.getDoubleProperty(PropiedadesEnum.FITNESS_A);
costoConstruccion = MathUtil.plus(factorA, getAristas().stream().map(Arista::getCosto).reduce(0, Integer::sum)).intValue();
}
private void calcularCostoOperacion() {
Double factorB = PropiedadesControlador.getDoubleProperty(PropiedadesEnum.FITNESS_B);
checkOperacion();
costoOperacion = MathUtil.plus(factorB, getLineas().stream().map(l -> l.getLargo() * l.getFrecuencia()).reduce(0, Integer::sum)).intValue();
}
int costoConstruccion = getAristas().stream().map(Arista::getCosto).reduce(0, Integer::sum);
int costoOperacion = getLineas().stream().map(l -> l.getLargo() * l.getFrecuencia()).reduce(0, Integer::sum);
int costoUsuario = 0;
costo = costoConstruccion * factorA + costoOperacion * factorB + costoUsuario * factorC;
private void calcularCostoUsuario() {
Double factorC = PropiedadesControlador.getDoubleProperty(PropiedadesEnum.FITNESS_C);
costoUsuario = MathUtil.plus(factorC, 0).intValue();
}
public boolean isValido() {
......
......@@ -50,4 +50,13 @@ public final class MathUtil {
return Math.sqrt(distX * distX + distY * distY);
}
public static Double plus(Double a, Double b) {
return a * b;
}
public static Double plus(Double a, Integer b) {
return a * Double.valueOf(b);
}
}
......@@ -30,6 +30,7 @@ public enum PropiedadesEnum {
BUS_ACELERACION("problema.aceleracion", "0.98"),
BUS_VELOCIDAD("problema.velocidad", "70"),
ESTACION_TIEMPO_INTERCAMBIO("problema.bajada.tiempo", "60"),
CAPACIDAD_TREN("problema.tren.capacidad", "350"),
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"),
......
......@@ -9,13 +9,14 @@ java.library.path=C:/Desarrollo/glpk-4.65/w64
seed=
ruido=100
fitness.peso.a=1
fitness.peso.b=1
fitness.peso.a=3240
# El costo de usuario jugar entre 40 y 110
fitness.peso.b=40
fitness.peso.c=1
inicializacion=2
inicializacion.try=250
inicializacion.pop.size=100
inicializacion.pop.size=5
ae.cant.generaciones=1000
ae.cant.generaciones.invariantes=200
......@@ -25,16 +26,17 @@ seleccion.factor=100000
cruzamiento=1
cruzamiento.prob=50
cruzamiento.cant=100
cruzamiento.cant=5
mutacion=1
mutacion.prob=10
mutacion.ruido=100
#Propiedades del problema
problema.aceleracion=0.98
problema.velocidad=70
problema.aceleracion=1.96
problema.velocidad=60
problema.bajada.tiempo=60
problema.tren.capacidad=350
cantSumideros=3
cantFuentes=4
......
......@@ -2,6 +2,12 @@ package uy.edu.fing.lrt.test;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class Histograma {
......@@ -12,22 +18,23 @@ public class Histograma {
public static void main(String[] args) throws Exception {
leerMatrizCon();
leerMatrizSin();
//leerMatrizSin();
}
private static void leerMatrizCon() throws Exception {
leerMatriz(8, FILE1);
leerMatriz(FILE1);
}
private static void leerMatrizSin() throws Exception {
leerMatriz(5, FILE2);
leerMatriz(FILE2);
}
private static void leerMatriz(int datePos, String file) throws Exception {
private static void leerMatriz(String file) throws Exception {
int[] horas = new int[24];
Map<String, LineaBase> recorridosTemprano = new HashMap<>();
Map<String, LineaBase> recorridosTarde = new HashMap<>();
String lineTmp = "";
String date = "";
String hora = "";
try (BufferedReader br = new BufferedReader(new FileReader(WORK_DIR + MATRIZ_DIR + file))) {
......@@ -41,24 +48,159 @@ public class Histograma {
continue;
}
lineTmp = line;
String[] split = line.split(",");
if (!split[datePos+4].equals("N")){
LineaBase base = new LineaBase(line);
if (!base.getAnulado().equals("N")) {
continue;
}
date = split[datePos];
procesarRecorrido(recorridosTemprano, recorridosTarde, base);
hora = date.substring(12, 14);
hora = base.fecha_evento.substring(12, 14);
Integer intHora = Integer.valueOf(hora);
horas[intHora]++;
}
} catch (Exception e) {
System.out.println(lineTmp + " -> " + date);
System.out.println(lineTmp);
System.err.println(e.getMessage());
}
//recorridosTarde.entrySet().stream().filter(e->!recorridosTemprano.get(e.getKey()).equals(e.getValue())).collect(Collectors.toList())
for (int i = 0; i < horas.length; i++) {
System.out.println(i + ": " + horas[i]);
}
try (PrintWriter writer = new PrintWriter(WORK_DIR + "HistogramaVelocidad.csv", "UTF-8")) {
for (Map.Entry<String, LineaBase> entry : recorridosTarde.entrySet()) {
LineaBase tarde = entry.getValue();
LineaBase temprano = recorridosTemprano.get(entry.getKey());
String newLine = entry.getKey() + "\t " +
tarde.fecha_evento + "\t " +
tarde.getLatitud() + "\t " +
tarde.getLongitud() + "\t " +
temprano.fecha_evento + "\t " +
temprano.getLatitud() + "\t " +
temprano.getLongitud();
writer.println(newLine);
}
}
}
private static void procesarRecorrido(Map<String, LineaBase> temprano, Map<String, LineaBase> tarde, LineaBase linea) throws Exception {
if (!temprano.containsKey(linea.recorrido)) {
temprano.put(linea.recorrido, linea);
}
if (!tarde.containsKey(linea.recorrido)) {
tarde.put(linea.recorrido, linea);
}
LineaBase tardeL = tarde.get(linea.recorrido);
LineaBase tempranoL = temprano.get(linea.recorrido);
if (linea.getFecha().after(tardeL.getFecha())) {
tarde.put(linea.recorrido, linea);
}
if (linea.getFecha().before(tempranoL.getFecha())) {
temprano.put(linea.recorrido, linea);
}
}
private static class LineaBase {
private String thash;
private String secuencial_operacion_tarjeta;
private String secuencial_multitramo;
private String tramo;
private String pasajeros;
private String parada_origen;
private String parada_destino;
private String recorrido;
private String fecha_evento;
private String latitud;
private String longitud;
private String empresa;
private String anulado;
public LineaBase(String line) {
String[] split = line.split(",");
boolean completo = false;
int offset = 0;
if (split.length == 13) {
completo = true;
offset = 3;
}
if (completo) {
thash = split[0].trim();
secuencial_operacion_tarjeta = split[1].trim();
secuencial_multitramo = split[2].trim();
}
tramo = split[0 + offset].trim();
pasajeros = split[1 + offset].trim();
parada_origen = split[2 + offset].trim();
parada_destino = split[3 + offset].trim();
recorrido = split[4 + offset].trim();
fecha_evento = split[5 + offset].trim();
latitud = split[6 + offset].trim();
longitud = split[7 + offset].trim();
empresa = split[8 + offset].trim();
anulado = split[9 + offset].trim();
}
public String getThash() {
return thash;
}
public String getSecuencial_operacion_tarjeta() {
return secuencial_operacion_tarjeta;
}
public String getSecuencial_multitramo() {
return secuencial_multitramo;
}
public String getTramo() {
return tramo;
}
public String getPasajeros() {
return pasajeros;
}
public String getParada_origen() {
return parada_origen;
}
public String getParada_destino() {
return parada_destino;
}
public String getRecorrido() {
return recorrido;
}
public String getFecha_evento() {
return fecha_evento;
}
public Date getFecha() throws ParseException {
return (new SimpleDateFormat("\"dd/MM/yyyy HH:mm:ss\"")).parse(fecha_evento.trim());
}
public String getLatitud() {
return latitud;
}
public String getLongitud() {
return longitud;
}
public String getEmpresa() {
return empresa;
}
public String getAnulado() {
return anulado;
}
}
}
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