public Dijkstra(Siec s) { zap = 0; siec = s; // x = 0; wybrane = 0; wykorzystania = new double[siec.liczba_wezlow + 1, siec.liczba_wezlow + 1]; poprzednicy = new int[siec.zwrocLiczbewezlow() + 1]; drogi = new double[siec.zwrocLiczbewezlow() + 1]; // drogi1 = new Lista<double, int>(); for (int i = 1; i <= siec.liczba_wezlow; i++) { for (int j = 1; j <= siec.liczba_wezlow; j++) { siec.lacza[siec.tablica_laczy[i, j]].wolna_pojemnosc = 0; siec.lacza[siec.tablica_laczy[i, j]].iloscmodulow = 0; } } 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; } } }
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"); } }