public double countPermutationTime(int[] czas_zlecen, Wspolrzedne[] wspolrzedne_miejsca_zlecen) { double cmax = 0; double c = 0; Wspolrzedne lastCity = _startPos; foreach (int x in _current) { if (x != 0) { c += lastCity.getDistance(wspolrzedne_miejsca_zlecen[x - 1]) / _sredniaPredkosc; lastCity = wspolrzedne_miejsca_zlecen[x - 1]; c += czas_zlecen[x - 1]; //trial } else //if (x == 0) { c += lastCity.getDistance(_endPos) / _sredniaPredkosc; if (c > cmax) { cmax = c; } c = 0; lastCity = _startPos; } } return(cmax); }
public SA(int iloscSerwisow, int iloscSerwisantow, string miastoFirmy = "Łódź") { ObslugaBazy ob = new ObslugaBazy(); _startPos = ob.getWspolrzedne(miastoFirmy); _endPos = _startPos; _bestTime = -1; _T = _Tmax; _iloscSerwisantow = iloscSerwisantow; _iloscSerwisow = iloscSerwisow; _current = new int[_iloscSerwisow + _iloscSerwisantow]; _best = new int[_iloscSerwisantow + _iloscSerwisow]; _startPositionID = new int[_iloscSerwisantow]; _endPositionID = new int[_iloscSerwisantow]; int sredniaDlugosc = (_iloscSerwisow + _iloscSerwisantow) / _iloscSerwisantow; int iloscDoUstalenia = _iloscSerwisow; int iter = 0; int iloscBezrobotnychSerwisantow = _iloscSerwisantow; _startPositionID[0] = 0; while (iloscDoUstalenia > 0) { int copyIloscDoUstalenia = iloscDoUstalenia; for (int i = 0; i < copyIloscDoUstalenia / iloscBezrobotnychSerwisantow; i++) { iloscDoUstalenia--; _current[iter] = _iloscSerwisow - iloscDoUstalenia; iter++; } _current[iter] = 0; if (iloscBezrobotnychSerwisantow > 0) { _endPositionID[_iloscSerwisantow - iloscBezrobotnychSerwisantow] = iter; } iter++; if (iloscBezrobotnychSerwisantow > 1) { _startPositionID[1 + _iloscSerwisantow - iloscBezrobotnychSerwisantow] = iter; } iloscBezrobotnychSerwisantow--; } for (int it = 0; it < _current.Length; it++) { _best[it] = _current[it]; } _endPositionID[_iloscSerwisantow - 1] = iter - 1; }
public double getDistance(Wspolrzedne w2) { double distance = 111.95 * 180 / Math.PI * Math.Acos((Math.Sin(szerokosc * Math.PI / 180.0) * Math.Sin(w2.szerokosc * Math.PI / 180.0)) + (Math.Cos(szerokosc * Math.PI / 180.0) * Math.Cos(w2.szerokosc * Math.PI / 180.0) * Math.Cos((w2.dlugosc - dlugosc) * Math.PI / 180.0))); return(distance); }