private (List <TechnicalObject>, List <RepairShop>) SetupInitialStates()
        {
            technicalObjects = _model.TechnicalObjects.Select(to => new TechnicalObject
            {
                Intensity    = to.Intensity,
                CurrentState = new WorkingTechnicalObjectState {
                    TimeToBreak = ExponentialValueGenerator.Get(to.Intensity)
                }
            }).ToList();

            repairShops = new List <RepairShop>();
            for (int i = 0; i < _model.RepairShops.Count(); i++)
            {
                if (_currentRepairStations[i] > 0)
                {
                    //добавляємо машини від усіх станцій
                    for (int j = 0; j < _currentRepairStations[i]; j++)
                    {
                        repairShops.Add(new RepairShop
                        {
                            RepairStationNumber = i,
                            CurrentState        = new OnStationRepairShopState()
                        });
                    }
                }
            }

            return(technicalObjects, repairShops);
        }
        private (List <int>, List <int>) ProcessRepairEnd(int minimalRepairShopIndex, decimal timeStep)
        {
            var repairShop = repairShops[minimalRepairShopIndex];

            var technicalObjectIndex       = ((RepairingObjectRepairShopState)repairShop.CurrentState).ObjectToRepairIndex;
            var technicalObject            = technicalObjects[technicalObjectIndex];
            var brokenTechnicalObjectState = (BrokenTechnicalObjectState)technicalObject.CurrentState;

            // ReSharper disable once PossibleInvalidOperationException
            idleTimes.Add(time + timeStep - brokenTechnicalObjectState.IdleTimeStamp.Value);
            brokenTechnicalObjectState.IdleTimeStamp = null;

            technicalObject.CurrentState = new WorkingTechnicalObjectState
            {
                TimeToBreak = ExponentialValueGenerator.Get(technicalObject.Intensity)
            };

            var newBrokenTechnicalObjectIndex = GetBrokenTechnicalObjectIndexFromQueue();

            //якщо є зламані об'єкти, то отримуємо найперший із них
            if (newBrokenTechnicalObjectIndex >= 0)
            {
                var newBrokenTechnicalObject = technicalObjects[newBrokenTechnicalObjectIndex];
                // ReSharper disable once PossibleInvalidOperationException
                confirmationDelayTimes.Add(time + timeStep - ((BrokenTechnicalObjectState)newBrokenTechnicalObject.CurrentState).ConfirmationDelayTimeStamp.Value);
                ((BrokenTechnicalObjectState)newBrokenTechnicalObject.CurrentState).IdleTimeStamp = time + timeStep;

                repairShop.CurrentState = new GoToObjectRepairShopState
                {
                    ObjectToArriveIndex = newBrokenTechnicalObjectIndex,
                    TimeLeft            = _distanceMatrix.Matrix[technicalObjectIndex, newBrokenTechnicalObjectIndex] / _model.MachineSpeed
                };
            }
            else //їдемо на базу
            {
                repairShop.CurrentState = new BackToStationRepairShopState
                {
                    LastRepairedObjectIndex = technicalObjectIndex,
                    TimeLeft = _distanceMatrix.Matrix[_distanceMatrix.TechnicalObjectsCount + repairShop.RepairStationNumber, technicalObjectIndex] / _model.MachineSpeed
                };
            }

            return(new List <int> {
                technicalObjectIndex
            }, new List <int> {
                minimalRepairShopIndex
            });
        }