From 09449d52c638f1b0a47893ff8714ef95bd71de5f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Men=C3=A9ndez?= <gonchimenendez@gmail.com>
Date: Sun, 25 Nov 2018 18:42:39 -0300
Subject: [PATCH] generador

---
 .../rep/GA/generador Nonogram Gonzalo.py      | 92 +++++++++++++++++++
 .../malva/rep/GA/newGA.req.cc                 | 61 +++++-------
 2 files changed, 113 insertions(+), 40 deletions(-)
 create mode 100644 ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/generador Nonogram Gonzalo.py

diff --git a/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/generador Nonogram Gonzalo.py b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/generador Nonogram Gonzalo.py
new file mode 100644
index 0000000..7e62843
--- /dev/null
+++ b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/generador Nonogram Gonzalo.py	
@@ -0,0 +1,92 @@
+import sys
+import random
+import math
+from collections import defaultdict
+
+try:
+	#Constantes
+	width = 10
+	height = 10
+	archivo_salida = "placeholder"
+	
+	#Sanity check
+	if (len(sys.argv)<4):
+		print "Ejecutar con la siguiente linea: ./generador <width> <height> <archivo_salida>"
+		sys.exit(1)
+
+	width=int(sys.argv[1])
+	height=int(sys.argv[2])
+	archivo_salida=sys.argv[3]
+
+	if (width<1):
+		print "La cantidad de columnas debe ser mayor o igual a 1."
+		sys.exit(1)
+
+	
+	if (height<1):
+		print "La cantidad de filas debe ser mayor o igual a 1."
+		sys.exit(1)
+
+
+	#VARIABLES:
+	
+	#inicializacion tablero
+	tablero = []
+	
+	for i in range(0,width):
+		columna = []
+		for j in range(0, height):
+			columna.append(random.int(0,1))
+
+		tablero.append(columna)
+	
+	######################
+	#calculo de datos de fila / columna
+	######################
+
+	datosColumnas = []
+	for i in range(0, width):
+		datos = []
+		counter = 0
+		for j in range (0, height):
+			if (tablero[i][j] == 0):
+				if (counter != 0):
+					datos.append(counter)
+					counter = 0
+			else:
+				counter += 1
+		if (counter != 0):
+			datos.append(counter)
+		datosColumnas.append(datos)
+
+	datosFilas = []
+	for i in range(0, height):
+		datos = []
+		counter = 0
+		for j in range (0, width):
+			if (tablero[j][i] == 0):
+				if (counter != 0):
+					datos.append(counter)
+					counter = 0
+			else:
+				counter += 1
+		if (counter != 0):
+			datos.append(counter)
+		datosFilas.append(datos)
+
+
+	#archivo de salida de columnas
+	archivo = open ("datos_columnas", "w")
+	for i in range(0, width):
+		for j in range(0, len(datosColumnas[i])):
+			archivo.write("%d "%datosColumnas[i][j])
+		archivo.write("\n")
+
+	archivo = open ("datos_filas", "w")
+	for i in range(0, height):
+		for j in range(0, len(datosFilas[i])):
+			archivo.write("%d "%datosFilas[i][j])
+		archivo.write("\n")
+
+except IOError as error:
+	print error
diff --git a/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.cc b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.cc
index 99f59af..940a60f 100644
--- a/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.cc
+++ b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.cc
@@ -10,7 +10,7 @@
 
 skeleton newGA
 {
-
+	int currentBestFitness = INT_MAX;
 	// Problem ---------------------------------------------------------------
 
 	Problem::Problem ():_dimension(0),_limite_barrios(NULL),_tareasEsf(NULL),_tareasIndex(NULL),_empleados(NULL),_cantFilas(0),_cantColumnas(0),_datosFilas(NULL),_datosColumnas(NULL), _cantGruposColumna(NULL), _cantGruposFila(NULL)
@@ -452,19 +452,25 @@ skeleton newGA
 		double fitness = 0.0;
 		int** datosDeFilas = _pbm.datosFilas();
 		int* cantGruposDeFila = _pbm.cantGruposFila();
-		for (int i=0;i<_pbm.cantFilas();i++) {
+		for (int i=0;i<_pbm.cantFilas();i++) 
+		{
 			int cantSeguidos=0;
 			int columna=0;
 			cantGrupos= cantGruposDeFila[i];
 			int iteradorGrupos=0;
 			int resultado=0; //Resultado de la diferencia entre el bloque que tiene que haber y el bloque en el juego
 			boolean terminoBloque= true;
-			while (columna < _pbm.cantColumnas()) {
-				if (_var[i][columna] == 1) {
+			while (columna < _pbm.cantColumnas()) 
+			{
+				if (_var[i][columna] == 1) 
+				{
 					cantSeguidos++;
 					terminoBloque=false;
-				} else {
-					if (!terminoBloque) {
+				} 
+				else 
+				{
+					if (!terminoBloque) 
+					{
 						resultado= abs(datosDeFilas[i][iteradorGrupos] - cantSeguidos); //valor absoluto de la resta
 						fitness= 1000*resultado;
 						terminoBloque=true;
@@ -475,44 +481,19 @@ skeleton newGA
 				}
 				columna++;
 				//Si se termino la columna y faltan bloques
-				if((columna ==  _pbm.cantColumnas() && (iteradorGrupos < cantGrupos)) {
+				if((columna ==  _pbm.cantColumnas() && (iteradorGrupos < cantGrupos)) 
+				{
 					int restar= cantGrupos - iteradorGrupos;
-						fitness= fitness + 2100*restar;
-					}
-				}
+					fitness= fitness + 2100*restar;
 				}
 			}
 		}
-        double fitness = 0.0;
-        double* horasTrabajados = new double[_pbm.cantEmpleados()];
-        for (int q=0; q < _pbm.cantEmpleados(); q++)
-        {
-            horasTrabajados[q] = 0;
-        }
-
-		for (int i=0;i< _pbm.dimension();i++)
-        {
-			Empleado tipo = _pbm.empleados()[_var[i]];
-            double horasReq = ((double)_pbm.tareasEsf()[_pbm.tareasIndex()[i]]/(double)(0.5+tipo._habilidad));
-            horasTrabajados[_var[i]] += horasReq;
-
-        }
-
-
-        for (int j = 0; j < _pbm.cantEmpleados(); j++)
-        {
-            double diasTrabajadosTemp = (double)horasTrabajados[j] / (double)_pbm.empleados()[j]._horas;
-            fitness += (double)diasTrabajadosTemp * (double)_pbm.empleados()[j]._sueldo;
-            if (isnan(fitness))
-            exit(0);
-            if (diasTrabajadosTemp > _pbm.cantDias())
-            {
-                fitness += 100000;
-            }
-        }
-
+		extern int currentBestFitness;
+		if (fitness < currentBestFitness)
+		{
+			currentBestFitness = fitness;
+		}
 		return fitness;
-
 	}
 
 	char *Solution::to_String() const
@@ -814,7 +795,7 @@ skeleton newGA
 
 	bool StopCondition_1::EvaluateCondition(const Problem& pbm,const Solver& solver,const SetUpParams& setup)
 	{
-       bool fin=(int) (solver.current_time_spent() - solver.time_best_found_trial()) > 20000000;
+        bool fin=(currentBestFitness == 0 || (int) (solver.current_time_spent() - solver.time_best_found_trial()) > 20000000);
 		//Condicion de parada. Si el fitness es 0 terminamos la ejecucion.
 		//bool fin=(int)solver.best_cost_trial() == 0;
         //cout << pbm.cantEmpleados();
-- 
GitLab