Commit ee4be057 authored by Falucho's avatar Falucho

Calculo Costo Usuario

parent dc20cfe4
......@@ -97,6 +97,7 @@ public final class AEControlador {
}
public void init() {
PropiedadesControlador.printValues();
endTime = null;
startTime = System.currentTimeMillis();
best = null;
......
......@@ -2,12 +2,11 @@ package uy.edu.fing.lrt.controlador;
import uy.edu.fing.lrt.modelo.*;
import uy.edu.fing.lrt.test.Parada;
import uy.edu.fing.lrt.util.GlpkUtil;
import uy.edu.fing.lrt.util.Logger;
import uy.edu.fing.lrt.util.MathUtil;
import uy.edu.fing.lrt.util.*;
import uy.edu.fing.lrt.util.matrix.Matrix;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public final class ProblemaControlador {
......@@ -31,7 +30,7 @@ public final class ProblemaControlador {
aristasId = new HashMap<>();
paradasOriginales = new HashMap<>();
matrizOD = new Matrix<>(6150,6150);
matrizOD = new Matrix<>(6150, 6150);
matrizOD.setDefaultValue(0d);
System.out.println("OK");
......@@ -71,7 +70,7 @@ public final class ProblemaControlador {
}
public void addParada(Parada p) {
paradasOriginales.put(p.getNombre(),p);
paradasOriginales.put(p.getNombre(), p);
}
public Matrix<Integer> obtenerMatrizDemanda(List<Nodo> nodos) {
......@@ -113,7 +112,7 @@ public final class ProblemaControlador {
}
public void addODvalue(String[] splited) {
matrizOD.setValueAt(Integer.parseInt(splited[0]),Integer.parseInt(splited[1]),Double.parseDouble(splited[2]));
matrizOD.setValueAt(Integer.parseInt(splited[0]), Integer.parseInt(splited[1]), Double.parseDouble(splited[2]));
}
private void preCalcularMatrizDelay() {
......@@ -164,23 +163,28 @@ public final class ProblemaControlador {
List<Nodo> nodosIndividuo = individuo.getNodos();
//Calculo la matrix de demanda
Matrix<Integer> matrixDemandaIndividuo = ProblemaControlador.getInstance().obtenerMatrizDemanda(nodosIndividuo);
Matrix<Integer> matrixDemandaIndividuo = obtenerMatrizDemanda(nodosIndividuo);
//Calculo la demanda por hora en cada tramo
int lineaId = 0;
Concentrador[] concentradores = individuo.getConcentradores();
for (Concentrador concentrador : concentradores) {
//Obtengo los primeros tramos de todas las lineas del concentrador
Map<String, Arista> primerosTramos = new HashMap<>();
concentrador.getLineas().forEach(l -> primerosTramos.put(l.getId(), l.getTramos().get(0)));
for (Linea linea : concentrador.getLineas()) {
List<Integer> nodos = linea.getNodos();
Collections.reverse(nodos);
for (Integer nodo : nodos) {
for (Integer nodoOrigen : nodos) {//nodos de la linea
for (Nodo nodoDestino : nodosIndividuo) {
//TODO no chequea que no regrese (es una relajacion)
if (nodoDestino.getNombre() == nodo) {
//FIXME no chequea que no regrese, espero mas gente en los trenes
if (nodoDestino.getNombre() == nodoOrigen) {
continue;
}
Integer demanda = matrixDemandaIndividuo.getValueAt(nodo, nodoDestino.getNombre());
Linea lineaDemanda = new Linea(GlpkUtil.SPP(aristasIndividuo, nodo, nodoDestino.getNombre(), Arista::getLargo));
Integer demanda = matrixDemandaIndividuo.getValueAt(nodoOrigen, nodoDestino.getNombre());
List<Arista> tramosProhibidos = primerosTramos.entrySet().stream().filter(e -> !e.getKey().equals(linea.getId())).map(Map.Entry::getValue).collect(Collectors.toList());
Linea lineaDemanda = new Linea(GlpkUtil.SPP(ListUtil.restaDeAristas(aristasIndividuo, tramosProhibidos), nodoOrigen, nodoDestino.getNombre(), Arista::getLargo));
for (Arista tramo : lineaDemanda.getTramos()) {
Integer demandaAcc = demandaTramo.getOrDefault(tramo.getId(), 0);
demandaTramo.put(tramo.getId(), demandaAcc + demanda);
......@@ -226,8 +230,9 @@ public final class ProblemaControlador {
}
}
final Integer capacidad = PropiedadesControlador.getIntProperty(PropiedadesEnum.CAPACIDAD_TREN);
Integer max = Arrays.stream(demandasMax).max(Comparator.naturalOrder()).get();
if (max < 350) {
if (max < capacidad) {
ok = true;
} else {
Integer idMax = -1;
......@@ -248,6 +253,45 @@ public final class ProblemaControlador {
return null;
}
}
public Integer calculoDeCostoUsuario(Individuo individuo) {
Double velocidad = PropiedadesControlador.getDoubleProperty(PropiedadesEnum.BUS_VELOCIDAD_PROMEDIO_ACTUAL);
Double acumulado = 0D;
individuo.getNodos().forEach(Nodo::clearFrecuencia);
individuo.getLineas().forEach(Linea::addFrecuenciaToNodos);
for (int i = 0; i < 6151; i++) {
for (int j = i + 1; j < 6151; j++) {
Double demanda = matrizOD.getValueAt(i, j);
if (demanda == 0) {
continue;
}
Parada paradaO = paradasOriginales.get(i);
Parada paradaD = paradasOriginales.get(j);
if (paradaD == null || paradaO == null) {
continue;
}
//De todos los nodos
Nodo estacionO = nodos.entrySet().stream().map(Map.Entry::getValue).min(Comparator.comparing(o -> MathUtil.dist(o, paradaO))).get();
Nodo estacionD = nodos.entrySet().stream().map(Map.Entry::getValue).min(Comparator.comparing(o -> MathUtil.dist(o, paradaD))).get();
double delayOptimo = velocidad * (MathUtil.dist(estacionO, paradaO) + MathUtil.dist(estacionD, paradaD)) / 3.6 + matrizDelaysPuntoAPunto.getValueAt(estacionO.getNombre(), estacionD.getNombre());
//De los nodos de la solucion actual
Nodo estacionIndO = individuo.getNodos().stream().min(Comparator.comparing(o -> MathUtil.dist(o, paradaO))).get();
Nodo estacionIndD = individuo.getNodos().stream().min(Comparator.comparing(o -> MathUtil.dist(o, paradaD))).get();
Linea lineaDemanda = new Linea(GlpkUtil.SPP(individuo.getAristas(), estacionIndO.getNombre(), estacionIndD.getNombre(), Arista::getLargo));
double delayIndividuo = velocidad * (MathUtil.dist(estacionIndO, paradaO) + MathUtil.dist(estacionIndD, paradaD)) / 3.6 + lineaDemanda.getDelay();
double frec = Math.max(estacionIndO.getFrecuencia(), estacionIndD.getFrecuencia());
acumulado += (1800 / frec + delayIndividuo / delayOptimo) * demanda;
}
}
return acumulado.intValue();
}
public int cantNodos() {
return nodos.size();
}
......
......@@ -67,7 +67,8 @@ public final class Individuo {
private void calcularCostoUsuario() {
Double factorC = PropiedadesControlador.getDoubleProperty(PropiedadesEnum.FITNESS_C);
costoUsuario = MathUtil.plus(factorC, 0).intValue();
checkOperacion();
costoUsuario = MathUtil.plus(factorC, ProblemaControlador.getInstance().calculoDeCostoUsuario(this)).intValue();
}
public boolean isValido() {
......
......@@ -20,7 +20,7 @@ public final class Linea {
this.id = copy.id;
this.delay = copy.delay;
this.delayDirecto = copy.delayDirecto;
this.frecuencia = copy.frecuencia;
this.setFrecuencia(copy.frecuencia);
this.tramos = new ArrayList<>(copy.tramos);
this.nodos = new ArrayList<>(copy.nodos);
}
......@@ -106,6 +106,10 @@ public final class Linea {
this.frecuencia = frecuencia;
}
public void addFrecuenciaToNodos() {
nodos.forEach(n -> n.setFrecuencia(this.frecuencia));
}
public Integer getLargo() {
return tramos.stream().mapToInt(Arista::getLargo).sum();
}
......
......@@ -8,6 +8,7 @@ public final class Nodo {
private int coordX;
private int coordY;
private Integer frecuencia = 0;
private int nombre;
private List<Nodo> adyacentes = new ArrayList<>();
......@@ -24,6 +25,18 @@ public final class Nodo {
this.nombre = nombre;
}
public Integer getFrecuencia() {
return frecuencia;
}
public void clearFrecuencia() {
this.frecuencia = 0;
}
public void setFrecuencia(Integer frecuencia) {
this.frecuencia += frecuencia;
}
public int getCoordX() {
return coordX;
}
......
......@@ -67,8 +67,8 @@ public final class GlpkUtil {
}
private static synchronized List<Arista> run_(List<Arista> aristas, Integer[] lineasPorFuentes, int ruido, Function<Arista, Number> getter, String preFix) {
if (ruido < 0 || ruido > 100) {
throw new RuntimeException("El ruido debe comprender un valor entre 0 y 100");
if (ruido < 0) {
throw new RuntimeException("El ruido debe comprender un valor mayor a 0");
}
final ProblemaControlador problema = ProblemaControlador.getInstance();
......@@ -174,6 +174,7 @@ public final class GlpkUtil {
int factor = (ruido == 0 ? 0 : r.nextInt(2 * ruido) - ruido) + 100;
int objetivo = getter.apply(arista).intValue();
int costoAlterado = (factor * objetivo) / 100;
costoAlterado = (costoAlterado < 0) ? 0 : costoAlterado;
z++;
GLPK.glp_set_obj_coef(lp, z, costoAlterado);
}
......
......@@ -59,4 +59,5 @@ public final class MathUtil {
return a * Double.valueOf(b);
}
}
......@@ -28,7 +28,8 @@ public enum PropiedadesEnum {
CANT_SUMIDEROS("cantSumideros", "3"),
CANT_FUENTES("cantFuentes", "4"),
BUS_ACELERACION("problema.aceleracion", "0.98"),
BUS_VELOCIDAD("problema.velocidad", "70"),
BUS_VELOCIDAD("problema.velocidad", "60"),
BUS_VELOCIDAD_PROMEDIO_ACTUAL("problema.velocidad.promedio.actual", "10"),
ESTACION_TIEMPO_INTERCAMBIO("problema.bajada.tiempo", "60"),
CAPACIDAD_TREN("problema.tren.capacidad", "350"),
ESPECIALES("especiales", "0;0;0;2;2;3;2"),
......@@ -39,7 +40,7 @@ public enum PropiedadesEnum {
private String nombre;
private String valorDefecto;
private PropiedadesEnum(String nombre, String valorDefecto) {
PropiedadesEnum(String nombre, String valorDefecto) {
this.nombre = nombre;
this.valorDefecto = valorDefecto;
}
......
......@@ -7,16 +7,16 @@ java.library.path=C:/Desarrollo/glpk-4.65/w64
#debug.eneable=true
seed=
ruido=100
ruido=150
fitness.peso.a=3240
# El costo de usuario jugar entre 40 y 110
fitness.peso.b=40
fitness.peso.c=1
fitness.peso.c=15
inicializacion=2
inicializacion.try=250
inicializacion.pop.size=5
inicializacion.pop.size=50
ae.cant.generaciones=1000
ae.cant.generaciones.invariantes=200
......@@ -26,7 +26,7 @@ seleccion.factor=100000
cruzamiento=1
cruzamiento.prob=50
cruzamiento.cant=5
cruzamiento.cant=50
mutacion=1
mutacion.prob=10
......@@ -35,6 +35,7 @@ mutacion.ruido=100
#Propiedades del problema
problema.aceleracion=1.96
problema.velocidad=60
problema.velocidad.promedio.actual=10
problema.bajada.tiempo=60
problema.tren.capacidad=350
......
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