Commit d401a53a authored by Falucho's avatar Falucho

Se quita el control del delay como restrinccion

parent a60af7f8
package uy.edu.fing.lrt.controlador;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import uy.edu.fing.lrt.genetic.Inicializador;
import uy.edu.fing.lrt.genetic.Parte2;
import uy.edu.fing.lrt.modelo.Arista;
import uy.edu.fing.lrt.modelo.Concentrador;
import uy.edu.fing.lrt.modelo.Individuo;
import uy.edu.fing.lrt.modelo.Linea;
import uy.edu.fing.lrt.util.PropiedadesEnum;
public final class CotasControlador {
private static CotasControlador INSTANCIA;
private Individuo individuo = null;
private Integer iteracion = 0;
private Boolean forceStop = false;
private Long startTime = null;
private Long endTime = null;
private List<Linea> prohibidas = new ArrayList<>();
//Singleton
private CotasControlador() {
}
public static synchronized CotasControlador getInstance() {
if (INSTANCIA == null) {
INSTANCIA = new CotasControlador();
}
return INSTANCIA;
}
public void run() {
ProblemaControlador problema = ProblemaControlador.getInstance();
List<Arista> aristas = problema.getAristas();
String[] especialesStr = PropiedadesControlador.getProperty(PropiedadesEnum.ESPECIALES).split(";");
Integer[] especiales = Arrays.asList(especialesStr).stream().map(Integer::valueOf).toArray(size -> new Integer[size]);
forceStop = false;
startTime = System.currentTimeMillis();
endTime = null;
try {
while (keepRunning()) {
List<Arista> cota = Parte2.run(aristas, especiales, prohibidas);
forceStop = cota.isEmpty();
if (forceStop) {
break;
}
individuo = formarIndividuo(cota);
for (Concentrador concentrador : individuo.getConcentradores()) {
for (Linea linea : concentrador.getLineas()) {
if (linea.getDelay() > concentrador.getMaxDelayAllowed()) {
//Asumimos que no hay repetidas
prohibidas.add(linea);
}
}
}
}
endTime = System.currentTimeMillis();
} catch (Exception e) {
throw e;
} finally {
}
}
private boolean keepRunning() {
long current = System.currentTimeMillis();
final long diff = current - startTime;
iteracion++;
return !forceStop && iteracion < 100 && diff < 300000 && (individuo == null || !individuo.isValido());
}
public String getTime() {
long current;
if (endTime == null) {
current = System.currentTimeMillis();
} else {
current = endTime;
}
final long diff = current - startTime;
final long sec = (diff / 1000) % 60;
final long min = (diff / 60000) % 60;
final long hour = (diff / 3600000);
return (hour == 0 ? "" : hour + ":") + (min == 0 ? "" : (min < 10 ? "0" : "") + min + ":") + (sec < 10 ? "0" : "") + sec;
}
//Metodo similar al algoritmo1 de la inicializacion, es mas, hace uso de parte de el
private static Individuo formarIndividuo(List<Arista> aristas) {
Integer cantCentros = PropiedadesControlador.getIntProperty(PropiedadesEnum.CANT_SUMIDEROS);
Integer cantFuentes = PropiedadesControlador.getIntProperty(PropiedadesEnum.CANT_FUENTES);
String[] especialesStr = PropiedadesControlador.getProperty(PropiedadesEnum.ESPECIALES).split(";");
Integer[] lineasPorFuentes = Arrays.asList(especialesStr).stream().map(Integer::valueOf).toArray(size -> new Integer[size]);
Concentrador[] concentradores = new Concentrador[cantFuentes];
//Por cada fuente
for (int i = cantCentros; i < (cantCentros + cantFuentes); i++) {
Concentrador tmp = Inicializador.glpk1(i, aristas, lineasPorFuentes, true);
concentradores[i - cantCentros] = tmp;
}
return new Individuo(concentradores);
}
public boolean isRunning() {
return endTime == null;
}
public void forceStop() {
forceStop = true;
}
public Individuo getIndividuo() {
return individuo;
}
public Integer getIteracion() {
return iteracion;
}
}
......@@ -187,7 +187,7 @@ public final class Inicializador {
throw new RuntimeException("Se esperaban " + lineas + " y se encontraron " + lineasResult.size());
}
return new Concentrador(Integer.valueOf(delays[fuente]), lineas, lineasResult);
return new Concentrador(lineas, lineasResult);
}
}
package uy.edu.fing.lrt.gui;
import uy.edu.fing.lrt.controlador.AEControlador;
import uy.edu.fing.lrt.controlador.CotasControlador;
import uy.edu.fing.lrt.controlador.ProblemaControlador;
import uy.edu.fing.lrt.controlador.PropiedadesControlador;
import uy.edu.fing.lrt.genetic.Parte1;
import uy.edu.fing.lrt.genetic.Parte2;
import uy.edu.fing.lrt.modelo.Arista;
import uy.edu.fing.lrt.modelo.Individuo;
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;
......@@ -258,22 +258,6 @@ public final class Principal extends javax.swing.JFrame {
menuCotas.setText("Cotas");
menuCotas.setEnabled(false);
menuCotaCalcular.setText("Calcular");
menuCotaCalcular.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuCotaCalcularActionPerformed(evt);
}
});
menuCotas.add(menuCotaCalcular);
menuCotaParar.setText("Detener");
menuCotaParar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuCotaPararActionPerformed(evt);
}
});
menuCotas.add(menuCotaParar);
jMenuBar1.add(menuCotas);
menuHelp.setText("Ayuda");
......@@ -517,9 +501,14 @@ public final class Principal extends javax.swing.JFrame {
if (rutaProp != null) {
PropiedadesControlador.load(new File(rutaProp));
}
List<Arista> aristas = ProblemaControlador.getInstance().getAristas();
individuo = Parte2.run();
//individuo = GlpkUtil.SPP(aristas,16,9,Arista::getCosto);
List<Arista> aristas = ProblemaControlador.getInstance().getAristas();
individuo = GlpkUtil.SPP(aristas,4,55,Arista::getDelay);
Linea l = new Linea(individuo);
List<Integer> nodos = l.getNodos();
clearAristas();
dibujarAristas();
dibujarAristas(individuo, Color.MAGENTA, 2);
......@@ -557,59 +546,6 @@ public final class Principal extends javax.swing.JFrame {
}
}//GEN-LAST:event_menuGuardarActionPerformed
private void menuCotaCalcularActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuCotaCalcularActionPerformed
try {
if (rutaProp != null) {
PropiedadesControlador.load(new File(rutaProp));
}
(new Thread(() -> {
try {
CotasControlador.getInstance().run();
} catch (Exception e) {
mostrarMensajeError(e);
}
})).start();
(new Thread(() -> {
try {
Thread.sleep(5000);
int iter = 0;
while (CotasControlador.getInstance().isRunning()) {
Individuo individuoCota = CotasControlador.getInstance().getIndividuo();
while (individuoCota == null) {
Thread.sleep(200);
individuoCota = CotasControlador.getInstance().getIndividuo();
}
String tiempo = CotasControlador.getInstance().getTime();
iter = CotasControlador.getInstance().getIteracion();
List<Arista> aristas = individuoCota.getAristas();
clearAristas();
dibujarAristas();
dibujarAristas(aristas, Color.MAGENTA, 2);
lblEstado.setText("Iteracion: " + iter + " | Costo Individuo: " + individuoCota.getCosto() + " | Tiempo: " + tiempo);
Thread.sleep(900);
}
} catch (InterruptedException ex) {
Logger.error(null, ex);
}
})).start();
} catch (Exception ex) {
mostrarMensajeError(ex);
Logger.error(null, ex);
}
}//GEN-LAST:event_menuCotaCalcularActionPerformed
private void menuCotaPararActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuCotaPararActionPerformed
CotasControlador.getInstance().forceStop();
}//GEN-LAST:event_menuCotaPararActionPerformed
private void debugCheckActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_debugCheckActionPerformed
PropiedadesControlador.setProperty(PropiedadesEnum.DEBUG, (debugCheck.isSelected() ? "TRUE" : "FALSE"));
......
package uy.edu.fing.lrt.modelo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
public final class Concentrador {
private Integer maxDelayAllowed;
private Integer cantLineas;
private List<Linea> lineas;
private String id = null;
private Boolean flip=false;
public Concentrador(Concentrador copy) {
maxDelayAllowed = copy.maxDelayAllowed;
cantLineas = copy.cantLineas;
id = null;
lineas = new ArrayList<>();
copy.lineas.forEach(linea -> lineas.add(new Linea(linea)));
}
public Concentrador(Integer maxDelayAllowed, Integer cantLineas, List<Linea> lineas) {
public Concentrador(Integer cantLineas, List<Linea> lineas) {
//TODO se podria validar que la entrada en cant coincida con el tamanio de lineas
this.maxDelayAllowed = maxDelayAllowed;
this.cantLineas = cantLineas;
this.lineas = lineas;
}
public List<Concentrador> tryFlip(){
// esto es, si tengo un nodo en comun en las lineas del concentrador,
// retorno otra combinacion, puede mejorar los costos de usuario
// lineas.get(0).get
return null;
}
private Integer[] getDelays() {
Integer[] delays = new Integer[lineas.size()];
......@@ -37,18 +38,9 @@ public final class Concentrador {
}
public boolean isValido() {
for (Integer delay : getDelays()) {
if (delay > maxDelayAllowed) {
return false;
}
}
return true;
}
public Integer getMaxDelayAllowed() {
return maxDelayAllowed;
}
public Integer getCantLineas() {
return cantLineas;
}
......
......@@ -27,17 +27,13 @@ public final class Individuo {
}
private void calcularCosto() {
//TODO: falta tener en cuenta el costo de operacion y usuario
costo = 0;
costo = getAristas().stream().map(Arista::getCosto).reduce(costo, Integer::sum);
}
public boolean isValido() {
for (Concentrador concentrador : concentradores) {
if (!concentrador.isValido()) {
return false;
}
}
return true;
return Arrays.stream(concentradores).allMatch(Concentrador::isValido);
}
public List<Arista> getAristas() {
......
package uy.edu.fing.lrt.modelo;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
public final class Linea {
......@@ -25,6 +23,51 @@ public final class Linea {
return tramos;
}
public List<Integer> getNodos() {
final Map<Integer, Nodo> cache = new HashMap<>();
final List<Integer> integers = new ArrayList<>();
final List<Arista> nuevoTramo = new ArrayList<>();
for (Arista arista : tramos) {
cache.put(arista.getIdNodoA(), arista.getNodoA());
cache.put(arista.getIdNodoB(), arista.getNodoB());
}
Nodo pivotN = null;
Arista pivotA = null;
for (Nodo value : cache.values()) {
List<Arista> collect = tramos.stream()
.filter(a -> a.getIdNodoA() == value.getNombre() || a.getIdNodoB() == value.getNombre())
.collect(Collectors.toList());
if (collect.size() == 1) {
pivotN = value;
pivotA = collect.get(0);
break;
}
}
for (int i = 0; i < cache.size(); i++) {
nuevoTramo.add(pivotA);//TODO, me queda la ultima duplicada.
integers.add(pivotN.getNombre());
if (pivotA.getIdNodoA() == pivotN.getNombre()) {
pivotN = pivotA.getNodoB();
} else {
pivotN = pivotA.getNodoA();
}
for (Arista a : tramos) {
if (a.getId().equals(pivotA.getId())) {
continue;
}
if (a.getIdNodoA() == pivotN.getNombre() || a.getIdNodoB() == pivotN.getNombre()) {
pivotA = a;
break;
}
}
}
return integers;
}
public String getId() {
if (id == null) {
genId();
......
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