bool CVRPSolver::solveVRP(std::string& strError) { // if (!m_bIsReadyToSolve) // { // strError = "Scenario is not ready to solve. Configure all parameter"; // return false; // } PGR_LOG("Inside Solve VRP"); std::vector<int> vecOrders, vecVehicles; for(auto &rule:m_vOrderInfos) { vecOrders.push_back(rule.getOrderId()); } for (auto &rule:m_vVehicleInfos) { vecVehicles.push_back(rule.getId()); } m_solutionFinal.init(vecOrders, static_cast<int>(vecOrders.size()), vecVehicles); PGR_LOG("After init solution"); int iAttemptCount = 0; while (iAttemptCount < MAXIMUM_TRY) { bool bUpdateFound = false; CSolutionInfo initialSolution = generateInitialSolution(); PGR_LOG("After Generate initial Solution"); iAttemptCount++; bUpdateFound = updateFinalSolution(initialSolution); PGR_LOG("After update final Solution"); bool bUpdateFound2 = tabuSearch(initialSolution); PGR_LOG("After Tabu Search"); if ((bUpdateFound == true) || (bUpdateFound2 == true)) { iAttemptCount = 0; } } m_bIsSolutionReady = true; strError += " "; return true; }
int main(int argc, char const *argv[]) { int termino = 0, offsetHost = 0; if (argv[1] == string("CSPLib")) { while (!termino) { // Configuración string NOMBRE_INSTANCIA = argv[2]; int ITERACIONES_TS = atoi(argv[3]), LARGO_LISTA_TABU = atoi(argv[4]); // Declaración de variables string PATH = "Instancias PPP/Instancias CSPLib/"; clock_t t_ini, t_fin; map<int, int> posicionesGuests; vector<int> hosts; double secs; pair <int, matrix> resultado; matrix matrizInicial; PPP problema; int CANTHOSTS; // Leyendo archivo de la instancia problema = leerArchivo(PATH + NOMBRE_INSTANCIA + ".txt"); // Seteando hosts y guests CANTHOSTS = problema.T + offsetHost; vector< pair<int, int> > yatesHosts = getNMayores(CANTHOSTS, problema.vtrK); for(unsigned i = 0; i < yatesHosts.size(); ++i) hosts.push_back(yatesHosts[i].second); posicionesGuests = getPosicionGuests(problema.Y, hosts); // Ejecutando algoritmos t_ini = clock(); matrizInicial = greedy(posicionesGuests, hosts, problema); resultado = tabuSearch(matrizInicial, posicionesGuests, hosts, problema, ITERACIONES_TS, LARGO_LISTA_TABU); t_fin = clock(); if (resultado.first != 0) { offsetHost++; continue; } secs = (double) (t_fin - t_ini) / CLOCKS_PER_SEC; // Escribiendo el archivo de salida escribirOutput(NOMBRE_INSTANCIA, hosts, posicionesGuests, resultado.second, problema, secs, resultado.first); termino = 1; } } else if (argv[1] == string("PPP")) { // Configuración int ITERACIONES_TS = atoi(argv[3]), LARGO_LISTA_TABU = atoi(argv[4]); // Declaración de variables string NOMBRE_INSTANCIA, ARCHIVO_SALIDA; string PATH = "Instancias PPP/"; clock_t t_ini, t_fin; map<int, int> posicionesGuests; vector<int> hosts; double secs; pair <int, matrix> resultado; matrix matrizInicial; PPP problema; // Leyendo archivo de la instancia y seteando hosts y guests if (argv[2] == string("m1")) { NOMBRE_INSTANCIA = string(argv[1]) + "_m1"; hosts = leerArchivoConfig(PATH + "Configuraciones/Configuraciones_m1.txt")["pp1_m"]; ARCHIVO_SALIDA = NOMBRE_INSTANCIA; } else if (argv[2] == string("m2")) { NOMBRE_INSTANCIA = string(argv[1]) + "_m2"; hosts = leerArchivoConfig(PATH + "Configuraciones/Configuraciones_m2.txt")["pp1_m2"]; ARCHIVO_SALIDA = NOMBRE_INSTANCIA; } else { NOMBRE_INSTANCIA = string(argv[1]); hosts = leerArchivoConfig(PATH + "Configuraciones/Configuraciones.txt")[argv[2]]; ARCHIVO_SALIDA = NOMBRE_INSTANCIA + "_" + string(argv[2]); } // Leyendo archivo de la instancia problema = leerArchivo(PATH + NOMBRE_INSTANCIA + ".txt"); posicionesGuests = getPosicionGuests(problema.Y, hosts); // Ejecutando algoritmos t_ini = clock(); matrizInicial = greedy(posicionesGuests, hosts, problema); cout << "Trabajando... Si es que el problema es PPP normal se demora entre 2 a 3 minutos." << endl << endl; resultado = tabuSearch(matrizInicial, posicionesGuests, hosts, problema, ITERACIONES_TS, LARGO_LISTA_TABU); t_fin = clock(); secs = (double) (t_fin - t_ini) / CLOCKS_PER_SEC; // Escribiendo el archivo de salida escribirOutput(ARCHIVO_SALIDA, hosts, posicionesGuests, resultado.second, problema, secs, resultado.first); } return 0; }