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