예제 #1
0
        public SatResult Solve()
        {
            movesHistory         = new List <DataPoint>();
            currentConfiguration = Options.StartingPositionStrategy.GetStartingPosition(this);
            BestConfiguration    = new SatConfiguration {
                Instance = SatInstance, Score = 0, Valuations = new List <bool>(new bool[SatInstance.Literals.Count])
            };
            CurrentTemperature   = Options.BaseStartingTemperature * SatInstance.GetSumOfWeights();
            ScaledMinTemperature = Options.MinimalTemperature * SatInstance.GetSumOfWeights();
            NumberOfSteps        = 0;

            var solutionLoopCount = 0;

            while (!RunSolutionLoop() && solutionLoopCount < MAX_RESTART_COUNT - 1)
            {
                solutionLoopCount++;
                CurrentTemperature        = Options.BaseStartingTemperature * SatInstance.GetSumOfWeights();
                AcceptedDuringEquilibrium = 0;
                EquilibriumSteps          = 0;
                //Options.BaseEquilibriumSteps = (int) (Options.BaseEquilibriumSteps * EQUILIBRIUM_RESTART_MULTIPLIER);
            }


            return(new SatResult {
                Configuration = BestConfiguration,
                SatInstance = SatInstance,
                NumberOfSteps = this.NumberOfSteps,
                MovesHistory = movesHistory,
                RestartCount = solutionLoopCount,
                BestConfigurationFoundAt = bestConfigurationFoundAt,
                NumberOfUnsatisfiedClauses = BestConfiguration.NumberOfUnsatisfiedClauses()
            });
        }
예제 #2
0
        public static SatInstance ReadSatInstance(string instanceFileLocation)
        {
            var fileName         = Path.GetFileName(instanceFileLocation);
            var clauses          = new List <SatClause>();
            var instance         = new SatInstance();
            int numberOfLiterals = 0;
            int numberOfClauses  = 0;

            instance.Id = InputFieldParser.ParseInstanceId(fileName);

            using (StreamReader file = new StreamReader(instanceFileLocation))
            {
                string ln;

                while ((ln = file.ReadLine()) != null)
                {
                    var trimmedLn = ln.Trim();
                    if (trimmedLn.StartsWith('p'))
                    {
                        InputFieldParser.ParseInstanceInfoLine(trimmedLn, out numberOfLiterals, out numberOfClauses);
                    }
                    else if (trimmedLn.StartsWith('w'))
                    {
                        instance.Literals = InputFieldParser.ParseLiteralWeights(trimmedLn, numberOfLiterals);
                    }
                    else if (trimmedLn.StartsWith('c'))
                    {
                        continue;
                    }
                    else if (trimmedLn.StartsWith('%'))
                    {
                        break;
                    }
                    else
                    {
                        clauses.Add(InputFieldParser.ParseSatClause(trimmedLn, instance.Literals, InputFieldParser.CLAUSE_LENGTH));
                    }
                }

                if (clauses.Count != numberOfClauses)
                {
                    Debug.WriteLine($"Warning: Number of expected clauses({numberOfClauses}) does not match the actual amount({clauses.Count}) - {fileName}");
                }
                instance.Clauses = clauses;
            }
            return(instance);
        }
예제 #3
0
 public SimulatedAnnealingSolver(SatInstance instance, AnnealingOptions options)
 {
     SatInstance = instance;
     Options     = options;
 }