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() }); }
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); }
public SimulatedAnnealingSolver(SatInstance instance, AnnealingOptions options) { SatInstance = instance; Options = options; }