int main(int argc, char *argv[]) { bool verbose = false; /* Argomenti passati all'eseguibile */ ArgumentList args = ArgumentList(argc, argv); if ( argc < 2 || argc > 3 ) { cerr << "Utilizzo: " << args.getFirst() << " [-v] <file_istanza_tsp>" << endl; cerr << "\t-v : verboso." << endl << endl; return -1; } else { cout << args.getFirst() << endl; } /* Istanza del problema */ TSPInstance< w_type > *problema = new TSPInstance< w_type >; /* Loader dell'istanza */ TSPReader< w_type > *reader = new TSPReader< w_type >(problema); /* Nome del file da cui caricare l'istanza */ string filename = ""; /* Soluzione del problema */ vector< vertice * > *soluzione; verbose = args.getSwitch("-v"); filename = args.getFirst(); reader->setInputFile(filename); if ( ! reader->read() ) { cerr << "Impossibile leggere l'istanza." << endl; delete problema; delete reader; return -1; } if ( verbose ) { cout << "Istanza caricata, sta per essere eseguito l'algoritmo di risoluzione." << endl; } soluzione = new vector< vertice * >; christofides(problema->getGrafo(), soluzione); stampaDimensioneCircuito(*soluzione); cout << endl; stampaCostoCircuito(*soluzione, *(problema->getGrafo())); delete soluzione; delete problema; delete reader; return 0; }
int main(int argc, char *argv[]) { bool verbose = false; unsigned int distribuzione[21] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; double maxB = 0.5, minB = std::numeric_limits< double >::max(), averageB = 0, tempB = 1.0; /* Argomenti passati all'eseguibile */ ArgumentList args = ArgumentList(argc, argv); if ( argc < 2 || argc > 3 ) { cerr << "Utilizzo: " << args.getFirst() << " [-v] <file_istanza_tsp>" << endl; cerr << "\t-v : verboso." << endl << endl; return -1; } else { cout << endl << args.getFirst() << endl << endl; } /* Istanza del problema */ TSPInstance< w_type > *problema = new TSPInstance< w_type >; /* Loader dell'istanza */ TSPReader< w_type > *reader = new TSPReader< w_type >(problema); /* Nome del file da cui caricare l'istanza */ string filename = ""; istringstream converter; verbose = args.getSwitch("-v"); filename = args.getFirst(); reader->setInputFile(filename); if ( ! reader->read() ) { cerr << "Impossibile leggere l'istanza." << endl; delete problema; delete reader; return -1; } if ( verbose ) { cout << "Istanza caricata, sta per essere eseguito l'algoritmo di calcolo della beta metricita' del grafo." << endl; } unsigned int counter = ((problema->getGrafo())->numVertici() * ((problema->getGrafo())->numVertici() - 1) * ((problema->getGrafo())->numVertici() - 2)) / 2; for ( Grafo< w_type >::vertice_iterator x = (problema->getGrafo())->lista_vertici.begin(); x != --((problema->getGrafo())->lista_vertici.end()); x++ ) { Grafo< w_type >::vertice_iterator temp = x; for ( Grafo< w_type >::vertice_iterator y = ++temp; y != --((problema->getGrafo())->lista_vertici.end()); y++ ) { temp = y; for ( Grafo< w_type >::vertice_iterator z = ++temp; z != (problema->getGrafo())->lista_vertici.end(); z++ ) { w_type xy = (problema->getGrafo())->getPesoArcoCompreso(*x, *y), xz = (problema->getGrafo())->getPesoArcoCompreso(*x, *z), yz = (problema->getGrafo())->getPesoArcoCompreso(*y, *z); /* Primo vincolo */ tempB = 1.01; while ( static_cast< double >(xy) < static_cast< double >(tempB * (xz + yz)) && tempB >= 0 ) { tempB -= 0.01; } if ( tempB > maxB ) { maxB = tempB; } if ( tempB < minB ) { minB = tempB; } distribuzione[mappaDistribuzione(tempB)] += 1; if ( mappaDistribuzione(tempB) != 20 ) { averageB += tempB; } /* Secondo vincolo */ tempB = 1.01; while ( static_cast< double >(xz) < static_cast< double >(tempB * (xy + yz)) && tempB >= 0 ) { tempB -= 0.01; } if ( tempB > maxB ) { maxB = tempB; } if ( tempB < minB ) { minB = tempB; } distribuzione[mappaDistribuzione(tempB)] += 1; if ( mappaDistribuzione(tempB) != 20 ) { averageB += tempB; } /* Terzo vincolo */ tempB = 1.01; while ( static_cast< double >(yz) < static_cast< double >(tempB * (xz + xy)) && tempB >= 0 ) { tempB -= 0.01; } if ( tempB > maxB ) { maxB = tempB; } if ( tempB < minB ) { minB = tempB; } distribuzione[mappaDistribuzione(tempB)] += 1; if ( mappaDistribuzione(tempB) != 20 ) { averageB += tempB; } } } } averageB /= (counter - distribuzione[20]); cout << fixed << setprecision (3) << endl; cout << "Il valore massimo di beta nel grafo è pari a: " << maxB << endl; cout << "Il valore minimo di beta nel grafo è pari a: " << minB << endl; cout << "Il valore medio di beta nel grafo è pari a: " << averageB << endl; cout << endl; cout << "La distribuzione è la seguente: " << endl; cout << endl; cout << "0.00 - 0.05 : " << static_cast< double >(((static_cast< double >(distribuzione[0]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.06 - 0.10 : " << static_cast< double >(((static_cast< double >(distribuzione[1]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.11 - 0.15 : " << static_cast< double >(((static_cast< double >(distribuzione[2]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.16 - 0.20 : " << static_cast< double >(((static_cast< double >(distribuzione[3]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.21 - 0.25 : " << static_cast< double >(((static_cast< double >(distribuzione[4]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.26 - 0.30 : " << static_cast< double >(((static_cast< double >(distribuzione[5]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.31 - 0.35 : " << static_cast< double >(((static_cast< double >(distribuzione[6]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.36 - 0.40 : " << static_cast< double >(((static_cast< double >(distribuzione[7]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.41 - 0.45 : " << static_cast< double >(((static_cast< double >(distribuzione[8]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.46 - 0.50 : " << static_cast< double >(((static_cast< double >(distribuzione[9]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.51 - 0.55 : " << static_cast< double >(((static_cast< double >(distribuzione[10]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.56 - 0.60 : " << static_cast< double >(((static_cast< double >(distribuzione[11]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.61 - 0.65 : " << static_cast< double >(((static_cast< double >(distribuzione[12]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.66 - 0.70 : " << static_cast< double >(((static_cast< double >(distribuzione[13]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.71 - 0.75 : " << static_cast< double >(((static_cast< double >(distribuzione[14]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.76 - 0.80 : " << static_cast< double >(((static_cast< double >(distribuzione[15]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.81 - 0.85 : " << static_cast< double >(((static_cast< double >(distribuzione[16]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.86 - 0.90 : " << static_cast< double >(((static_cast< double >(distribuzione[17]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.91 - 0.95 : " << static_cast< double >(((static_cast< double >(distribuzione[18]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << "0.96 - 1.00 : " << static_cast< double >(((static_cast< double >(distribuzione[19]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << " > 1.00 : " << static_cast< double >(((static_cast< double >(distribuzione[20]) / 100) * 100) / (counter / 100)) << "%" << endl; cout << endl; return 0; }
int main(int argc, char *argv[]) { unsigned int n = 0; double beta = 0.0; bool verbose = false, correggi = false, shortest = false, l1 = false, l2 = false, linf = false, endpoint = false, interval = false; w_type maxPeso = 100000; string outfile = ""; istringstream converter; GrafoNonOrientatoBetaMetrico_ListaArchi< w_type > grafo; TSPInstance< w_type > problema; TSPWriter< w_type > *writer; ArgumentList args = ArgumentList(argc, argv); if ( argc < 7 || argc > 9 ) { cerr << "Utilizzo: " << args.getFirst() << " [-c] [-v] [-s|-e|-l1|-l2|-li] -n <nodi> -b <beta> <outfile>" << endl; cerr << "\t-c\t : correggi se non beta metrico;" << endl; cerr << "\t-i\t : metrica intervallo (base, base*2beta);" << endl; cerr << "\t-s\t : metrica shortest path;" << endl; cerr << "\t-e\t : metrica endpoint;" << endl; cerr << "\t-l1\t : metrica spazio l1;" << endl; cerr << "\t-l2\t : metrica spazio l2;" << endl; cerr << "\t-li\t : metrica spazio linf;" << endl; cerr << "\t-v\t : verboso." << endl << endl; return -1; } else { cout << args.getFirst() << endl; } verbose = args.getSwitch("-v"); correggi = args.getSwitch("-c"); shortest = args.getSwitch("-s"); interval = args.getSwitch("-i"); endpoint = args.getSwitch("-e"); l1 = args.getSwitch("-l1"); l2 = args.getSwitch("-l2"); linf = args.getSwitch("-li"); converter.str(args.getSwitchArgument("-n")); converter >> n; converter.clear(); converter.str(args.getSwitchArgument("-b")); converter >> beta; if ( n < 2 || beta < 0.5 ) { cerr << "Il numero di nodi del grafo dev'essere maggiore di 2 ed il valore di beta >= 0.5" << endl; return -1; } outfile = args.getFirst(); grafo.clear(); problema.clear(); grafo.setBeta(beta); srand(time(NULL)); if ( interval ) { /* Metrica intervall (base, base*2beta) */ grafo.generaRandom(n); } else if ( shortest ) { /* Metrica shortest path */ for ( unsigned int i(0); i < n; i++ ) { vertice *temp = grafo.aggiungiVertice(); temp->setKey(i); } for ( Grafo< w_type >::vertice_iterator x = grafo.lista_vertici.begin(); x != --(grafo.lista_vertici.end()); x++ ) { Grafo< w_type >::vertice_iterator temp = x; for ( Grafo< w_type >::vertice_iterator y = ++temp; y != grafo.lista_vertici.end(); y++ ) { grafo.aggiungiArco(*x, *y, static_cast< w_type >(1.0 + (maxPeso * (rand() / (RAND_MAX + 1.0))))); } } map< pair<vertice*, vertice*>, w_type > distanze = FloydWarshall(grafo); for ( Grafo< w_type >::vertice_iterator x = grafo.lista_vertici.begin(); x != --(grafo.lista_vertici.end()); x++ ) { Grafo< w_type >::vertice_iterator temp = x; for ( Grafo< w_type >::vertice_iterator y = ++temp; y != grafo.lista_vertici.end(); y++ ) { if ( distanze[pair<vertice*, vertice*>(*x, *y)] < grafo.getPesoArcoCompreso(*x, *y) ) { (grafo.getArcoCompreso(*x, *y))->costo = distanze[pair<vertice*, vertice*>(*x, *y)]; } } } } else if ( endpoint ) { /* Metrica endpoint */ double beta = grafo.getBeta(); double betaC = (pow(beta, 2.0) - pow(1 - beta, 2.0)) / (beta * (1 - beta)); double betaN = (1 - beta) / beta; double betaNx = beta / (1 - beta); arco< w_type > *tempArco = 0, *minArco = 0, *maxArco = 0; for ( unsigned int i(0); i < n; i++ ) { vertice *temp = grafo.aggiungiVertice(); temp->setKey(i); } for ( Grafo< w_type >::vertice_iterator x = grafo.lista_vertici.begin(); x != --(grafo.lista_vertici.end()); x++ ) { bool first = true; Grafo< w_type >::vertice_iterator temp = x; for ( Grafo< w_type >::vertice_iterator y = ++temp; y != grafo.lista_vertici.end(); y++ ) { double Bmin = (2 * pow(beta, 2.0)) / (1 - beta); double Bmax = (1 - beta) / (2 * pow(beta, 2.0)); if ( y == ++(grafo.lista_vertici.begin()) && x == grafo.lista_vertici.begin() ) { tempArco = grafo.aggiungiArco(*x, *y, static_cast< w_type >(1.0 + (maxPeso * (rand() / (RAND_MAX + 1.0))))); minArco = tempArco; maxArco = tempArco; } else { tempArco = grafo.aggiungiArco(*x, *y, static_cast< w_type >(1.0 + (maxPeso * (rand() / (RAND_MAX + 1.0))))); tempArco->costo = static_cast< w_type >((tempArco->costo * betaC) + betaN); if ( first ) { Grafo< w_type >::vertice_iterator tempVertice = x; tempArco->costo *= grafo.getPesoArcoCompreso(*(--tempVertice), *x); first = false; } else { Grafo< w_type >::vertice_iterator tempVertice = y; tempArco->costo *= grafo.getPesoArcoCompreso(*x, *(--tempVertice)); } if ( grafo.sonoArchiAdiacenti(tempArco, minArco) ) { Bmin = betaNx; } if ( grafo.sonoArchiAdiacenti(tempArco, maxArco) ) { Bmax = betaN; } if ( tempArco->costo > (Bmin * minArco->costo) || tempArco->costo < (Bmax * maxArco->costo) ) { tempArco->costo = static_cast< w_type >(floor((Bmax * maxArco->costo) + (((Bmin * minArco->costo) - (Bmax * maxArco->costo)) * (rand() / (RAND_MAX + 1.0))))); } if ( tempArco-> costo > maxArco->costo ) { maxArco = tempArco; } if ( tempArco->costo < minArco->costo ) { minArco = tempArco; } } } } } else { Space< w_type > spazio; map< vertice *, Point * > verticeToPoint; for ( unsigned int i(0); i < n; i++ ) { vertice *temp = grafo.aggiungiVertice(); temp->setKey(i); verticeToPoint[temp] = spazio.addPoint(static_cast< w_type >(1.0 + (maxPeso * (rand() / (RAND_MAX + 1.0)))), static_cast< w_type >(1.0 + (maxPeso * (rand() / (RAND_MAX + 1.0))))); } for ( Grafo< w_type >::vertice_iterator v = grafo.lista_vertici.begin(); v != --(grafo.lista_vertici.end()); v++ ) { Grafo< w_type >::vertice_iterator temp = v; for ( Grafo< w_type >::vertice_iterator u = ++temp; u != grafo.lista_vertici.end(); u++ ) { if ( l1 ) { /* Metrica spazio l1 */ grafo.aggiungiArco(*v, *u, static_cast< w_type >(spazio.l1Distance(verticeToPoint[*v], verticeToPoint[*u]))); } else if ( l2 ) { /* Metrica spazio l2 */ grafo.aggiungiArco(*v, *u, static_cast< w_type >(spazio.l2Distance(verticeToPoint[*v], verticeToPoint[*u]))); } else if ( linf ) { /* Metrica spazio linf */ grafo.aggiungiArco(*v, *u, static_cast< w_type >(spazio.lInfDistance(verticeToPoint[*v], verticeToPoint[*u]))); } } } } if ( verbose ) { cout << "Grafo generato con n = " << grafo.numVertici() << " ed m = " << grafo.numArchi() << endl; } if ( correggi ) { while ( !grafo.verifyBetaMetric(correggi) ) {}; if ( verbose ) { cout << "Il grafo è risultato " << grafo.getBeta() << "-metrico." << endl; } } problema.setProblemType("TSP"); problema.setEdgeWType("EXPLICIT"); problema.setEdgeWFormat("UPPER_ROW"); problema.setGrafo(&grafo); writer = new TSPWriter< w_type >(&problema); writer->setOutputFile(outfile); if ( !writer->write() ) { cerr << "Si e' verificato un problema durante il salvataggio dell'istanza su file." << endl; delete writer; return 1; } delete writer; if ( verbose ) { cout << "L'istanza e' stata salvata in " << outfile << endl; } return 0; }
int main(int argc, char *argv[]) { bool verbose = false; unsigned int intervalli = 10; /* Argomenti passati all'eseguibile */ ArgumentList args = ArgumentList(argc, argv); if ( argc < 4 || argc > 5 ) { cerr << "Utilizzo: " << args.getFirst() << " [-v] -k <intervalli> <file_istanza_tsp>" << endl; cerr << "\t-k: numero di intervalli;" << endl; cerr << "\t-v : verboso." << endl << endl; return -1; } else { cout << endl << args.getFirst() << endl << endl; } /* Istanza del problema */ TSPInstance< w_type > *problema = new TSPInstance< w_type >; /* Loader dell'istanza */ TSPReader< w_type > *reader = new TSPReader< w_type >(problema); /* Nome del file da cui caricare l'istanza */ string filename = ""; istringstream converter; verbose = args.getSwitch("-v"); converter.str(args.getSwitchArgument("-k")); converter >> intervalli; filename = args.getFirst(); reader->setInputFile(filename); if ( ! reader->read() ) { cerr << "Impossibile leggere l'istanza." << endl; delete problema; delete reader; return -1; } if ( verbose ) { cout << "Istanza caricata, sta per essere eseguito l'algoritmo di calcolo della distribuzione dei pesi." << endl; } /* Mappa contenente gli intervalli di distribuzione dei pesi e le percentuali */ map< double, double > *distribuzione = new map< double, double >(); /* Dimensioni di un intervallo */ double dimBlocco = 0; /* Peso minimo e massimo di un arco */ w_type min = std::numeric_limits< w_type >::max(), max = std::numeric_limits< w_type >::min(); for ( Grafo< w_type >::arco_const_iterator e = (problema->getGrafo())->lista_archi.begin(); e != (problema->getGrafo())->lista_archi.end(); e++ ) { if ( (*e)->costo < min ) { min = (*e)->costo; } if ( (*e)->costo > max ) { max = (*e)->costo; } } if ( verbose ) { cout << "Il peso minimo di un arco e' " << min << " mentre il peso massimo e' " << max << endl; } dimBlocco = (max - min) / static_cast< double >(intervalli); for ( unsigned int i(0); i <= intervalli; i++ ) { distribuzione->insert(pair< double, unsigned int >(min + (i * dimBlocco), 0)); } for ( Grafo< w_type >::arco_const_iterator e = (problema->getGrafo())->lista_archi.begin(); e != (problema->getGrafo())->lista_archi.end(); e++ ) { for ( unsigned int i(1); i <= intervalli; i++ ) { if ( min + (i * dimBlocco) > (*e)->costo ) { ((distribuzione->find(min + ((i - 1) * dimBlocco)))->second)++; break; } } } for ( map< double, double >::iterator i = (distribuzione->begin())++; i != distribuzione->end(); i++ ) { (*i).second = static_cast< double >(((*i).second * 100)) / (problema->getGrafo())->numArchi(); } cout << endl; for ( map< double, double >::iterator i = (distribuzione->begin())++; i != --(distribuzione->end()); i++ ) { cout << fixed << setprecision (2) << "Da " << (*(--i)).first << " a " << (*(++i)).first << ": " << (*i).second << "%" << endl; } cout << endl; return 0; }