/// <summary> /// Updates the element to the specified time. /// </summary> /// <param name="lastTime">The time before the update.</param> /// <param name="currentTime">The time to update to.</param> public override void Update(double lastTime, double currentTime) { // Check whether a change has to happen if (currentTime > _nextChange) { // Handle pod storage managers if (_config.ExchangePodStorage) { // Select next manager PodStorageMethodType nextPodManagerType = _podManagers[Instance.Randomizer.NextInt(_podManagers.Count)]; PodStorageManager newPodStorageManager; // Prepare it switch (nextPodManagerType) { case PodStorageMethodType.Nearest: { Instance.ControllerConfig.PodStorageConfig = new NearestPodStorageConfiguration(); newPodStorageManager = new NearestPodStorageManager(Instance); } break; case PodStorageMethodType.StationBased: { Instance.ControllerConfig.PodStorageConfig = new StationBasedPodStorageConfiguration(); newPodStorageManager = new StationBasedPodStorageManager(Instance); } break; case PodStorageMethodType.Random: { Instance.ControllerConfig.PodStorageConfig = new RandomPodStorageConfiguration(); newPodStorageManager = new RandomPodStorageManager(Instance); } break; case PodStorageMethodType.Turnover: { Instance.ControllerConfig.PodStorageConfig = new TurnoverPodStorageConfiguration(); newPodStorageManager = new TurnoverPodStorageManager(Instance); } break; default: throw new ArgumentException("Unknown pod storage manager: " + nextPodManagerType); } // Change it Instance.Controller.ExchangePodStorageManager(newPodStorageManager); } // Set next change event _nextChange += _config.ChangeTimeout; } }
/// <summary> /// Updates the element to the specified time. /// </summary> /// <param name="lastTime">The time before the update.</param> /// <param name="currentTime">The time to update to.</param> public override void Update(double lastTime, double currentTime) { // Check whether a change has to happen if (_podStorageManagerQueue.Any() && currentTime > TranslateTime(_podStorageManagerQueue.First().Key)) { // --> Handle pod storage managers // Get next manager PodStorageMethodType nextPodManagerType = _podStorageManagerQueue.Dequeue().Value; PodStorageManager newPodStorageManager; // Prepare it switch (nextPodManagerType) { case PodStorageMethodType.Nearest: { Instance.ControllerConfig.PodStorageConfig = new NearestPodStorageConfiguration(); newPodStorageManager = new NearestPodStorageManager(Instance); } break; case PodStorageMethodType.StationBased: { Instance.ControllerConfig.PodStorageConfig = new StationBasedPodStorageConfiguration(); newPodStorageManager = new StationBasedPodStorageManager(Instance); } break; case PodStorageMethodType.Random: { Instance.ControllerConfig.PodStorageConfig = new RandomPodStorageConfiguration(); newPodStorageManager = new RandomPodStorageManager(Instance); } break; case PodStorageMethodType.Turnover: { Instance.ControllerConfig.PodStorageConfig = new TurnoverPodStorageConfiguration(); newPodStorageManager = new TurnoverPodStorageManager(Instance); } break; case PodStorageMethodType.Fixed: throw new ArgumentException("Cannot switch to fixed mechanism, because the system is already running!"); default: throw new ArgumentException("Unknown pod storage manager: " + nextPodManagerType); } // Change it Instance.Controller.ExchangePodStorageManager(newPodStorageManager); } }
/// <summary> /// Creates a new controller instance. /// </summary> /// <param name="instance">The instance this controller belongs to.</param> public Controller(Instance instance) { Instance = instance; // Init path manager switch (instance.ControllerConfig.PathPlanningConfig.GetMethodType()) { case PathPlanningMethodType.Simple: PathManager = null; break; case PathPlanningMethodType.Dummy: PathManager = new DummyPathManager(instance); break; case PathPlanningMethodType.WHCAvStar: PathManager = new WHCAvStarPathManager(instance); break; case PathPlanningMethodType.FAR: PathManager = new FARPathManager(instance); break; case PathPlanningMethodType.BCP: PathManager = new BCPPathManager(instance); break; case PathPlanningMethodType.CBS: PathManager = new CBSPathManager(instance); break; case PathPlanningMethodType.OD_ID: PathManager = new ODIDPathManager(instance); break; case PathPlanningMethodType.WHCAnStar: PathManager = new WHCAnStarPathManager(instance); break; case PathPlanningMethodType.PAS: PathManager = new PASPathManager(instance); break; default: throw new ArgumentException("Unknown path planning engine: " + instance.ControllerConfig.PathPlanningConfig.GetMethodType()); } // Init bot manager switch (instance.ControllerConfig.TaskAllocationConfig.GetMethodType()) { case TaskAllocationMethodType.Dummy: BotManager = new DummyBotManager(instance); break; case TaskAllocationMethodType.BruteForce: BotManager = new BruteForceBotManager(instance); break; case TaskAllocationMethodType.Random: BotManager = new RandomBotManager(instance); break; case TaskAllocationMethodType.Balanced: BotManager = new BalancedBotManager(instance); break; case TaskAllocationMethodType.Swarm: BotManager = new SwarmBotManager(instance); break; case TaskAllocationMethodType.ConstantRatio: BotManager = new ConstantRatioBotManager(instance); break; case TaskAllocationMethodType.Concept: BotManager = new ConceptBotManager(instance); break; default: throw new ArgumentException("Unknown bot manager: " + instance.ControllerConfig.TaskAllocationConfig.GetMethodType()); } // Init station manager switch (instance.ControllerConfig.StationActivationConfig.GetMethodType()) { case StationActivationMethodType.ActivateAll: StationManager = new ActivateAllStationManager(instance); break; case StationActivationMethodType.BacklogThreshold: StationManager = new BacklogThresholdStationManager(instance); break; case StationActivationMethodType.ConstantRatio: StationManager = new ConstantRatioStationManager(instance); break; case StationActivationMethodType.WorkShift: StationManager = new WorkShiftStationActivationManager(instance); break; default: throw new ArgumentException("Unknown station manager: " + instance.ControllerConfig.StationActivationConfig.GetMethodType()); } // Init item storage manager switch (instance.ControllerConfig.ItemStorageConfig.GetMethodType()) { case ItemStorageMethodType.Dummy: StorageManager = new DummyStorageManager(instance); break; case ItemStorageMethodType.Random: StorageManager = new RandomStorageManager(instance); break; case ItemStorageMethodType.Correlative: StorageManager = new CorrelativeStorageManager(instance); break; case ItemStorageMethodType.Turnover: StorageManager = new TurnoverStorageManager(instance); break; case ItemStorageMethodType.ClosestLocation: StorageManager = new ClosestLocationStorageManager(instance); break; case ItemStorageMethodType.Reactive: StorageManager = new ReactiveStorageManager(instance); break; case ItemStorageMethodType.Emptiest: StorageManager = new EmptiestStorageManager(instance); break; case ItemStorageMethodType.LeastDemand: StorageManager = new LeastDemandStorageManager(instance); break; default: throw new ArgumentException("Unknown storage manager: " + instance.ControllerConfig.ItemStorageConfig.GetMethodType()); } // Init pod storage manager switch (instance.ControllerConfig.PodStorageConfig.GetMethodType()) { case PodStorageMethodType.Dummy: PodStorageManager = new DummyPodStorageManager(instance); break; case PodStorageMethodType.Fixed: PodStorageManager = new FixedPodStorageManager(instance); break; case PodStorageMethodType.Nearest: PodStorageManager = new NearestPodStorageManager(instance); break; case PodStorageMethodType.StationBased: PodStorageManager = new StationBasedPodStorageManager(instance); break; case PodStorageMethodType.Cache: PodStorageManager = new CachePodStorageManager(instance); break; case PodStorageMethodType.Utility: PodStorageManager = new UtilityPodStorageManager(instance); break; case PodStorageMethodType.Random: PodStorageManager = new RandomPodStorageManager(instance); break; case PodStorageMethodType.Turnover: PodStorageManager = new TurnoverPodStorageManager(instance); break; default: throw new ArgumentException("Unknown pod manager: " + instance.ControllerConfig.PodStorageConfig.GetMethodType()); } // Init repositioning manager switch (instance.ControllerConfig.RepositioningConfig.GetMethodType()) { case RepositioningMethodType.Dummy: RepositioningManager = new DummyRepositioningManager(instance); break; case RepositioningMethodType.Cache: RepositioningManager = new CacheRepositioningManager(instance); break; case RepositioningMethodType.CacheDropoff: RepositioningManager = new CacheDropoffRepositioningManager(instance); break; case RepositioningMethodType.Utility: RepositioningManager = new UtilityRepositioningManager(instance); break; case RepositioningMethodType.Concept: RepositioningManager = new ConceptRepositioningManager(instance); break; default: throw new ArgumentException("Unknown repositioning manager: " + instance.ControllerConfig.RepositioningConfig.GetMethodType()); } // Init order batching manager switch (instance.ControllerConfig.OrderBatchingConfig.GetMethodType()) { case OrderBatchingMethodType.Greedy: OrderManager = new GreedyOrderManager(instance); break; case OrderBatchingMethodType.Default: OrderManager = new DefaultOrderManager(instance); break; case OrderBatchingMethodType.Random: OrderManager = new RandomOrderManager(instance); break; case OrderBatchingMethodType.Workload: OrderManager = new WorkloadOrderManager(instance); break; case OrderBatchingMethodType.Related: OrderManager = new RelatedOrderManager(instance); break; case OrderBatchingMethodType.NearBestPod: OrderManager = new NearBestPodOrderManager(instance); break; case OrderBatchingMethodType.Foresight: OrderManager = new ForesightOrderManager(instance); break; case OrderBatchingMethodType.PodMatching: OrderManager = new PodMatchingOrderManager(instance); break; case OrderBatchingMethodType.LinesInCommon: OrderManager = new LinesInCommonOrderManager(instance); break; case OrderBatchingMethodType.Queue: OrderManager = new QueueOrderManager(instance); break; default: throw new ArgumentException("Unknown order manager: " + instance.ControllerConfig.OrderBatchingConfig.GetMethodType()); } // Init replenishment batching manger switch (instance.ControllerConfig.ReplenishmentBatchingConfig.GetMethodType()) { case ReplenishmentBatchingMethodType.Random: BundleManager = new RandomBundleManager(instance); break; case ReplenishmentBatchingMethodType.SamePod: BundleManager = new SamePodBundleManager(instance); break; default: throw new ArgumentException("Unknown replenishment manager: " + instance.ControllerConfig.ReplenishmentBatchingConfig.GetMethodType()); } // Init meta method manager switch (instance.ControllerConfig.MethodManagementConfig.GetMethodType()) { case MethodManagementType.NoChange: MethodManager = new NoChangeMethodManager(instance); break; case MethodManagementType.Random: MethodManager = new RandomMethodManager(instance); break; case MethodManagementType.Scheduled: MethodManager = new ScheduleMethodManager(instance); break; default: throw new ArgumentException("Unknown method manager: " + instance.ControllerConfig.MethodManagementConfig.GetMethodType()); } // Init allocator Allocator = new Allocator(instance); }