Пример #1
0
        public Form1()
        {
            InitializeComponent();
            rnd2.Lambda = 40;


            List <Station>     StationList     = new List <Station>();
            List <FutureEvent> FutureEventList = new List <FutureEvent>();
            int MissRequestCount   = 0;
            int HitRequestCount    = 0;
            int RebalancingCount   = 0;
            int NumberOfBikesMoved = 0;

            // For each station in the list creat events and add new events to the FutureEventList
            foreach (Station s in StationList)
            {
                double GlobalTime = 0;
                Troschuetz.Random.Distributions.Discrete.PoissonDistribution rnd = new Troschuetz.Random.Distributions.Discrete.PoissonDistribution();

                for (int t = 0; t < 24; t++)
                {
                    GlobalTime += rnd.NextDouble();

                    //?? how mix request matrix with time ?
                    FutureEventList.Add(new FutureEvent(s, t, EventType.CustomerRequest)); // ??? how add location of user ?
                }
            }


            FutureEventList.Sort();

            for (int i = 0; i < FutureEventList.Count; i++)
            {
                if (FutureEventList[i].EventType == EventType.CustomerRequest)
                {
                    FutureEvent e = new FutureEvent();
                    e.Station   = FutureEventList[i].Station;
                    e.StartTime = FutureEventList[i].StartTime;

                    if (FutureEventList[i].Station.AvailebleBikes > 0)
                    {
                        e.EventType = EventType.BikeRentStart;
                    }
                    else
                    {
                        MissRequestCount++;
                    }



                    FutureEventList.Add(e);
                }
                else if (FutureEventList[i].EventType == EventType.BikeRentStart)
                {
                    // If there is no Available Bike then Add Miss Count And go to next event
                    if (FutureEventList[i].Station.AvailebleBikes < 0)
                    {
                        MissRequestCount++;
                        continue;
                    }

                    HitRequestCount++;

                    FutureEventList[i].Station.AvailebleBikes -= 1;

                    FutureEvent e = new FutureEvent();
                    e.EventType = EventType.BikeRentFinish;

                    e.Station   = new Station(); // #### Next Station Should be determined in here
                    e.StartTime = DateTime.Now;  // #### distance and duration to next station Should be determined in here
                    e.Distance  = 0;             // #### distance and duration to next station Should be determined in here

                    FutureEventList.Add(e);

                    if (FutureEventList[i].Station.AvailebleBikes <= 0)
                    {
                        FutureEvent re = new FutureEvent();
                        re.EventType = EventType.Rebalancing;
                        re.Station   = FutureEventList[i].Station;
                        re.StartTime = FutureEventList[i].StartTime;
                        FutureEventList.Add(re);
                    }
                }
                else if (FutureEventList[i].EventType == EventType.BikeRentFinish)
                {
                    FutureEventList[i].Station.AvailebleBikes += 1;

                    if (FutureEventList[i].Station.AvailebleBikes >= FutureEventList[i].Station.Capasity)
                    {
                        FutureEvent re = new FutureEvent();
                        re.EventType = EventType.Rebalancing;
                        re.Station   = FutureEventList[i].Station;
                        re.StartTime = FutureEventList[i].StartTime;
                        FutureEventList.Add(re);
                    }
                }
                else if (FutureEventList[i].EventType == EventType.Rebalancing)
                {
                    //?? Reblancing To which stations should be done? one station or multiple station ?
                    //e.StartTime = DateTime.Now;  // #### distance and duration to next station Should be determined in here
                    //e.Distance = 0;  // #### distance and duration to next station Should be determined in here

                    RebalancingCount++;
                    NumberOfBikesMoved++;

                    //FutureEvent e = new FutureEvent();
                    //e.EventType = EventType.RebalancingEnd;
                    //int duration = 0;
                    //float distance = 0;

                    //e.Distance = distance;
                    //e.Duration = duration;
                    //e.StartTime = FutureEventList[i].StartTime.AddTicks(duration);
                    //FutureEventList.Add(e);
                }
            }
        }