private void Initialize(SetCoveringProblemData data) { _l = new int[PopulationSize, data.N]; _r = new int[data.M]; int t = 0; var res = new GreedyEngine.Engine().Solve(data); for (int i = 0; i < data.N; ++i) { _l[t, i] = res.Solution[i]; } //FindNextCovering(data, t, (d, r) => d.Subsets[r].First()); while (t < PopulationSize - 1) { t++; for (int j = 0; j < data.M; ++j) { _r[j] = 0; } FindNextCovering(data, t, (d, r) => d.Subsets[r][Utility.Random.Next(data.Subsets[r].Count)]); } DeleteExcessiveColumns(data); }
public SetCoveringProblemResult Solve(SetCoveringProblemData data) { var res = new GreedyEngine.Engine().Solve(data); var configuration = res.Solution; //int upperBound = 10000000; double tsFactor = 0.2; int tabuLength = (int)Math.Ceiling(tsFactor * Utility.NumberOfSubsetsIncover(res.Solution, data.N)) + 1; int[] solution = new int[data.N]; Array.Copy(res.Solution, solution, data.N); int solutionFitness = res.SolutionFitness; int iterations = 0; List <int> fitnessesHistory = new List <int>(); while (iterations < 2000) { iterations++; List <int[]> neighborhood = new List <int[]>(); List <ConfigurationEntry> sortedNeighborhood = new List <ConfigurationEntry>(); for (int i = 0; i < data.N; ++i) { int[] neighbor = new int[data.N]; Array.Copy(configuration, neighbor, data.N); neighbor[i] = (neighbor[i] + 1) % 2; neighborhood.Add(neighbor); sortedNeighborhood.Add(new ConfigurationEntry { Index = i, Fitness = Utility.CalculateConfigurationFitness(data, neighbor, data.N) }); } var configurations = sortedNeighborhood.OrderBy(x => x.Fitness).ToList(); var acceptable = configurations.First(x => !BelongsToTabu(neighborhood[x.Index], data.N) || x.Fitness < solutionFitness); Array.Copy(neighborhood[acceptable.Index], configuration, data.N); if (acceptable.Fitness < solutionFitness && Utility.IsLegalSolution(data, neighborhood[acceptable.Index])) { solution = neighborhood[acceptable.Index]; solutionFitness = acceptable.Fitness; } if (_tabuList.Count == tabuLength + 2) { var first = _tabuList.First(); _tabuList.Remove(first); } _tabuList.Add(neighborhood[acceptable.Index]); fitnessesHistory.Add(solutionFitness); if (iterations > 100 && fitnessesHistory[iterations - 100] == fitnessesHistory[iterations - 1]) { break; } //Console.WriteLine("iterations: " + iterations); //Console.WriteLine("fitness: " + solutionFitness); } return(new SetCoveringProblemResult() { Iterations = iterations, Solution = solution, SolutionFitness = solutionFitness }); }