예제 #1
0
        public override void DoStep()
        {
            //проверяем прибыл ли транспорт
            if (!IsIOReady)
            {
                return;
            }
            output_time_helper += Scenario.STEP_TIME_MS;
            input_time_helper += Scenario.STEP_TIME_MS;
            Random rand = new Random();
            //Добавляем Агентов
            while (output_time_helper > OutputTimeMs / OutputPoints.Count)
            {
                if (output_count > 0)
                {
                    AgentBase agent = Scenario.GetRandomAgentTemplateFromGroup(PassengersGroup.AgentTemplateList, PassengersGroup.ID, scenario);
                    agent.WayPointsList.Insert(0, OutputPoints[rand.Next(0, OutputPoints.Count)]);
                    scenario.agentsList.Add(agent);
                    add_count++;
                    output_count--;
                    IOAgent.CurrentAgentCount--;
                }
                output_time_helper -= OutputTimeMs / OutputPoints.Count;
            }
            //Если для входа и выхода одна и та же дверь, то сначала выходят все
            if (output_count > 0)
            {
                return;
            }

            //Поглощаем Агентов
            while (input_time_helper > InputTimeMs / InputPoints.Count)
            {
                //Если есть место, подходящий маршрут, агенты в очереди и не истекло время.
                if (IOAgent.CurrentAgentCount < IOAgent.MaxCapasity && max_input_count > 0 && agentsQueue.Count > 0)
                {
                    int id = base.RemoveFirstAgentFromQueue();
                    base.DeleteAgentFromService(id);
                    foreach (var agent in scenario.agentsList.FindAll(delegate(AgentBase ab) { return ab.ID == id; }))
                    {
                        agent.Remove();
                    }
                    IOAgent.CurrentAgentCount++;
                    max_input_count--;
                }
                input_time_helper -= InputTimeMs / InputPoints.Count;
            }
            if ((scenario.currentTime - startTime).TotalMilliseconds > MinServedTime &&
                ((scenario.currentTime - startTime).TotalMilliseconds > MaxServedTime ||
                ((IOAgent.CurrentAgentCount < IOAgent.MaxCapasity || max_input_count > 0) && output_count == 0)))
            {
                CloseInputPoints();
                IOAgent.Go();
                IOAgent = null;
            }
        }
예제 #2
0
        public void OpenInputPoints(int agentID)
        {
            if (IOAgent != null)
            {
                CloseInputPoints();
                IOAgent.Go();
            }
            this.IOAgent = (VehicleAgentBase)scenario.agentsList.Find(delegate(AgentBase ab) { return ab.ID == agentID; });
            IOAgent.CurrentAgentCount = PassengersGroup.AgentDistribution[Convert.ToInt32(scenario.currentTime.TotalMinutes)] * IOAgent.MaxCapasity / 100;
            IOAgent.InputFactor = 1.0;
            IOAgent.OutputFactor = 1.0;
            startTime = scenario.currentTime;
            if (IOAgent != null)
            {
                output_count = Convert.ToInt32(IOAgent.OutputFactor * IOAgent.CurrentAgentCount);

                //max_input_count = agentsList.Count;
                max_input_count = IOAgent.MaxCapasity - IOAgent.CurrentAgentCount + output_count;
            }
            for (int i = 0; i < InputPoints.Count; i++)
            {
                scenario.map.SetMapFrameFlag(MapOld.CellState.Input, false, InputPoints[i].X, InputPoints[i].Y, InputPoints[i].PointWidth, InputPoints[i].PointHeight);
            }
            IsIOReady = true;
            output_time_helper = 0;
            input_time_helper = 0;
        }