#region License Information /* HeuristicLab * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System.Collections.Generic; using System.Linq; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Encodings.BinaryVectorEncoding; using HeuristicLab.Encodings.PermutationEncoding; using HeuristicLab.Optimization; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; using HeuristicLab.Problems.TravelingSalesman; namespace HeuristicLab.Networks.IntegratedOptimization.TravelingThief { [Item("Tour Profit Problem", "Represents a problem whose objective is to optimize a TTP tour for fixed TTP loot.")] [Creatable(CreatableAttribute.Categories.Problems, Priority = 999)] [StorableClass] public class TourProfitProblem : SingleObjectiveBasicProblem { public override bool Maximization { get { return true; } } [Storable] public TravelingSalesmanProblem Tsp { get; set; } [Storable] public BinaryKnapsackProblem Ksp { get; set; } [Storable] public BinaryVector FixedKspSolution { get; set; } [Storable] public Dictionary Availability { get; set; } [Storable] public double RentingRatio { get; set; } [Storable] public double MinSpeed { get; set; } [Storable] public double MaxSpeed { get; set; } [StorableConstructor] protected TourProfitProblem(bool deserializing) : base(deserializing) { } protected TourProfitProblem(TourProfitProblem original, Cloner cloner) : base(original, cloner) { Tsp = cloner.Clone(original.Tsp); Ksp = cloner.Clone(original.Ksp); FixedKspSolution = cloner.Clone(original.FixedKspSolution); Availability = original.Availability != null ? original.Availability.ToDictionary(k => k.Key, v => (int[])v.Value.Clone()) : null; RentingRatio = original.RentingRatio; MinSpeed = original.MinSpeed; MaxSpeed = original.MaxSpeed; } public TourProfitProblem() : base() { Encoding.Length = 5; } public override IDeepCloneable Clone(Cloner cloner) { return new TourProfitProblem(this, cloner); } public override double Evaluate(Individual individual, IRandom random) { return TtpUtils.Evaluate(Tsp, individual.Permutation().ToArray(), Ksp, FixedKspSolution.ToArray(), Availability, RentingRatio, MinSpeed, MaxSpeed); } public override IEnumerable GetNeighbors(Individual individual, IRandom random) { while (true) { var neighbor = individual.Copy(); switch (random.Next(7)) { case 0: InsertionManipulator.Apply(random, neighbor.Permutation()); break; case 1: InversionManipulator.Apply(random, neighbor.Permutation()); break; case 2: ScrambleManipulator.Apply(random, neighbor.Permutation()); break; case 3: Swap2Manipulator.Apply(random, neighbor.Permutation()); break; case 4: Swap3Manipulator.Apply(random, neighbor.Permutation()); break; case 5: TranslocationInversionManipulator.Apply(random, neighbor.Permutation()); break; case 6: TranslocationManipulator.Apply(random, neighbor.Permutation()); break; } yield return neighbor; } } public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) { base.Analyze(individuals, qualities, results, random); var orderedIndividuals = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }).OrderBy(z => z.Quality); var best = Maximization ? orderedIndividuals.Last().Individual : orderedIndividuals.First().Individual; if (!results.ContainsKey("Best TSP Solution")) results.Add(new Result("Best TSP Solution", typeof(Permutation))); results["Best TSP Solution"].Value = (IItem)best.Permutation().Clone(); } } }