diff --git a/ProyectoFinal/AlgoritmoGenetico/malva/environment b/ProyectoFinal/AlgoritmoGenetico/malva/environment
index 40acae0be152d66f33091997b319361da8d84e2e..e4a4c954f09e7eb6c0c8b6b9a5fff8e5c8b06ba5 100644
--- a/ProyectoFinal/AlgoritmoGenetico/malva/environment
+++ b/ProyectoFinal/AlgoritmoGenetico/malva/environment
@@ -1,5 +1,5 @@
 # Malva Configuration.
-MALLBA_DIR=/ens/home01/l/lucas.bruzzone/Documentos/AE/AEPractico/ProyectoFinal/AlgoritmoGenetico/malva
+MALLBA_DIR=/ens/home01/g/gonzalo.menendez/Desktop/AEPractico/ProyectoFinal/AlgoritmoGenetico/malva
 
 # MPI library
 MPI_BIN=/lib64/mpich/bin
diff --git a/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/MainLan.o b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/MainLan.o
new file mode 100644
index 0000000000000000000000000000000000000000..40f4e83052168bac6d6cc0886d4b0c833c663211
Binary files /dev/null and b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/MainLan.o differ
diff --git a/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.hh b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.hh
index c3aa06d3413654e676ecff0ac114232fdf3f5c56..32164b3d2cceb34efae99803acfceaa88fc5f944 100644
--- a/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.hh
+++ b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.hh
@@ -10,6 +10,8 @@
 #ifndef INC_newGA
 #define INC_newGA
 #include "newGAstructures.hh"
+#include <vector>
+
 
 skeleton newGA
 {
@@ -67,21 +69,21 @@ skeleton newGA
         int cantFilas() const;
         int cantColumnas() const;
         
-        int** datosColumnas() const;
-        int** datosFilas() const;
+        std::vector<std::vector<int>> datosColumnas() const;
+        std::vector<std::vector<int>> datosFilas() const;
 
-        int* cantGruposColumna() const;
-        int* cantGruposFila() const;
+        std::vector<int> cantGruposColumna() const;
+        std::vector<int> cantGruposFila() const;
 
 		const char* getfield(char* line, int num); //???
 
 	private:
         int _cantFilas;
         int _cantColumnas;
-        vector<vector<int>> _datosColumnas;
-        vector<vector<int>> _datosFilas;
-        vector<int> _cantGruposColumna;
-        vector<int> _cantGruposFila;
+        std::vector<std::vector<int>> _datosColumnas;
+        std::vector<std::vector<int>> _datosFilas;
+        std::vector<int> _cantGruposColumna;
+        std::vector<int> _cantGruposFila;
   };
 
 //Solution ----------------------------------------------------------------------------
@@ -111,8 +113,9 @@ skeleton newGA
 		double fitness ();
 		unsigned int size() const;
 
-		int& var(const int index);
-		Rarray<int>& array_var();
+        Rarray<int>& var(const int indexC);
+		int& var(const int indexC, const int indexF);
+		Rarray<Rarray<int>>& array_var();
 
 	private:
 		Rarray<Rarray<int>> _var;
diff --git a/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.pro.o b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.pro.o
new file mode 100644
index 0000000000000000000000000000000000000000..8a79374826a57f9269ae72e0a8447080a445c8b4
Binary files /dev/null and b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.pro.o differ
diff --git a/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.cc b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.cc
index 6ad867b1ab950b7c188907a6fb8251cabdb3bc67..2c41bdf4986a94282370a8978294ae49d93f6174 100644
--- a/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.cc
+++ b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.cc
@@ -13,27 +13,27 @@ 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)
+	Problem::Problem ():_cantFilas(0),_cantColumnas(0),_datosFilas(NULL),_datosColumnas(NULL), _cantGruposColumna(NULL), _cantGruposFila(NULL)
 	{
         //cout << "uf6";
     }
 
 	ostream& operator<< (ostream& os, const Problem& pbm)
 	{
-		os << endl << endl << "Number of Columns " << pbm._cantColumnas;
-		   << endl;
+		os << endl << endl << "Number of Columns " << pbm._cantColumnas << endl;
 
 		os << "Number of Rows " << pbm._cantFilas << endl;
 
 		os<<endl;
 		return os;
 	}
-
+/*
 	void split(const std::string &s, char delim, Out result) 
 	{
 	    std::stringstream ss(s);
 	    std::string item;
-	    while (std::getline(ss, item, delim)) {
+	    while (std::getline(ss, item, delim)) 
+        {
 	        *(result++) = item;
 	    }
 	}
@@ -44,7 +44,7 @@ skeleton newGA
 	    split(s, delim, std::back_inserter(elems));
 	    return elems;
 	}
-
+*/
 	istream& operator>> (istream& is, Problem& pbm)
 	{
 
@@ -62,6 +62,7 @@ skeleton newGA
             cerr << "Unable to open file datafile.txt";
             exit(1);   // call system to stop
         }
+        /*
         string x;
         getline(inFile, x);
         pbm._cantColumnas = stoi(x);
@@ -73,15 +74,85 @@ skeleton newGA
     		pbm._cantGruposColumna.push_back(divided.size());
         }
         inFile.close();
+        */
+        
+        string line2;
+        getline(inFile,line2);
+        pbm._cantColumnas = stoi(line2);
+        
+        for(int c = 0; c < pbm.cantColumnas(); c++)
+        {
+            getline(inFile, line2);
+            
+            std::vector<int> divided;
+            
+            int n = line2.length();  
+            int len=1;
+            int t=0;
+            int z=0;
+            for(int i=0; i<=line2.length(); i++) 
+            {
+                if(line2[i] == ' '|| i==line2.length()) 
+                {
+                    string rr = line2.substr(z,len);
+                    divided.push_back(stoi(rr));
+                    //cout << rr << " ";
+                    t=t+1;
+                    z=i+1;
+                    len=1;
+                    //s.erase(i,1);
+                }
+                else len=len+1;
+            }
+            pbm._datosColumnas.push_back(divided);
+            pbm._cantGruposColumna.push_back(divided.size());
+
+        }
+        inFile.close();
 
         //CARGAR DATOS FILAS
-		ifstream inFile;
-		inFile.open("datos_filas");
-		if (!inFile)
+		ifstream inFile2;
+		inFile2.open("datos_filas");
+		if (!inFile2)
         {
             cerr << "Unable to open file datafile.txt";
             exit(1);   // call system to stop
         }
+        
+        //string line2;
+        getline(inFile2,line2);
+        pbm._cantFilas = stoi(line2);
+        
+        for(int c = 0; c < pbm.cantFilas(); c++)
+        {
+            getline(inFile2, line2);
+            
+            std::vector<int> divided;
+            
+            int n = line2.length();  
+            int len=1;
+            int t=0;
+            int z=0;
+            for(int i=0; i<=line2.length(); i++) 
+            {
+                if(line2[i] == ' '|| i==line2.length()) 
+                {
+                    string rr = line2.substr(z,len);
+                    divided.push_back(stoi(rr));
+                    //cout << rr << " ";
+                    t=t+1;
+                    z=i+1;
+                    len=1;
+                    //s.erase(i,1);
+                }
+                else len=len+1;
+            }
+            pbm._datosFilas.push_back(divided);
+            pbm._cantGruposFila.push_back(divided.size());
+
+        }
+        inFile2.close();
+        /*
         string x;
         getline(inFile, x);
         pbm._cantFilas = stoi(x);
@@ -93,6 +164,8 @@ skeleton newGA
     		pbm._cantGruposFila.push_back(divided.size());
         }
         inFile.close();
+        */
+        
         /*
         /*
         //CARGAR DATO CANT Tareas
@@ -313,14 +386,10 @@ skeleton newGA
 	    return NULL;
 	}
 
-	int ** Problem::limite_barrios() const{
-		return _limite_barrios;
-	}
-
 
 	bool Problem::operator== (const Problem& pbm) const
 	{
-		if (_dimension!=pbm.dimension()) return false;
+		if (_cantColumnas != pbm.cantColumnas() || _cantFilas != pbm.cantFilas()) return false;
 		return true;
 	}
 
@@ -329,12 +398,6 @@ skeleton newGA
 		return !(*this == pbm);
 	}
 
-	Direction Problem::direction() const
-	{
-		//return maximize;
-		return minimize;
-	}
-
 	int Problem::cantColumnas() const
 	{
 		return _cantColumnas;
@@ -344,36 +407,34 @@ skeleton newGA
 		return _cantFilas;
 	}
 
-	int ** Problem::datosFilas() const
+	std::vector<std::vector<int>> Problem::datosFilas() const
 	{
 		return _datosFilas;
 	}
 
-	int ** Problem::datosColumnas() const
+	std::vector<std::vector<int>> Problem::datosColumnas() const
 	{
 		return _datosColumnas;
 	}
 
-	int * Problem::cantGruposColumna() const
+	std::vector<int> Problem::cantGruposColumna() const
 	{
-		return _cantGruposColumna();
+		return _cantGruposColumna;
 	}
 
-	int * Problem::cantGruposFila() const
+	std::vector<int> Problem::cantGruposFila() const
 	{
-		return _cantGruposFila();
+		return _cantGruposFila;
 	}
 
 	Problem::~Problem()
 	{
 		//Libero la memoria pedida para almacenar los limites de los barrios
-		delete[] _datosColumnas;
-		delete[] _datosFilas;
 	}
 
 	// Solution --------------------------------------------------------------
 
-	Solution::Solution (const Problem& pbm):_pbm(pbm),_var(pbm.dimension())
+	Solution::Solution (const Problem& pbm):_pbm(pbm),_var(pbm.cantColumnas())
 	{}
 
 	const Problem& Solution::pbm() const
@@ -388,8 +449,14 @@ skeleton newGA
 
 	istream& operator>> (istream& is, Solution& sol)
 	{
-		for (int i=0;i<sol.pbm().dimension();i++)
-			is >> sol._var[i];
+		for (int i=0;i<sol.pbm().cantColumnas();i++)
+        {
+            for (int j = 0; j<sol.pbm().cantFilas(); j++)
+            {
+               is >> sol._var[i][j]; 
+            }
+        }
+			
 		return is;
 	}
 
@@ -406,7 +473,8 @@ skeleton newGA
 
         for (int j = 0; j < sol.pbm().cantFilas(); j++)
         {
-            for (int i = 0; i < sol.pbm().cantColumnas(); i++) {
+            for (int i = 0; i < sol.pbm().cantColumnas(); i++) 
+            {
                 
                 ss << sol._var[i][j] + " ";
             }
@@ -424,15 +492,25 @@ skeleton newGA
 	NetStream& operator << (NetStream& ns, const Solution& sol)
 	{
 		for (int i=0;i<sol._var.size();i++)
-			ns << sol._var[i];
+        {
+            for (int j=0; j<sol._var[i].size();j++)
+            {
+                ns << sol._var[i][j];
+            }
+        }
+			
 		return ns;
 	}
 
 	NetStream& operator >> (NetStream& ns, Solution& sol)
 	{
 		for (int i=0;i<sol._var.size();i++)
-			ns >> sol._var[i];
-		return ns;
+        {
+            for (int j=0; j<sol._var[i].size();j++)
+            {
+                ns >> sol._var[i][j];
+            }
+        }
 	}
 
  	Solution& Solution::operator= (const Solution &sol)
@@ -445,7 +523,12 @@ skeleton newGA
 	{
 		if (sol.pbm() != _pbm) return false;
 		for(int i = 0; i < _var.size(); i++)
-			if(_var[i] != sol._var[i]) return false;
+        {    
+            for (int j=0; j<sol._var[i].size();j++)
+            {
+                if(_var[i][j] != sol._var[i][j]) return false;
+            }
+        }
 		return true;
 	}
 
@@ -463,11 +546,11 @@ skeleton newGA
 					_var[x][y] = 0;
 				}
 			}
-			for (int i=0;i<_pbm.dimension();i++)
+			for (int i=0;i<_pbm.cantColumnas();i++)
 	        {
 				int _firstPossible = 0;
-				int** _grupos = _pbm.datosColumnas();
-				int* _cantGruposEnColumna = _pbm.cantGruposColumna();
+				std::vector<std::vector<int>> _grupos = _pbm.datosColumnas();
+				std::vector<int> _cantGruposEnColumna = _pbm.cantGruposColumna();
 
 				for(int j=0; j < _cantGruposEnColumna[i]; j++)
 				{
@@ -492,16 +575,16 @@ skeleton newGA
 	double Solution::fitness ()
 	{
 		double fitness = 0.0;
-		int** datosDeFilas = _pbm.datosFilas();
-		int* cantGruposDeFila = _pbm.cantGruposFila();
+		std::vector<std::vector<int>> datosDeFilas = _pbm.datosFilas();
+		std::vector<int> cantGruposDeFila = _pbm.cantGruposFila();
 		for (int i=0;i<_pbm.cantFilas();i++) 
 		{
 			int cantSeguidos=0;
 			int columna=0;
-			cantGrupos= cantGruposDeFila[i];
+			int 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;
+			bool terminoBloque = true;
 			while (columna < _pbm.cantColumnas()) 
 			{
 				if (_var[i][columna] == 1) 
@@ -516,14 +599,14 @@ skeleton newGA
 						resultado= abs(datosDeFilas[i][iteradorGrupos] - cantSeguidos); //valor absoluto de la resta
 						fitness= 1000*resultado;
 						terminoBloque=true;
-						iteradorGrupos++
+						iteradorGrupos++;
 						resultado=0;
 					}
 					cantSeguidos=0;
 				}
 				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;
@@ -545,8 +628,9 @@ skeleton newGA
 
 	void Solution::to_Solution(char *_string_)
 	{
+        //Probably wrong !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 		int *ptr=(int *)_string_;
-		for (int i=0;i<_pbm.dimension();i++)
+		for (int i=0;i<_pbm.cantColumnas();i++)
 		{
 			_var[i]=*ptr;
 			ptr++;
@@ -555,17 +639,23 @@ skeleton newGA
 
 	unsigned int Solution::size() const
 	{
-		return (_pbm.dimension() * sizeof(int));
+		return (_pbm.cantColumnas() * _pbm.cantFilas() * sizeof(int));
 	}
 
 
-	int& Solution::var(const int index)
+    Rarray<int>& Solution::var(const int indexC)
+	{
+		return _var[indexC];
+	}
+
+	
+	int& Solution::var(const int indexC, const int indexF)
 	{
-		return _var[index];
+		return _var[indexC][indexF];
 	}
 
 
-	Rarray<int>& Solution::array_var()
+	Rarray<Rarray<int>>& Solution::array_var()
 	{
 		return _var;
 	}
@@ -680,18 +770,18 @@ skeleton newGA
 	{
 		//Usamos cruzamiento de dos puntos (2PX)
 		int i=0;
-		Rarray<int> aux(sol1.pbm().dimension());
+		Rarray<Rarray<int>> aux(sol1.pbm().cantColumnas());
 		aux=sol2.array_var();
-            int limit=rand_int((sol1.pbm().dimension()/2)+1,sol1.pbm().dimension()-1);
+            int limit=rand_int((sol1.pbm().cantColumnas()/2)+1,sol1.pbm().cantColumnas()-1);
             int limit2=rand_int(0,limit-1);
 
             for (i=0;i<limit2;i++)
                 sol2.var(i)=sol1.var(i);
             for (i=0;i<limit2;i++)
                 sol1.var(i)=aux[i];
-            for (i=limit;i<sol1.pbm().dimension();i++)
+            for (i=limit;i<sol1.pbm().cantColumnas();i++)
                 sol2.var(i)=sol1.var(i);
-            for (i=limit;i<sol1.pbm().dimension();i++)
+            for (i=limit;i<sol1.pbm().cantColumnas();i++)
                 sol1.var(i)=aux[i];
 	}
 
@@ -741,14 +831,14 @@ skeleton newGA
 
 	void Mutation::mutate(Solution& sol) const
 	{
-		_grupos = _pbm.datosColumnas();
-		for (int i=0;i<sol.pbm().dimension();i++)
+		std::vector<std::vector<int>> _grupos = sol.pbm().datosColumnas();
+		for (int i=0;i<sol.pbm().cantColumnas();i++)
 		{
 			if (rand01()<=probability[1])
 			{
-				int inic= rand_int(0,sol1.pbm().cantFilas()-2); //Arranca en 0, si tiene 15 filas va hasta la 14
-				inf fin= rand_int(inic+1,sol1.pbm().cantFilas()-1);
-				if (fin != (sol1.pbm().cantFilas()-1)) {
+				int inic= rand_int(0,sol.pbm().cantFilas()-2); //Arranca en 0, si tiene 15 filas va hasta la 14
+				int fin= rand_int(inic+1,sol.pbm().cantFilas()-1);
+				if (fin != (sol.pbm().cantFilas()-1)) {
 					if (fin-inic == 1) {
 						if (i != 0) {
 							int aux= _grupos[i][inic-1];
@@ -769,7 +859,7 @@ skeleton newGA
 							}
 							_grupos[i][iter] = var;
 						} else { //ESTOY EN LO MAS ARRIBA POSIBLE, LO HAGO PARA ABAJO
-							if (fin != sol1.pbm().cantFilas()-1) { //CHEQUEO QUE EFECTIVAMENTE ME PUEDO MOVER PARA ABAJO
+							if (fin != sol.pbm().cantFilas()-1) { //CHEQUEO QUE EFECTIVAMENTE ME PUEDO MOVER PARA ABAJO
 								int var =_grupos[i][iter+1];
 								while (iter != fin+1) {
 									_grupos[i][iter+1] = _grupos[i][inic];
@@ -784,14 +874,6 @@ skeleton newGA
 		}
 	}
 
-
-								int temp = rand_int(0,sol.pbm().cantEmpleados() - 1);
-				sol.var(i)= temp;
-                //sol.var(i)=rand_int(0,3);
-			}
-		}
-	}
-
 	void Mutation::execute(Rarray<Solution*>& sols) const
 	{
 		for (int i=0;i<sols.size();i++)
diff --git a/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.o b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.o
new file mode 100644
index 0000000000000000000000000000000000000000..20940d938f1dec2308aa4970a4f3cf4f1c359e1a
Binary files /dev/null and b/ProyectoFinal/AlgoritmoGenetico/malva/rep/GA/newGA.req.o differ