Exemplo n.º 1
0
        public override bool Try(SimulatedAnnealingSolver solverInstance, ref SatConfiguration currentConfiguration)
        {
            SatConfiguration triedConfiguration;

            double randomChoice = random.NextDouble();

            if (randomChoice < randomNeighborProb)
            {
                triedConfiguration = GetRandomNeighbor(solverInstance, currentConfiguration);
            }
            else if (randomChoice < randomNeighborProb + randomNewProb)
            {
                triedConfiguration = SatConfiguration.RandomConfiguration(solverInstance.SatInstance, random);
            }
            else if (randomChoice < randomNeighborProb + randomNewProb + improveScoreProb)
            {
                triedConfiguration = GetBetterScoreNeighbor(solverInstance, currentConfiguration);
            }
            else
            {
                triedConfiguration = GetBetterSatisfiabilityNeighbor(solverInstance, currentConfiguration);
            }

            triedConfiguration.Score = solverInstance.Options.ScoreStrategy.CalculateScore(triedConfiguration, solverInstance);
            if (Accept(triedConfiguration, currentConfiguration, solverInstance.CurrentTemperature))
            {
                currentConfiguration = triedConfiguration;
                return(true);
            }

            return(false);
        }
Exemplo n.º 2
0
        //Performs a random bit-flip
        public bool Try(SimulatedAnnealingSolver solverInstance, ref KnapsackConfiguration currentConfiguration)
        {
            var bitToFlip          = random.Next(0, solverInstance.Instance.ItemCount - 1);
            var triedConfiguration = new KnapsackConfiguration(currentConfiguration);

            triedConfiguration.ItemVector[bitToFlip] = !triedConfiguration.ItemVector[bitToFlip];
            if (triedConfiguration.ItemVector[bitToFlip])
            {
                triedConfiguration.Price  += solverInstance.Instance.Items[bitToFlip].Price;
                triedConfiguration.Weight += solverInstance.Instance.Items[bitToFlip].Weight;
            }
            else
            {
                triedConfiguration.Price  -= solverInstance.Instance.Items[bitToFlip].Price;
                triedConfiguration.Weight -= solverInstance.Instance.Items[bitToFlip].Weight;
            }
            triedConfiguration.Cost = solverInstance.Options.ScoreStrategy.Cost(triedConfiguration, solverInstance);

            if (triedConfiguration.Cost >= currentConfiguration.Cost)
            {
                currentConfiguration = triedConfiguration;
                return(true);
            }

            var delta = triedConfiguration.Cost - currentConfiguration.Cost;

            if (random.NextDouble() < Math.Exp(delta / solverInstance.CurrentTemperature))
            {
                currentConfiguration = triedConfiguration;
                return(true);
            }
            return(false);
        }
 public bool Frozen(SimulatedAnnealingSolver solverInstance)
 {
     if (solverInstance.CurrentTemperature <= solverInstance.Options.MinimalTemperature)
     {
         return(true);
     }
     return(false);
 }
 public bool Frozen(SimulatedAnnealingSolver solverInstance)
 {
     if (solverInstance.CurrentTemperature <= solverInstance.ScaledMinTemperature)
     {
         return(true);
     }
     return(false);
 }
Exemplo n.º 5
0
        private SatConfiguration GetRandomNeighbor(SimulatedAnnealingSolver solverInstance, SatConfiguration currentConfiguration)
        {
            var flipIndex          = random.Next(0, solverInstance.SatInstance.Literals.Count);
            var triedConfiguration = new SatConfiguration(currentConfiguration);

            triedConfiguration.FlipValuation(flipIndex);

            return(triedConfiguration);
        }
        public float CalculateScore(SatConfiguration configuration, SimulatedAnnealingSolver solver)
        {
            //Base score is the optimalization value
            float score = configuration.GetOptimalizationValue();

            //Penalize the score based on the number of unsatisfied clauses
            score -= configuration.NumberOfUnsatisfiedClauses() * solver.Options.PenaltyMultiplier;
            return(score);
        }
Exemplo n.º 7
0
        public void run_szenario(int times, String sz, String s)
        {
            int render_every = 5120; //model evaluations

            //n mal laufen lassen für empirische Auswertung
            //(bei den direkten Heuristiken (greedy,insertion,savings nicht nötig, daher n = 1)
            for (int i = 0; i < times; i++)
            {
                //solange ein Prozess läuft mache nichts!
                while (optimizer_running)
                {
                    Thread.Sleep(5000);
                }

                String problemInstance = File.ReadAllText(sz + ".json");
                model = new MEPModel.MEP();
                model.LoadModelString(problemInstance);
                scenario = sz + "_" + s + "_" + i;
                Console.WriteLine("Starting Szenario:" + scenario);
                //setze Kontext
                model.AllowTripContinuation     = true;
                model.PermutateOptions          = false;
                model.AllowUnprofitableRequests = true;
                model.AvgTravelSpeed            = 400;
                model.HotelCostPerNight         = -100;
                model.HourlyWage          = -60;
                model.MilageAllowance     = -0.1;
                model.RevenuePerDayOnsite = 2000;

                Solver.Solver so = null;
                switch (s)
                {
                case "Greedy":
                    so = new GreedySolver(model);
                    break;

                case "SA":
                    so = new SimulatedAnnealingSolver(model, 10000, 1600, render_every, 64);    //somit maximal 10.000*16 = 160.000 modell evaluationen!
                    break;

                case "GA":
                    so = new GeneticSolver(model, 19, 5120, 5, render_every);     //somit maximal 100 * 1.600 = 160.000 modell evaluationen!
                    break;

                case "Insertion":
                    so = new NearestInsertionSolver(model);
                    break;

                case "Savings":
                    so = new SavingsSolver(model);
                    break;
                }
                start = DateTime.Now;
                Start_Optimizer(so);
            }
        }
Exemplo n.º 8
0
 public override bool Equilibrium(SimulatedAnnealingSolver solverInstance)
 {
     if (loopCount >= solverInstance.Options.BaseEquilibriumSteps * solverInstance.Instance.ItemCount)
     {
         loopCount = 0;
         return(false);
     }
     loopCount++;
     return(true);
 }
Exemplo n.º 9
0
        public int Cost(KnapsackConfiguration configuration, SimulatedAnnealingSolver solver)
        {
            int score = configuration.Price;

            if (configuration.Weight > solver.Instance.KnapsackSize)
            {
                var weightOverrun = configuration.Weight - solver.Instance.KnapsackSize;
                score -= (int)Math.Round(weightOverrun * solver.Options.PenaltyMultiplier);
            }
            return(score);
        }
        public override bool Equilibrium(SimulatedAnnealingSolver solverInstance)
        {
            var N = solverInstance.Options.BaseEquilibriumSteps * solverInstance.Instance.ItemCount;

            if (loopCount >= N * 2 || solverInstance.AcceptedDuringEquilibrium >= N)
            {
                loopCount = 0;
                return(false);
            }
            loopCount++;
            return(true);
        }
Exemplo n.º 11
0
        private void btnRunAsync_Click(object sender, RoutedEventArgs e)
        {
            output_to_file = false;
            tokensource    = new CancellationTokenSource();
            if (model != null && model.Requests.Count > 0)
            {
                btnRunAsync.IsEnabled = false;
                set_model_parameter();
                //clear optimizer Output:
                txtOptimizerOutput.Text = "";

                Solver.Solver s = null;
                if (rbGeneticAlgorithm.IsChecked == true)
                {
                    s = new GeneticSolver(model, Convert.ToInt32(txtGenerations.Text), Convert.ToInt32(txtPopulationSize.Text), Convert.ToInt32(txtMutationProbability.Text), Convert.ToInt32(txtReportProgress.Text));
                }
                if (rbBruteForce.IsChecked == true)
                {
                    if (model.GetNumberOfElements() > 11)
                    {
                        MessageBox.Show("I´m sorry Dave, I`m afraid I can`t do that!");
                    }
                    else
                    {
                        s = new BruteForceSolver(model);
                    }
                }
                if (rbSimulatedAnnealing.IsChecked == true)
                {
                    s = new SimulatedAnnealingSolver(model, Convert.ToInt32(txtStartTemp.Text), Convert.ToInt32(txtSteps.Text), Convert.ToInt32(txtReportProgress.Text), Convert.ToInt32(txtParallelAnnealings.Text));
                }
                if (rbGreedy.IsChecked == true)
                {
                    s = new GreedySolver(model);
                }
                if (rbInsertion.IsChecked == true)
                {
                    s = new NearestInsertionSolver(model);
                }
                if (rbSavings.IsChecked == true)
                {
                    s = new SavingsSolver(model);
                }

                if (s != null)
                {
                    Start_Optimizer(s);
                }
            }
        }
Exemplo n.º 12
0
        private static void RunSimulatedAnnealingForConfiguration(IInstanceProvider instanceProvider,
                                                                  double initTemperature, double frozenTemperature, double coolingCoeficient, int equilibriumCoeficient)
        {
            Console.WriteLine($"Init temperature:       {initTemperature}");
            Console.WriteLine($"Cooling coeficient:     {coolingCoeficient}");
            Console.WriteLine($"Equilibrium coeficient: {equilibriumCoeficient}");

            var exactSolver = new DynamicByPriceSolver();
            var simulatedAnnealingSolver = new SimulatedAnnealingSolver(initTemperature, frozenTemperature, coolingCoeficient, equilibriumCoeficient);

            var runner = new CompareRunner(instanceProvider, exactSolver, simulatedAnnealingSolver);

            runner.Run();
            Console.WriteLine();
        }
Exemplo n.º 13
0
        public float CalculateScore(SatConfiguration configuration, SimulatedAnnealingSolver solver)
        {
            //Base score is the optimalization value
            float score = configuration.GetOptimalizationValue();

            //Make the score negative if it is unsatisfiable
            if (!configuration.IsSatisfiable())
            {
                score -= configuration.Instance.GetSumOfWeights();
            }

            //Penalize the score further based on the number of unsatisfied clauses
            score -= configuration.NumberOfUnsatisfiedClauses() * solver.Options.PenaltyMultiplier;
            return(score);
        }
Exemplo n.º 14
0
        private SatConfiguration GetBetterSatisfiabilityNeighbor(SimulatedAnnealingSolver solverInstance, SatConfiguration currentConfiguration)
        {
            var candidateIndex = currentConfiguration.IndexOfRandomToImproveSatisfiability(random);

            if (candidateIndex > 0)
            {
                var triedConfiguration = new SatConfiguration(currentConfiguration);
                triedConfiguration.FlipValuation(candidateIndex);
                return(triedConfiguration);
            }
            else
            {
                return(GetBetterScoreNeighbor(solverInstance, currentConfiguration));
            }
        }
Exemplo n.º 15
0
        private static void Test1()
        {
            var generator = new RandomInstanceProvider();
            var instance  = generator.GetInstance(25);

            Console.WriteLine(instance.Formula);

            var brutteForceSolver        = new BrutteForceSolver();
            var simulatedAnnealingSolver = new SimulatedAnnealingSolver();

            var solution1 = brutteForceSolver.Solve(instance);
            var solution2 = simulatedAnnealingSolver.Solve(instance);

            Console.WriteLine(solution1);
            Console.WriteLine(solution2);
        }
Exemplo n.º 16
0
        private SatConfiguration GetBetterScoreNeighbor(SimulatedAnnealingSolver solverInstance, SatConfiguration currentConfiguration)
        {
            var triedConfiguration = new SatConfiguration(currentConfiguration);

            var flipIndex = currentConfiguration.IndexOfRandomToImproveScore(random);

            //Nothing to improve (all valuations set to 1), reset the configuration entirely
            if (flipIndex < 0)
            {
                triedConfiguration = SatConfiguration.RandomConfiguration(solverInstance.SatInstance, random);
            }
            else
            {
                triedConfiguration.FlipValuation(flipIndex);
            }
            return(triedConfiguration);
        }
Exemplo n.º 17
0
        //Performs a random bit-flip
        public override bool Try(SimulatedAnnealingSolver solverInstance, ref SatConfiguration currentConfiguration)
        {
            var bitToFlip          = random.Next(0, solverInstance.SatInstance.Literals.Count - 1);
            var triedConfiguration = new SatConfiguration(currentConfiguration);

            triedConfiguration.Valuations[bitToFlip] = !triedConfiguration.Valuations[bitToFlip];

            triedConfiguration.Score = solverInstance.Options.ScoreStrategy.CalculateScore(triedConfiguration, solverInstance);

            if (Accept(triedConfiguration, currentConfiguration, solverInstance.CurrentTemperature))
            {
                currentConfiguration = triedConfiguration;
                return(true);
            }

            return(false);
        }
Exemplo n.º 18
0
        public void Run(Instance instance, string fileName)
        {
            var configurations = new List <EvaluatedConfiguration>();

            var solver = new SimulatedAnnealingSolver(INIT_TEMPERATURE, FROZEN_TEMPERATURE, COOLING_COEFICIENT, EQUILIBRIUM_COEFICIENT);

            solver.NewConfiguration += (sender, configuration) => configurations.Add(configuration);
            solver.Solve(instance);

            using (var sw = new StreamWriter(fileName))
            {
                foreach (var evaluatedConfiguration in configurations)
                {
                    sw.WriteLine(evaluatedConfiguration.Weight);
                }

                sw.Close();
            }
        }
Exemplo n.º 19
0
        public IList <KnapsackResult> SolveWithPerformanceTest(IList <KnapsackInstance> instances, AnnealingOptions options)
        {
            PreparePerformanceTest(instances);

            var stopWatch = new Stopwatch();
            var results   = new List <KnapsackResult>();

            foreach (var instance in instances)
            {
                Console.WriteLine($"Processing instance no. {instance.Id}");
                KnapsackResult result = null;

                //The algorithm must run repeat at least the set amount of times;
                for (int i = 0; i < REPEAT_COUNT; i++)
                {
                    var solver = new SimulatedAnnealingSolver(instance, options);
                    GC.Collect();
                    GC.WaitForPendingFinalizers();

                    //GC.TryStartNoGCRegion(200000000);
                    stopWatch.Start();
                    result = solver.Solve();
                    stopWatch.Stop();
                    //GC.EndNoGCRegion();
                }
                var averageRuntime = stopWatch.Elapsed.TotalMilliseconds / REPEAT_COUNT;

                //Save only the last result
                if (result != null)
                {
                    var optimalConfiguration = GetOptimalConfiguration(instance);
                    result.RunTimeMs            = averageRuntime;
                    result.OptimalConfiguration = optimalConfiguration;
                    result.Epsilon = GetEpsilonOfSolution(result.Configuration.Price, optimalConfiguration.Price);
                    results.Add(result);
                }
                RaiseInstanceCalculationFinished();
                stopWatch.Reset();
            }

            return(results);
        }
Exemplo n.º 20
0
        public bool Frozen(SimulatedAnnealingSolver solverInstance)
        {
            float rejectedRatio;

            if (solverInstance.EquilibriumSteps == 0)
            {
                rejectedRatio = 0.0f;
            }
            else
            {
                rejectedRatio = 1.0f - ((float)solverInstance.AcceptedDuringEquilibrium / solverInstance.EquilibriumSteps);
            }

            if (solverInstance.CurrentTemperature <= solverInstance.ScaledMinTemperature ||
                rejectedRatio >= solverInstance.Options.MaxRejectedRatio)
            {
                return(true);
            }
            return(false);
        }
Exemplo n.º 21
0
        public KnapsackConfiguration GetStartingPosition(SimulatedAnnealingSolver solverInstance)
        {
            var configuration = new KnapsackConfiguration {
                Price = 0, Weight = 0
            };
            var itemVector = new List <bool>();

            foreach (var item in solverInstance.Instance.Items)
            {
                var added = Convert.ToBoolean(random.Next(0, 1));
                itemVector.Add(added);
                if (added)
                {
                    configuration.Price  += item.Price;
                    configuration.Weight += item.Weight;
                }
            }
            configuration.ItemVector = itemVector;

            return(configuration);
        }
Exemplo n.º 22
0
 public abstract bool Equilibrium(SimulatedAnnealingSolver solverInstance);
Exemplo n.º 23
0
 public abstract bool Try(SimulatedAnnealingSolver solverInstance, ref SatConfiguration currentConfiguration);
Exemplo n.º 24
0
 public float Cool(SimulatedAnnealingSolver solverInstance)
 {
     return(solverInstance.CurrentTemperature * solverInstance.Options.CoolingCoefficient);
 }
Exemplo n.º 25
0
 public SatConfiguration GetStartingPosition(SimulatedAnnealingSolver solverInstance)
 {
     return(SatConfiguration.RandomConfiguration(solverInstance.SatInstance, random));
 }
Exemplo n.º 26
0
        private void _run_Click(object sender, RoutedEventArgs e)
        {
            #region Validate simulates annealing parameters
            int iterationCount = 0;
            if (!int.TryParse(this._numberOfIterations.Text, out iterationCount))
            {
                this.invalidInput("Number of Iterations");
                return;
            }
            if (iterationCount <= 0)
            {
                this.valueSmallerThanZero("Number of Iterations");
                return;
            }
            this._iterationCount = iterationCount;
            double minimumEnergy = 0;
            if (!double.TryParse(this._minimumTemperature.Text, out minimumEnergy))
            {
                this.invalidInput("Minimum Temperature");
                return;
            }
            if (minimumEnergy < 0)
            {
                MessageBox.Show("'Minimum Temperature' should not be smaller than zero!",
                                "Invalid Input", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            double maximumEnergy = 0;
            if (!double.TryParse(this._maximumTemperature.Text, out maximumEnergy))
            {
                this.invalidInput("Maximum Temperature");
                return;
            }
            if (maximumEnergy <= 0)
            {
                this.valueSmallerThanZero("Maximum Temperature");
                return;
            }
            #endregion

            #region validation of training subset
            //double trainingRatio = 0;
            //if (!double.TryParse(this._ratioOfTrainingSubset.Text, out trainingRatio))
            //{
            //    MessageBox.Show("Invalied 'Ratio of Training Subset'", "Invalid Input",
            //        MessageBoxButton.OK, MessageBoxImage.Error);
            //    return;
            //}
            //else
            //{
            //    if (trainingRatio <= 0 || trainingRatio > 1.0)
            //    {
            //        MessageBox.Show("'Ratio of Training Subset' must be larger than zero and smaller than or equal to 1",
            //            "Invalid Input", MessageBoxButton.OK, MessageBoxImage.Error);
            //        return;
            //    }
            //}
            #endregion

            #region Validate duration and timeStep parameters
            double timeStep = 0;
            if (!double.TryParse(this._timeStep.Text, out timeStep))
            {
                MessageBox.Show("Invalid input for 'Time Step'!",
                                "Invalid Input", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            else
            {
                if (timeStep <= 0)
                {
                    MessageBox.Show("'Time Step' must be larger than zero!",
                                    "Invalid Input", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
            }
            this._timeStepValue = timeStep;

            this._durationValue = this._host.trailVisualization.AgentWalkingTrail.TimeIntervalBetweenInterpolatedStates;//convert seconds to hours
            #endregion

            #region Check to see if spatial data has been included
            int spatialDataCount = 0;
            foreach (Function function in this._host.cellularFloor.AllSpatialDataFields.Values)
            {
                SpatialDataField dataField = function as SpatialDataField;
                if (dataField != null)
                {
                    if (dataField.IncludeInActivityGeneration)
                    {
                        spatialDataCount++;
                    }
                }
            }
            if (spatialDataCount == 0)
            {
                var res = MessageBox.Show("There is no a spatial data field included to calculate cost/desirability!");
                return;
            }
            #endregion

            #region extracting the ralated parameters and checking to see if number of parameter is not zero
            this.AllParameters = new HashSet <Parameter>();
            if (this._isoExternalDepth.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.OPT_IsovistExternalDepth.ToString()]);
            }
            if (this._numberOfDestinations.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.OPT_NumberOfDestinations.ToString()]);
            }
            if (this._velocityMagnetude.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_VelocityMagnitude.ToString()]);
            }
            if (this._angularVelocity.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_AngularVelocity.ToString()]);
            }
            if (this._bodySize.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_BodySize.ToString()]);
            }
            if (this._accelerationMagnitude.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_AccelerationMagnitude.ToString()]);
            }
            if (this._barrierRepulsionRange.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_BarrierRepulsionRange.ToString()]);
            }
            if (this._repulsionChangeRate.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_MaximumRepulsion.ToString()]);
            }
            if (this._barrierFriction.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_BarrierFriction.ToString()]);
            }
            if (this._bodyElasticity.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_AgentBodyElasticity.ToString()]);
            }
            if (this._visibilityAngle.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_VisibilityAngle.ToString()]);
            }
            if (this._decisionMakingPeriodLamdaFactor.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.OPT_DecisionMakingPeriodLambdaFactor.ToString()]);
            }
            if (this._angleDistributionLambdaFactor.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.OPT_AngleDistributionLambdaFactor.ToString()]);
            }
            if (this._desirabilityDistributionLambdaFactor.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.OPT_DesirabilityDistributionLambdaFactor.ToString()]);
            }
            foreach (var item in this._host.Parameters)
            {
                foreach (var function in item.Value.LinkedFunctions)
                {
                    if (function.IncludeInActivityGeneration)
                    {
                        this.AllParameters.Add(item.Value);
                        break;
                    }
                }
            }
            if (this.AllParameters.Count == 0)
            {
                MessageBox.Show("No parameter is included to account for the variability in the optimization process",
                                "Parameter Not Assigned", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            #endregion

            //execute visibility changes in the interface
            Dispatcher.Invoke(new Action(() =>
            {
                this._run_close.SetValue(Button.VisibilityProperty, System.Windows.Visibility.Collapsed);
                this._run_close.SetValue(Button.ContentProperty, "Close");
                this._mainInterface.SetValue(Grid.VisibilityProperty, System.Windows.Visibility.Collapsed);
                this._progressPanel.SetValue(StackPanel.VisibilityProperty, System.Windows.Visibility.Visible);
            }), DispatcherPriority.ContextIdle);
            //unregister run button event
            this._run_close.Click -= this._run_Click;
            //create annealing
            SimulatedAnnealingSolver solver = new SimulatedAnnealingSolver(this.AllParameters);
            //register UI update event for best fitness changes
            solver.BestFitnessUpdated += solver_BestFitnessUpdated;
            //register UI update event for fitness changes
            solver.FitnessUpdated += solver_FitnessUpdated;
            //Setting the initial iteration to zero
            this._counter = 0;
            //initializing the trial visualization
            this._host.trailVisualization.InitiateTrainingVisualization();

            //running the annealing process
            solver.Solve(minimumEnergy, maximumEnergy, iterationCount, this.measureFitnessWithInterfaceUpdate);

            //unregister UI update event for fitness changes
            solver.BestFitnessUpdated -= solver_BestFitnessUpdated;
            //unregister UI update event for fitness changes
            solver.FitnessUpdated -= solver_FitnessUpdated;
            //showing the close btn. The close event is not registered yet
            Dispatcher.Invoke(new Action(() =>
            {
                this._run_close.SetValue(Button.VisibilityProperty, System.Windows.Visibility.Visible);
            }), DispatcherPriority.ContextIdle);
            //updating the FreeNavigationAgentCharacters
            this._host.FreeNavigationAgentCharacter = FreeNavigationAgent.Create(this._host.trailVisualization.AgentWalkingTrail.InterpolatedStates[0]);
            //Show the last parameter setting on UI
            this._sb.Clear();
            foreach (var item in this.AllParameters)
            {
                this._sb.AppendLine(item.ToString());
            }
            this._updateMessage.SetValue(TextBlock.TextProperty, this._sb.ToString());
            //set Window closing events
            this._run_close.Click += (s, e1) =>
            {
                var result = MessageBox.Show("Do you want to clear the training data from screen?",
                                             "", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
                if (result == MessageBoxResult.Yes)
                {
                    this._host.trailVisualization.TerminateTrainingVisualization();
                }
                this.Close();
            };
        }
        void _run_Click(object sender, RoutedEventArgs e)
        {
            #region Validate activity related input
            if (this._applyFilter.IsChecked.Value)
            {
                int gr = 0;
                if (!int.TryParse(this._gaussianRangeDefault.Text, out gr))
                {
                    MessageBox.Show("Invalid input for Gaussian filter range");
                    return;
                }
                else
                {
                    if (gr < 2)
                    {
                        MessageBox.Show("Gaussian filter range should be larger than 1!");
                        return;
                    }
                    else
                    {
                        this._gaussianRange = gr;
                    }
                }
                if (this._host.ViewBasedGaussianFilter.Range != gr)
                {
                    this._host.ViewBasedGaussianFilter = new IsovistClippedGaussian(this._host.cellularFloor, gr);
                }
            }
            int _r = 0;
            if (!int.TryParse(this._neighborhoodRangePotential.Text, out _r))
            {
                MessageBox.Show("Invalid input for potential field calculation range!");
                return;
            }
            else
            {
                if (_r < 1)
                {
                    MessageBox.Show("Potential field calculation range should be larger than 0!");
                    return;
                }
                else
                {
                    if (this._host.FieldGenerator.Range != _r)
                    {
                        this._host.FieldGenerator = new Data.Visualization.SpatialDataCalculator(this._host, _r, OSMDocument.AbsoluteTolerance);
                    }
                }
            }

            #endregion

            #region Validate simulates annealing parameters
            int iterationCount = 0;
            if (!int.TryParse(this._numberOfIterations.Text, out iterationCount))
            {
                this.invalidInput("Number of Iterations");
                return;
            }
            if (iterationCount <= 0)
            {
                this.valueSmallerThanZero("Number of Iterations");
                return;
            }
            this._iterationCount = iterationCount;
            double minimumEnergy = 0;
            if (!double.TryParse(this._minimumTemperature.Text, out minimumEnergy))
            {
                this.invalidInput("Minimum Temperature");
                return;
            }
            if (minimumEnergy < 0)
            {
                MessageBox.Show("'Minimum Temperature' should not be smaller than zero!",
                                "Invalid Input", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            double maximumEnergy = 0;
            if (!double.TryParse(this._maximumTemperature.Text, out maximumEnergy))
            {
                this.invalidInput("Maximum Temperature");
                return;
            }
            if (maximumEnergy <= 0)
            {
                this.valueSmallerThanZero("Maximum Temperature");
                return;
            }
            #endregion

            #region validation of training subset
            //double trainingRatio = 0;
            //if(!double.TryParse(this._ratioOfTrainingSubset.Text, out trainingRatio))
            //{
            //    MessageBox.Show("Invalied 'Ratio of Training Subset'", "Invalid Input",
            //        MessageBoxButton.OK, MessageBoxImage.Error);
            //    return;
            //}
            //else
            //{
            //    if(trainingRatio<=0 || trainingRatio>1.0)
            //    {
            //        MessageBox.Show("'Ratio of Training Subset' must be larger than zero and smaller than or equal to 1",
            //            "Invalid Input", MessageBoxButton.OK, MessageBoxImage.Error);
            //        return;
            //    }
            //}
            #endregion

            #region Validate duration and timeStep parameters
            double timeStep = 0;
            if (!double.TryParse(this._timeStep.Text, out timeStep))
            {
                MessageBox.Show("Invalid input for 'Time Step'!",
                                "Invalid Input", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            else
            {
                if (timeStep <= 0)
                {
                    MessageBox.Show("'Time Step' must be larger than zero!",
                                    "Invalid Input", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
            }
            this._timeStepValue = timeStep;

            this._durationValue = this._host.trailVisualization.AgentWalkingTrail.TimeIntervalBetweenInterpolatedStates;//convert seconds to hours
            #endregion

            #region Check to see if spatial data has been included
            int spatialDataCount = 0;
            foreach (Function function in this._host.cellularFloor.AllSpatialDataFields.Values)
            {
                SpatialDataField dataField = function as SpatialDataField;
                if (dataField != null)
                {
                    if (dataField.IncludeInActivityGeneration)
                    {
                        spatialDataCount++;
                    }
                }
            }
            if (spatialDataCount == 0)
            {
                var res = MessageBox.Show("There is no a spatial data field included to calculate cost/desirability!");
                return;
            }
            #endregion

            #region extracting the ralated parameters and checking to see if number of parameter is not zero
            this.AllParameters = new HashSet <Parameter>();

            if (this._velocityMagnetude.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_VelocityMagnitude.ToString()]);
            }
            if (this._angularVelocity.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_AngularVelocity.ToString()]);
            }
            if (this._bodySize.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_BodySize.ToString()]);
            }
            if (this._accelerationMagnitude.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_AccelerationMagnitude.ToString()]);
            }
            if (this._barrierRepulsionRange.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_BarrierRepulsionRange.ToString()]);
            }
            if (this._repulsionChangeRate.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_MaximumRepulsion.ToString()]);
            }
            if (this._barrierFriction.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_BarrierFriction.ToString()]);
            }
            if (this._bodyElasticity.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.GEN_AgentBodyElasticity.ToString()]);
            }
            if (this._angularDeviationCost.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.MAN_AngularDeviationCost.ToString()]);
            }
            if (this._distanceCost.IsChecked.Value)
            {
                this.AllParameters.Add(this._host.Parameters[AgentParameters.MAN_DistanceCost.ToString()]);
            }
            foreach (var item in this._host.Parameters)
            {
                foreach (var function in item.Value.LinkedFunctions)
                {
                    if (function.IncludeInActivityGeneration)
                    {
                        this.AllParameters.Add(item.Value);
                        break;
                    }
                }
            }
            if (this.AllParameters.Count == 0)
            {
                MessageBox.Show("No parameter is included to account for the variability in the optimization process",
                                "Parameter Not Assigned", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            #endregion

            #region Trail Related Stuff
            this._trailIndices = new HashSet <Index>();
            foreach (var item in this._host.trailVisualization.AgentWalkingTrail.ApproximatedPoints)
            {
                Index index = this._host.cellularFloor.FindIndex(item);
                if (this._host.cellularFloor.Cells[index.I, index.J].FieldOverlapState != OverlapState.Inside)
                {
                    MessageBox.Show("The training process cannot proceed with this trail. Parts of the trail are not included in the walkable field!", "Invalid Trail", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                    return;
                }
                else
                {
                    this._trailIndices.Add(index);
                }
            }
            this._trailIndices    = CellUtility.ExpandInWalkableField(this._host.cellularFloor, this._trailIndices);
            this._defaultState    = this._host.trailVisualization.AgentWalkingTrail.InterpolatedStates[this._host.trailVisualization.AgentWalkingTrail.InterpolatedStates.Length - 1];
            this._cellDestination = this._host.cellularFloor.FindCell(this._defaultState.Location);
            UV  p1 = this._cellDestination;
            var p2 = p1 + UV.UBase * this._host.cellularFloor.CellSize;
            var p3 = p1 + UV.UBase * this._host.cellularFloor.CellSize + UV.VBase * this._host.cellularFloor.CellSize;
            var p4 = p1 + UV.VBase * this._host.cellularFloor.CellSize;
            this._destination = new BarrierPolygon(new UV[] { p1, p2, p3, p4 });
            #endregion

            //execute visibility changes in the interface
            Dispatcher.Invoke(new Action(() =>
            {
                this._run_close.SetValue(Button.VisibilityProperty, System.Windows.Visibility.Collapsed);
                this._run_close.SetValue(Button.ContentProperty, "Close");
                this._mainInterface.SetValue(Grid.VisibilityProperty, System.Windows.Visibility.Collapsed);
                this._progressPanel.SetValue(StackPanel.VisibilityProperty, System.Windows.Visibility.Visible);
            }), DispatcherPriority.ContextIdle);
            //unregister run button event
            this._run_close.Click -= this._run_Click;
            //create annealing
            SimulatedAnnealingSolver solver = new SimulatedAnnealingSolver(this.AllParameters);
            //register UI update event for best fitness changes
            solver.BestFitnessUpdated += solver_BestFitnessUpdated;
            //register UI update event for fitness changes
            solver.FitnessUpdated += solver_FitnessUpdated;
            //Setting the initial iteration to zero
            this._counter = 0;
            //initializing the trial visualization
            this._host.trailVisualization.InitiateTrainingVisualization();

            //running the annealing process
            solver.Solve(minimumEnergy, maximumEnergy, iterationCount, this.measureFitnessWithInterfaceUpdate);

            //unregister UI update event for fitness changes
            solver.BestFitnessUpdated -= solver_BestFitnessUpdated;
            //unregister UI update event for fitness changes
            solver.FitnessUpdated -= solver_FitnessUpdated;
            //showing the close btn. The close event is not registered yet
            Dispatcher.Invoke(new Action(() =>
            {
                this._run_close.SetValue(Button.VisibilityProperty, System.Windows.Visibility.Visible);
            }), DispatcherPriority.ContextIdle);
            //Show the last parameter setting on UI
            this._sb.Clear();
            foreach (var item in this.AllParameters)
            {
                this._sb.AppendLine(item.ToString());
            }
            this._updateMessage.SetValue(TextBlock.TextProperty, this._sb.ToString());
            //set Window closing events
            this._run_close.Click += (s, e1) =>
            {
                var result = MessageBox.Show("Do you want to clear the training data from screen?",
                                             "", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
                if (result == MessageBoxResult.Yes)
                {
                    this._host.trailVisualization.TerminateTrainingVisualization();
                }
                this.Close();
            };
        }
Exemplo n.º 28
0
        public KnapsackConfiguration GetStartingPosition(SimulatedAnnealingSolver solverInstance)
        {
            var greedyResult = new GreedyReduxSolver().Solve(solverInstance.Instance);

            return(greedyResult.Configuration);
        }