public void sciezkaAB(int p, int k, Zapotrzebowanie zzz) { int a; List <int> pop = new List <int>(); int x = k; if (p != k) { a = 0; int r = 1; pop.Insert(0, k); while (poprzednicy[x] != 0) { pop.Insert(pop.Count, poprzednicy[x]); x = poprzednicy[x]; r++; } int y = 0; int razy = 1; /* * Console.WriteLine("START"); * for (int i = 0; i < pop.Count; i++) * { * * Console.WriteLine(pop[i]); * * } * Console.WriteLine("EnD"); * /* * for (int i = 0; i < siec.liczba_wezlow; i++) * { * for (int j = 0; j < siec.liczba_wezlow; j++) * { * Console.WriteLine(siec.tablica_uzyc[i, j]); * //wykorzystania[i, j] = 0; * } * } */ x++; // Console.WriteLine("popcount"+x+" !!!!"); for (int i = 0; i < pop.Count - 1; i++) { razy = 0; y = siec.tablica_laczy[pop[i + 1], pop[i]]; razy = siec.tablica_uzyc[pop[i + 1], pop[i]]; // Console.WriteLine(siec.lacza[y].id+" LLL"); siec.lacza[y].iloscmodulow += razy; // Console.WriteLine(siec.lacza[y].iloscmodulow); zzz.krawedzie.Insert(z.krawedzie.Count, (y + 1)); siec.lacza[y].wolna_pojemnosc += ((razy * siec.lacza[y].pojemnosc) - z.rozmiar); /* * for (int j=0; j<siec.wezly[pop[i+1]].drogi.Length-1;j++) * * { * if (siec.lacza[y].WezelKoniec == siec.wezly[pop[i+1]].drogi[j].dane) * { * // Console.WriteLine("aaaaaaaaaaaa"); * if (siec.tablica_drog[pop[i+1],j] != siec.wezly[pop[i+1]].drogi[j].klucz) * { * // Console.Write(siec.tablica_drog[pop[i+1], j] + " xxxxx " + siec.wezly[pop[i+1]].drogi[j].klucz); * // Console.WriteLine(""); * * r = (int)(siec.wezly[pop[i+1]].drogi[j].klucz / siec.tablica_drog[pop[i+1], j]); * * } * } * * * } */ } // Console.WriteLine("Zapotrzebowania " + zzz.krawedzie.Count); // Console.Write("Sciezka (od koncowego do pierwsze)"+sciezka + "\n"); // Console.Write("Sciezka: "); for (int i = 0; i < pop.Count; i++) { // Console.Write(pop[i] + " "); } // Console.WriteLine(""); for (int i = 0; i < siec.liczba_laczy; i++) { // Console.Write(i+1+" ilosc: "+siec.lacza[i].iloscmodulow + "\n"); } for (int i = 0; i < siec.liczba_laczy; i++) { // Console.WriteLine(siec.lacza[i].wolna_pojemnosc); // Console.WriteLine(siec.lacza[i].pojemnosc); } // Console.Write("Dlugosc sciezki od" + p + " do " + k + "wynosi: " + drogi[k] + "\n"); koszt = drogi[k]; // Console.WriteLine(drogi[k]); } else { a = 0; pop.Insert(pop.Count, p); koszt = 0; // Console.Write(pop[i] + " ") // Console.Write("Dlugosc sciezki od" + p + " do " + k + "wynosi: " + drogi[k] + "\n"); } }
public void sciezkaOthers(int p, Zapotrzebowanie zzz) { zap = 1; z = zzz; for (int i = 1; i <= siec.liczba_wezlow; i++) { for (int j = 0; j < siec.wezly[i].drogi.Length - 1; j++) { siec.wezly[i].drogi[j].klucz = siec.tablica_drog[i, j]; siec.wezly[i].drogi[j].przepustowsci = siec.lacza[siec.tablica_laczy[i, siec.wezly[i].drogi[j].dane]].wolna_pojemnosc; } } for (int i = 0; i <= siec.liczba_wezlow; i++) { for (int j = 0; j <= siec.liczba_wezlow; j++) { siec.tablica_uzyc[i, j] = 0; //wykorzystania[i, j] = 0; } } /* * for (int i = 0; i < siec.liczba_wezlow; i++) * { * for (int j = 0; j < siec.liczba_wezlow; j++) * { * Console.WriteLine(siec.tablica_uzyc[i, j]); * //wykorzystania[i, j] = 0; * } * } */ for (int i = 1; i <= siec.liczba_wezlow; i++) { for (int j = 0; j < siec.wezly[i].drogi.Length - 1; j++) { while (siec.wezly[i].drogi[j].przepustowsci < zzz.rozmiar) { siec.wezly[i].drogi[j].klucz += siec.lacza[siec.tablica_laczy[i, siec.wezly[i].drogi[j].dane]].koszt; siec.tablica_uzyc[i, siec.wezly[i].drogi[j].dane] += 1; siec.wezly[i].drogi[j].przepustowsci = siec.wezly[i].drogi[j].przepustowsci + siec.lacza[siec.tablica_laczy[i, siec.wezly[i].drogi[j].dane]].pojemnosc; // Console.WriteLine("aaaaaaaaaaaa"); } } } drogi1 = new MinHeap <double, int, double>(siec.liczba_wezlow); // poprzednicy = new int[siec.zwrocLiczbewezlow() + 1]; for (int i = 1; i <= siec.zwrocLiczbewezlow(); i++) // 0 jest puste { if (i != p) { siec.ustawWybor(i, 0); poprzednicy[i] = 0; drogi[i] = nieskonczonosc; drogi1.Insert(nieskonczonosc, i, 0); } else { drogi1.Insert(0, i, 0); siec.ustawWybor(i, 0); } } poprzednicy[p] = 0; drogi[p] = 0; wybrane = 0; int v = p; double m = nieskonczonosc; Random rnd = new Random(DateTime.Now.Millisecond);; double prz; while (wybrane != siec.liczba_wezlow) { Element <double, int, double> n = new Element <double, int, double>(); wybrane++; while (siec.wezly[v].wybrany != false && drogi1.Count != 0) { n = drogi1.ExtractMin(); v = n.dane; } // v = drogi1.ExtractMin().dane; siec.ustawWybor(v, 1); for (int i = 0; i < siec.wezly[v].drogi.Length - 1; i++) { prz = rnd.NextDouble(); if (drogi[siec.wezly[v].drogi[i].dane] > siec.wezly[v].drogi[i].klucz + drogi[v]) { if (prz >= 0.5) { if (drogi[siec.wezly[v].drogi[i].dane] > siec.wezly[v].drogi[i].klucz + drogi[v]) { drogi[siec.wezly[v].drogi[i].dane] = siec.wezly[v].drogi[i].klucz + drogi[v]; //siec.ustawWybor(n.dane, 1); poprzednicy[siec.wezly[v].drogi[i].dane] = v; if (siec.wezly[siec.wezly[v].drogi[i].dane].wybrany != true) { drogi1.Insert(siec.wezly[v].drogi[i].klucz + drogi[v], siec.wezly[v].drogi[i].dane, 0); } } } } } } for (int i = 1; i <= siec.zwrocLiczbewezlow(); i++) { // Console.Write("d" + i + " " + drogi[i]+ " " + "p" + " " + poprzednicy[i] + "\n"); } }
public Tester() { rnd = new Random(); #region Odczyt z pliku Console.WriteLine("Przeciagnij tu plik wejsciowy i wcisnij ENTER..."); sciezka_wejscia = Console.ReadLine(); if (sciezka_wejscia[0] == '\"') { sciezka_wejscia = sciezka_wejscia.Substring(1, sciezka_wejscia.Length - 2); } Console.WriteLine(" "); odczyt = new StreamReader(sciezka_wejscia); String linia = ""; while (linia.Length < 2 || linia[0] == '#') { linia = odczyt.ReadLine(); } wyrazy = linia.Split(' '); if (wyrazy[0] == "WEZLY") { liczbawezlow = int.Parse(wyrazy[2]); } wezly = new Wezel[liczbawezlow + 1]; wezly[0] = null; for (int i = 1; i <= liczbawezlow; i++)//WEZEL ZEROWY JEST PUSTY { wezly[i] = new Wezel(i, liczbawezlow); } linia = odczyt.ReadLine(); while (linia.Length < 2 || linia[0] == '#') { linia = odczyt.ReadLine(); } wyrazy = linia.Split(' '); tablica_polaczen = new double[liczbawezlow + 1, liczbawezlow + 1]; for (int i = 0; i <= liczbawezlow; i++) { for (int j = 0; j <= liczbawezlow; j++) { tablica_polaczen[i, j] = nieskonczonosc; } } if (wyrazy[0] == "LACZA") { liczbalaczy = int.Parse(wyrazy[2]); } lacza = new Lacze[liczbalaczy + 1]; //Lacze zerowe jest puste lacza[0] = null; linia = odczyt.ReadLine(); //odczytanie jednej lini z # for (int i = 0; i < liczbalaczy; i++) { linia = odczyt.ReadLine(); wyrazy = linia.Split(' '); wyrazy2 = wyrazy[3].Split('.'); wyrazy[3] = (wyrazy2[0] + "," + wyrazy2[1]); wyrazy2 = wyrazy[4].Split('.'); wyrazy[4] = (wyrazy2[0] + "," + wyrazy2[1]); lacza[i] = new Lacze(int.Parse(wyrazy[0]), int.Parse(wyrazy[1]), int.Parse(wyrazy[2]), double.Parse(wyrazy[3]), double.Parse(wyrazy[4])); tablica_polaczen[lacza[i].WezelPoczatek, lacza[i].WezelKoniec] = lacza[i].koszt; } linia = odczyt.ReadLine(); while (linia.Length < 2 || linia[0] == '#') { linia = odczyt.ReadLine(); } wyrazy = linia.Split(' '); if (wyrazy[0] == "ZAPOTRZEBOWANIA") { liczbazapotrzebowan = int.Parse(wyrazy[2]); } linia = odczyt.ReadLine(); zapotrzebowania = new Zapotrzebowanie[liczbazapotrzebowan + 1]; for (int i = 1; i <= liczbazapotrzebowan; i++) { linia = odczyt.ReadLine(); wyrazy = linia.Split(' '); wyrazy2 = wyrazy[3].Split('.'); wyrazy[3] = (wyrazy2[0] + "," + wyrazy2[1]); zapotrzebowania[i] = new Zapotrzebowanie(int.Parse(wyrazy[0]), int.Parse(wyrazy[1]), int.Parse(wyrazy[2]), double.Parse(wyrazy[3])); } odczyt.Close(); #endregion #region Debug - odczyt z pliku Console.WriteLine(" "); Console.WriteLine("Debug: "); Console.WriteLine("Liczba Wezlow: " + liczbawezlow); Console.WriteLine("Liczba Laczy: " + liczbalaczy); Console.WriteLine("Liczba Zapotrzebowan: " + liczbazapotrzebowan); Console.WriteLine("Lacza:"); for (int i = 0; i < liczbalaczy; i++) { Console.WriteLine("id: " + lacza[i].id + ", Wezel poczatkowy: " + lacza[i].WezelPoczatek + ", Wezel koncowy: " + lacza[i].WezelKoniec + ", Przeplywnosc: " + lacza[i].pojemnosc + ", Koszt Modulu: " + lacza[i].koszt); } Console.WriteLine("Zapotrzebowania:"); for (int i = 1; i <= liczbazapotrzebowan; i++) { Console.WriteLine("id: " + zapotrzebowania[i].id + ", Wezel poczatkowy: " + zapotrzebowania[i].WezelPoczatek + ", Wezel koncowy: " + zapotrzebowania[i].WezelKoniec + ", Rozmiar: " + zapotrzebowania[i].rozmiar); } #endregion //UZUPELNIENIE INFORMACJI O WEZLACH siec = new Siec(lacza, liczbawezlow, liczbalaczy, wezly); //zapotrzebowania[nr_zapotrzebowania].tablica_uzytych_laczy = (int[])wybrane_lacza.Clone(); wybrane_lacza = new int[liczbalaczy + 1]; Console.WriteLine("xx"); double[,] zamontowane = new double[liczbazapotrzebowan + 1, liczbalaczy]; double[,] poprzednie = new double[liczbazapotrzebowan + 1, liczbalaczy]; for (int i = 0; i <= liczbazapotrzebowan; i++) { for (int j = 0; j < liczbalaczy; j++) { poprzednie[i, j] = 0; } } /* * dijkstra = new Dijkstra(siec); * int a=1; * bool[] tab = new bool[liczbazapotrzebowan+1]; * for (int j=1;j<=liczbazapotrzebowan;j++) * { * * tab[j] = false; * } * * * * // Console.WriteLine(liczbazapotrzebowan + "zapot"); * int x = rnd.Next(1, liczbazapotrzebowan+1); * while(a<=liczbazapotrzebowan) * { * // Console.WriteLine("NR A: " + a); * x = rnd.Next(1, liczbazapotrzebowan+1); * while (tab[x]!=false) * { * // Console.WriteLine("weszlo+"+x); * x = rnd.Next(1, liczbazapotrzebowan+1); * } * * dijkstra.sciezkaOthers(zapotrzebowania[x].WezelPoczatek, zapotrzebowania[x]); * dijkstra.sciezkaAB(zapotrzebowania[x].WezelPoczatek, zapotrzebowania[x].WezelKoniec); * koszt += dijkstra.koszt; * tab[x] = true; * a++; * /* * for (int j = 0; j < liczbalaczy; j++) * * { * zamontowane[i, j] = dijkstra.siec.lacza[j].iloscmodulow - poprzednie[i - 1, j]; * poprzednie[i, j] = dijkstra.siec.lacza[j].iloscmodulow; * * } * * } */ // Console.WriteLine("koszt: " + koszt); /* * for (int i = 1; i <= liczbazapotrzebowan; i++) * { * for (int j = 0; j < liczbalaczy; j++) * { Console.Write(zamontowane[i, j] + " "); } * Console.WriteLine(""); * * } * */ int iter = 0; Lacze[] rozwiazanie = new Lacze[zapotrzebowania.Length]; Lacze[] koncowe_rozw = new Lacze[zapotrzebowania.Length]; Wyzarzanie los = new Wyzarzanie(10000, 0.1, 0.9999); najlepsze = Double.PositiveInfinity; double akt_roz = Double.PositiveInfinity; double xx; tablica_uzytych = new double[liczbalaczy]; double[] tablica_uzytych_akt = new double[liczbalaczy]; for (int i = 0; i < liczbalaczy; i++) { tablica_uzytych[i] = 0; tablica_uzytych_akt[i] = 0; } double roznica = 0; Console.WriteLine("xx"); aaa = new List <int> [liczbazapotrzebowan + 1]; naj = new List <int> [liczbazapotrzebowan + 1]; aaa[0] = null; naj[0] = null; // double akt_koszt = Double.PositiveInfinity; int a; while (los.temp_konc < los.temp) { iter++; koszt = 0; // Console.WriteLine("no siema"); for (int i = 1; i <= liczbazapotrzebowan; i++) { if (zapotrzebowania[i].krawedzie.Count != 0) { zapotrzebowania[i].krawedzie.Clear(); } } aaa = new List <int> [liczbazapotrzebowan + 1]; // siec = new Siec(lacza, liczbawezlow, liczbalaczy, wezly); for (int i = 0; i <= liczbazapotrzebowan; i++) { for (int j = 0; j < liczbalaczy; j++) { poprzednie[i, j] = 0; } } dijkstra = new Dijkstra(siec); a = 1; bool[] tab = new bool[liczbazapotrzebowan + 1]; for (int j = 1; j <= liczbazapotrzebowan; j++) { tab[j] = false; } // Console.WriteLine(liczbazapotrzebowan + "zapot"); int x = rnd.Next(1, liczbazapotrzebowan + 1); while (a <= liczbazapotrzebowan) { // Console.WriteLine("NR A: " + a); x = rnd.Next(1, liczbazapotrzebowan + 1); while (tab[x] != false) { // Console.WriteLine("weszlo+"+x); x = rnd.Next(1, liczbazapotrzebowan + 1); } dijkstra.sciezkaOthers(zapotrzebowania[x].WezelPoczatek, zapotrzebowania[x]); dijkstra.sciezkaAB(zapotrzebowania[x].WezelPoczatek, zapotrzebowania[x].WezelKoniec, zapotrzebowania[x]); koszt += dijkstra.koszt; aaa[x] = zapotrzebowania[x].krawedzie; tab[x] = true; a++; } /* * for (int i = 0; i < liczbalaczy; i++) * { * Console.WriteLine(siec.lacza[i].iloscmodulow); * * * } */ roznica = koszt - akt_roz; if (roznica < 0) { akt_roz = koszt; for (int i = 0; i < liczbalaczy; i++) { // tablica_uzytych_akt[i] = lacza[i].iloscmodulow; } } else { xx = rnd.NextDouble(); if (xx < Math.Exp(-roznica / los.temp)) { akt_roz = koszt; for (int i = 0; i < liczbalaczy; i++) { // tablica_uzytych_akt[i] = lacza[i].iloscmodulow; } } } /* * for (int i = 1; i <= liczbazapotrzebowan; i++) * { * * for (int j = 0; j < aaa[i].Count; j++) * { Console.WriteLine(" " + aaa[i][j]); } * * * * } * */ if (najlepsze > akt_roz) { najlepsze = akt_roz; naj = aaa; for (int i = 1; i <= liczbazapotrzebowan; i++) { naj[i] = zapotrzebowania[i].krawedzie; } for (int i = 0; i < liczbalaczy; i++) { tablica_uzytych[i] = lacza[i].iloscmodulow; } } /* * for (int j = 0; j < liczbalaczy; j++) * * { * zamontowane[i, j] = dijkstra.siec.lacza[j].iloscmodulow - poprzednie[i - 1, j]; * poprzednie[i, j] = dijkstra.siec.lacza[j].iloscmodulow; * * } */ /* * for (int i = 0; i < liczbalaczy; i++) * { * Console.WriteLine(tablica_uzytych_akt[i]); * * * } */ los.temp = los.temp * los.lambda; // Console.WriteLine("koszt: " + akt_roz); // Console.WriteLine("koszt: " + akt_roz); } Console.WriteLine("najlepsze: " + najlepsze); for (int i = 1; i <= liczbazapotrzebowan; i++) { Console.Write(i); for (int j = 0; j < naj[i].Count; j++) { Console.Write(" " + naj[i][j]); } Console.WriteLine(""); Console.WriteLine(naj[i].Count); Console.WriteLine(""); } Zapis(); Console.WriteLine("Liczba iteracji: " + iter); }