Example #1
0
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;
}