using System; using System.Linq; using System.Collections.Generic; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Encodings.LinearLinkageEncoding; using HeuristicLab.Optimization; using HeuristicLab.Problems.Programmable; namespace HeuristicLab.Problems.Programmable { public class CompiledSingleObjectiveProblemDefinition : CompiledProblemDefinition, ISingleObjectiveProblemDefinition { private const int ProblemSize = 100; public bool Maximization { get { return false; } } private bool[,] allowedTogether; public override void Initialize() { var encoding = new LinearLinkageEncoding("lle", length: ProblemSize); allowedTogether = new bool[encoding.Length, encoding.Length]; var random = new System.Random(13); for (var i = 0; i < encoding.Length - 1; i++) for (var j = i + 1; j < encoding.Length; j++) allowedTogether[i, j] = allowedTogether[j, i] = random.Next(2) == 0; Encoding = encoding; } public double Evaluate(Individual individual, IRandom random) { var penalty = 0; var groups = individual.LinearLinkage("lle").GetGroups().ToList(); for (var i = 0; i < groups.Count; i++) { for (var j = 0; j < groups[i].Count; j++) for (var k = j + 1; k < groups[i].Count; k++) if (!allowedTogether[groups[i][j], groups[i][k]]) penalty++; } if (penalty > 0) return penalty + ProblemSize; else return groups.Count; } public void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) { } public IEnumerable GetNeighbors(Individual individual, IRandom random) { foreach (var move in ExhaustiveSwap2MoveGenerator.Generate(individual.LinearLinkage("lle"))) { var neighbor = individual.Copy(); var lle = neighbor.LinearLinkage("lle"); Swap2MoveMaker.Apply(lle, move); yield return neighbor; } } } }