예제 #1
0
        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);
        }
예제 #2
0
        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;
        }
예제 #3
0
        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);
        }