Ejemplo n.º 1
0
        /// <summary>
        /// Call this method for a single run without simulation.
        /// </summary>
        /// <param name="task"></param>
        /// <param name="simulationId"></param>
        /// <returns></returns>
        public async Task InitializeMrp(MrpTask task, int simulationId)
        {
            await Task.Run(async() =>
            {
                _messageHub.SendToAllClients("Prepare InMemory Tables...", MessageType.info);
                rebuildNets        = new RebuildNets(_context);
                capacityScheduling = new CapacityScheduling(_context);
                _context           = InMemoryContext.CreateInMemoryContext();
                InMemoryContext.LoadData(_evaluationContext, _context);
                await PrepareSimulationContext();
                var simConfig = _context.SimulationConfigurations.Single(x => x.Id == simulationId);
                await OrderGenerator.GenerateOrders(_context, simConfig, simulationId);
                var simulationNumber = _context.GetSimulationNumber(simulationId, SimulationType.Central);
                //call initial central MRP-run
                await _processMrp.CreateAndProcessOrderDemand(task, _context, simulationId, _evaluationContext);
                if (task == MrpTask.Backward || task == MrpTask.Forward || task == MrpTask.GifflerThompson)
                {
                    var list = _context.ProductionOrderWorkSchedules.Select(schedule => new PowsSimulationItem(_context)
                    {
                        End                           = (task == MrpTask.Backward) ? schedule.EndBackward : (task == MrpTask.Forward) ? schedule.EndForward : schedule.End,
                        Start                         = (task == MrpTask.Backward) ? schedule.StartBackward : (task == MrpTask.Forward) ? schedule.StartForward : schedule.Start,
                        ProductionOrderId             = schedule.ProductionOrderId,
                        ProductionOrderWorkScheduleId = schedule.Id,
                        SimulationId                  = simulationId
                    })
                               .ToList();
                    _evaluationContext.SaveChanges();
                    FillSimulationWorkSchedules(list, simulationId, simulationNumber, task);
                }

                SimulationType simType = SimulationType.Central;
                switch (task)
                {
                case MrpTask.Forward:
                    simType = SimulationType.ForwardPlanning;
                    break;

                case MrpTask.Backward:
                    simType = SimulationType.BackwardPlanning;
                    break;
                }
                CopyResults.ExtractSimulationOrders(_context, _evaluationContext, simulationId, simulationNumber, simType);
                _messageHub.EndScheduler();
            });
        }
        public async Task RunAkkaSimulation(Configuration configuration)
        {
            _configuration = configuration;
            _messageHub.SendToAllClients(msg: "Prepare in Memory model from DB for Simulation: "
                                         + _configuration.GetOption <SimulationId>().Value.ToString()
                                         , msgType: MessageType.info);
            //In-memory database only exists while the connection is open
            //var _inMemory = InMemoryContext.CreateInMemoryContext();
            // InMemoryContext.LoadData(source: _context, target: _inMemory);
            //MasterDBInitializerSimple.DbInitialize(_inMemory);

            _messageHub.SendToAllClients(msg: "Prepare Simulation", msgType: MessageType.info);

            _agentSimulation = new AgentSimulation(DBContext: _context
                                                   , messageHub: _messageHub); // Defines the status output

            var simulation = _agentSimulation.InitializeSimulation(configuration: _configuration).Result;

            SimulationContext = simulation.SimulationContext;


            if (simulation.IsReady())
            {
                _messageHub.SendToAllClients(msg: "Start Simulation ...", msgType: MessageType.info);
                // Start simulation
                var sim = simulation.RunAsync();

                AgentSimulation.Continuation(inbox: _agentSimulation.SimulationConfig.Inbox
                                             , sim: simulation
                                             , collectors: new List <IActorRef> {
                    _agentSimulation.StorageCollector
                    , _agentSimulation.WorkCollector
                    , _agentSimulation.ContractCollector
                });
                await sim;
            }
            _messageHub.EndScheduler();
            _messageHub.EndSimulation(msg: "Simulation Completed."
                                      , simId: _configuration.GetOption <SimulationId>().Value.ToString()
                                      , simNumber: _configuration.GetOption <SimulationNumber>().Value.ToString());
            return;
        }
Ejemplo n.º 3
0
        public async Task RunSimulation(int simulationId, int simulationNumber)
        {
            await _agentSimulation.RunSim(simulationId, simulationNumber);

            _messageHub.SendToAllClients("Number of involved Agents: " + Agent.AgentCounter.Count, MessageType.success);
            _messageHub.SendToAllClients("Number of instructions send: " + Agent.InstructionCounter, MessageType.success);


            var itemlist = from val in Agent.AgentStatistics
                           group val by new { val.AgentType } into grouped
                select new { Agent = grouped.First().AgentType, ProcessingTime = grouped.Sum(x => x.ProcessingTime), Count = grouped.Count().ToString() };

            foreach (var item in itemlist)
            {
                _messageHub.SendToAllClients(" Agent (" + Agent.AgentCounter.Count(x => x == item.Agent) + "): " + item.Agent + " -> Runtime: " + item.ProcessingTime + " Milliseconds with " + item.Count + " Instructions Processed", MessageType.warning);
            }

            //var jobs = itemlist.Count(x => x.)
            var jobs = AgentStatistic.Log.Count(x => x.Contains("Finished Work with"));

            _messageHub.SendToAllClients(jobs + " Jobs processed in " + (Agent.AgentStatistics.Max(x => x.Time) - 1) + " minutes", MessageType.success);
            _messageHub.SendToAllClients("Simulation Finished");
            _messageHub.EndScheduler();
        }