public override string ToString() { var result = ""; result += $"\n Max branching {SimulatedAnnealingMaxBranching}"; if (Chains != null) { for (int i = 0; i < Chains.Count; i++) { var chain = Chains[i]; var configuration = SimulatedAnnealingConfiguration.GetConfiguration(i); result += $"\n Chain {i} [{string.Join(",", chain.Nodes)}] c {configuration.Cycles} tpc {configuration.TrialsPerCycle} miws {configuration.MaxIterationsWithoutSuccess} ms2f {configuration.MaxStageTwoFailures}"; } } else if (SimulatedAnnealingConfiguration != null) { var list = SimulatedAnnealingConfiguration.GetAllConfigurations(); for (var i = 0; i < list.Count; i++) { var configuration = list[i]; result += $"\n Chain {i} [] c {configuration.Cycles} tpc {configuration.TrialsPerCycle} miws {configuration.MaxIterationsWithoutSuccess} ms2f {configuration.MaxStageTwoFailures}"; } } return(result); }
protected IMutation <TConfiguration> GetFixedStrategy(TConfiguration configuration, IGeneratorEvaluation <TGeneratorStats> data, int numberOfIterations) { var oldConfiguration = configuration.SimulatedAnnealingConfiguration.GetConfiguration(0); var newConfiguration = new SimulatedAnnealingConfiguration(oldConfiguration.Cycles, oldConfiguration.TrialsPerCycle, numberOfIterations, oldConfiguration.MaxStageTwoFailures); return(new MaxIterationsMutation <TConfiguration>( 5, new SimulatedAnnealingConfigurationProvider(newConfiguration), MaxIterationsStrategy.Fixed, numberOfIterations, numberOfIterations )); }
public DungeonGeneratorConfiguration <TNode> SmartClone() { return(new DungeonGeneratorConfiguration <TNode>() { RoomsCanTouch = RoomsCanTouch, EarlyStopIfIterationsExceeded = EarlyStopIfIterationsExceeded, EarlyStopIfTimeExceeded = EarlyStopIfTimeExceeded, RepeatModeOverride = RepeatModeOverride, ThrowIfRepeatModeNotSatisfied = ThrowIfRepeatModeNotSatisfied, ChainDecompositionConfiguration = ChainDecompositionConfiguration.SmartClone(), Chains = Chains?.Select(x => new Chain <TNode>(x.Nodes.ToList(), x.Number)).ToList(), SimulatedAnnealingConfiguration = SimulatedAnnealingConfiguration.SmartClone(), SimulatedAnnealingMaxBranching = SimulatedAnnealingMaxBranching, }); }
public TConfiguration Apply(TConfiguration configuration) { var newConfigurations = new List <SimulatedAnnealingConfiguration>(); for (int i = 0; i < Chains.Count; i++) { newConfigurations.Add(SimulatedAnnealingConfiguration.GetDefaultConfiguration()); } var copy = configuration.SmartClone(); copy.Chains = Chains; copy.SimulatedAnnealingConfiguration = new SimulatedAnnealingConfigurationProvider(newConfigurations); return(copy); }
public new GraphBasedGeneratorConfiguration <TNode> SmartClone() { return(new GraphBasedGeneratorConfiguration <TNode>() { RoomsCanTouch = RoomsCanTouch, EarlyStopIfIterationsExceeded = EarlyStopIfIterationsExceeded, EarlyStopIfTimeExceeded = EarlyStopIfTimeExceeded, RepeatModeOverride = RoomTemplateRepeatMode.NoImmediate, ThrowIfRepeatModeNotSatisfied = ThrowIfRepeatModeNotSatisfied, ChainDecompositionConfiguration = ChainDecompositionConfiguration.SmartClone(), Chains = Chains?.Select(x => new Chain <TNode>(x.Nodes.ToList(), x.Number)).ToList(), SimulatedAnnealingConfiguration = SimulatedAnnealingConfiguration.SmartClone(), SimulatedAnnealingMaxBranching = SimulatedAnnealingMaxBranching, OptimizeCorridorConstraints = OptimizeCorridorConstraints, }); }
protected IMutation <TConfiguration> GetAggressiveStrategy(TConfiguration configuration, IGeneratorEvaluation <TGeneratorStats> data, double minValue, double multiplier, int priority) { var worst10Percent = data.GetAverageStatistics(new DataSplit(0.9, 1)); var newConfigurations = new List <SimulatedAnnealingConfiguration>(); for (int i = 0; i < worst10Percent.ChainsStats.Count; i++) { var oldConfiguration = configuration.SimulatedAnnealingConfiguration.GetConfiguration(i); var averageIterationsOnSuccess = Math.Max(minValue, multiplier * worst10Percent.ChainsStats[i].AverageIterationsOnSuccess); var newConfiguration = new SimulatedAnnealingConfiguration(oldConfiguration.Cycles, oldConfiguration.TrialsPerCycle, (int)averageIterationsOnSuccess, oldConfiguration.MaxStageTwoFailures); newConfigurations.Add(newConfiguration); } return(new MaxIterationsMutation <TConfiguration>( priority, new SimulatedAnnealingConfigurationProvider(newConfigurations), MaxIterationsStrategy.Aggressive, minValue, multiplier )); }
private IMutation <TConfiguration> GetConservativeStrategy(TConfiguration configuration, IGeneratorEvaluation <TGeneratorStats> data, double minValue, double multiplier) { var averageAll = data.GetAverageStatistics(new DataSplit(0, 1)); var newConfigurations = new List <SimulatedAnnealingConfiguration>(); for (int i = 0; i < averageAll.ChainsStats.Count; i++) { var oldConfiguration = configuration.SimulatedAnnealingConfiguration.GetConfiguration(i); var maxStageTwoFailuresOnSuccess = Math.Max(minValue, multiplier * averageAll.ChainsStats[i].MaxStageTwoFailuresOnSuccess); var newConfiguration = new SimulatedAnnealingConfiguration(oldConfiguration.Cycles, oldConfiguration.TrialsPerCycle, oldConfiguration.MaxIterationsWithoutSuccess, (int)maxStageTwoFailuresOnSuccess); newConfigurations.Add(newConfiguration); } return(new MaxStageTwoFailuresMutation <TConfiguration>( 5, new SimulatedAnnealingConfigurationProvider(newConfigurations), MaxStageTwoFailuresStrategy.Conservative, minValue, multiplier )); }
// TODO: should configuration be null by default? public SimulatedAnnealingEvolver(IChainBasedLayoutOperations <TLayout, TNode> layoutOperations, SimulatedAnnealingConfiguration configuration = null, bool addNodesGreedilyBeforeEvolve = false) { LayoutOperations = layoutOperations ?? throw new ArgumentNullException(nameof(layoutOperations)); Configuration = configuration ?? SimulatedAnnealingConfiguration.GetDefaultConfiguration(); this.addNodesGreedilyBeforeEvolve = addNodesGreedilyBeforeEvolve; }
public override int GetHashCode() { unchecked { var hashCode = RoomsCanTouch.GetHashCode(); hashCode = (hashCode * 397) ^ EarlyStopIfIterationsExceeded.GetHashCode(); hashCode = (hashCode * 397) ^ EarlyStopIfTimeExceeded.GetHashCode(); hashCode = (hashCode * 397) ^ RepeatModeOverride.GetHashCode(); hashCode = (hashCode * 397) ^ ThrowIfRepeatModeNotSatisfied.GetHashCode(); hashCode = (hashCode * 397) ^ (ChainDecompositionConfiguration != null ? ChainDecompositionConfiguration.GetHashCode() : 0); hashCode = (hashCode * 397) ^ (SimulatedAnnealingConfiguration != null ? SimulatedAnnealingConfiguration.GetHashCode() : 0); hashCode = (hashCode * 397) ^ SimulatedAnnealingMaxBranching; return(hashCode); } }