#region License Information /* HeuristicLab * Copyright (C) 2002-2012 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; using System.Drawing; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; namespace HeuristicLab.Problems.VehicleRouting { /// /// Represents a VRP solution which can be visualized in the GUI. /// [Item("VRPSolution", "Represents a VRP solution which can be visualized in the GUI.")] [StorableClass] public sealed class VRPSolution : Item { public static new Image StaticItemImage { get { return HeuristicLab.Common.Resources.VSImageLibrary.Image; } } [Storable] private DoubleMatrix coordinates; public DoubleMatrix Coordinates { get { return coordinates; } set { if (coordinates != value) { if (coordinates != null) DeregisterCoordinatesEvents(); coordinates = value; if (coordinates != null) RegisterCoordinatesEvents(); OnCoordinatesChanged(); } } } [Storable] private IVRPEncoding solution; public IVRPEncoding Solution { get { return solution; } set { if (solution != value) { if (solution != null) DeregisterSolutionEvents(); solution = value; if (solution != null) RegisterSolutionEvents(); OnSolutionChanged(); } } } [Storable] private DoubleValue quality; public DoubleValue Quality { get { return quality; } set { if (quality != value) { if (quality != null) DeregisterQualityEvents(); quality = value; if (quality != null) RegisterQualityEvents(); OnQualityChanged(); } } } [Storable] private DoubleValue distance; public DoubleValue Distance { get { return distance; } set { if (distance != value) { if (distance != null) DeregisterDistanceEvents(); distance = value; if (distance != null) RegisterDistanceEvents(); OnDistanceChanged(); } } } [Storable] private DoubleValue overload; public DoubleValue Overload { get { return overload; } set { if (overload != value) { if (overload != null) DeregisterOverloadEvents(); overload = value; if (overload != null) RegisterOverloadEvents(); OnOverloadChanged(); } } } [Storable] private DoubleValue tardiness; public DoubleValue Tardiness { get { return tardiness; } set { if (tardiness != value) { if (tardiness != null) DeregisterTardinessEvents(); tardiness = value; if (tardiness != null) RegisterTardinessEvents(); OnTardinessChanged(); } } } [Storable] private DoubleValue travelTime; public DoubleValue TravelTime { get { return travelTime; } set { if (travelTime != value) { if (travelTime != null) DeregisterTravelTimeEvents(); travelTime = value; if (travelTime != null) RegisterTravelTimeEvents(); OnTravelTimeChanged(); } } } [Storable] private DoubleValue vehicleUtilization; public DoubleValue VehicleUtilization { get { return vehicleUtilization; } set { if (vehicleUtilization != value) { if (vehicleUtilization != null) DeregisterVehicleUtilizationEvents(); vehicleUtilization = value; if (vehicleUtilization != null) RegisterVehicleUtilizationEvents(); OnVehicleUtilizationChanged(); } } } [Storable] private DoubleMatrix distanceMatrix; public DoubleMatrix DistanceMatrix { get { return distanceMatrix; } set { if (distanceMatrix != value) { distanceMatrix = value; } } } [Storable] private BoolValue useDistanceMatrix; public BoolValue UseDistanceMatrix { get { return useDistanceMatrix; } set { if (useDistanceMatrix != value) { useDistanceMatrix = value; } } } [Storable] private DoubleArray readyTime; public DoubleArray ReadyTime { get { return readyTime; } set { if (readyTime != value) { readyTime = value; } } } [Storable] private DoubleArray dueTime; public DoubleArray DueTime { get { return dueTime; } set { if (dueTime != value) { dueTime = value; } } } [Storable] private DoubleArray serviceTime; public DoubleArray ServiceTime { get { return serviceTime; } set { if (serviceTime != value) { serviceTime = value; } } } public VRPSolution() : base() { } public VRPSolution(DoubleMatrix coordinates) : base() { this.coordinates = coordinates; } public VRPSolution(DoubleMatrix coordinates, IVRPEncoding solution, DoubleValue quality, DoubleValue distance, DoubleValue overload, DoubleValue tardiness, DoubleValue travelTime, DoubleValue vehicleUtilization, DoubleMatrix distanceMatrix, BoolValue useDistanceMatrix, DoubleArray readyTime, DoubleArray dueTime, DoubleArray serviceTime) : base() { this.coordinates = coordinates; this.solution = solution; this.quality = quality; this.distance = distance; this.overload = overload; this.tardiness = tardiness; this.travelTime = travelTime; this.vehicleUtilization = vehicleUtilization; this.distanceMatrix = distanceMatrix; this.useDistanceMatrix = useDistanceMatrix; this.readyTime = readyTime; this.dueTime = dueTime; this.serviceTime = serviceTime; Initialize(); } [StorableConstructor] private VRPSolution(bool deserializing) : base(deserializing) { } private VRPSolution(VRPSolution original, Cloner cloner) : base(original, cloner) { coordinates = cloner.Clone(original.coordinates); solution = cloner.Clone(original.solution); quality = cloner.Clone(original.quality); distance = cloner.Clone(original.distance); overload = cloner.Clone(original.overload); tardiness = cloner.Clone(original.tardiness); travelTime = cloner.Clone(original.travelTime); vehicleUtilization = cloner.Clone(original.vehicleUtilization); distanceMatrix = cloner.Clone(original.distanceMatrix); useDistanceMatrix = cloner.Clone(original.useDistanceMatrix); readyTime = cloner.Clone(original.readyTime); dueTime = cloner.Clone(original.dueTime); serviceTime = cloner.Clone(original.serviceTime); Initialize(); } [StorableHook(HookType.AfterDeserialization)] private void AfterDeserialization() { Initialize(); } private void Initialize() { if (coordinates != null) RegisterCoordinatesEvents(); if (solution != null) RegisterSolutionEvents(); if (quality != null) RegisterQualityEvents(); if (distance != null) RegisterDistanceEvents(); if (overload != null) RegisterOverloadEvents(); if (tardiness != null) RegisterTardinessEvents(); if (travelTime != null) RegisterTravelTimeEvents(); if (vehicleUtilization != null) RegisterVehicleUtilizationEvents(); } public override IDeepCloneable Clone(Cloner cloner) { return new VRPSolution(this, cloner); } #region Events public event EventHandler CoordinatesChanged; private void OnCoordinatesChanged() { var changed = CoordinatesChanged; if (changed != null) changed(this, EventArgs.Empty); } public event EventHandler SolutionChanged; private void OnSolutionChanged() { var changed = SolutionChanged; if (changed != null) changed(this, EventArgs.Empty); } public event EventHandler QualityChanged; private void OnQualityChanged() { var changed = QualityChanged; if (changed != null) changed(this, EventArgs.Empty); } public event EventHandler DistanceChanged; private void OnDistanceChanged() { var changed = DistanceChanged; if (changed != null) changed(this, EventArgs.Empty); } public event EventHandler OverloadChanged; private void OnOverloadChanged() { var changed = OverloadChanged; if (changed != null) changed(this, EventArgs.Empty); } public event EventHandler TardinessChanged; private void OnTardinessChanged() { var changed = TardinessChanged; if (changed != null) changed(this, EventArgs.Empty); } public event EventHandler TravelTimeChanged; private void OnTravelTimeChanged() { var changed = TravelTimeChanged; if (changed != null) changed(this, EventArgs.Empty); } public event EventHandler VehicleUtilizationChanged; private void OnVehicleUtilizationChanged() { var changed = VehicleUtilizationChanged; if (changed != null) changed(this, EventArgs.Empty); } private void RegisterCoordinatesEvents() { Coordinates.ItemChanged += new EventHandler>(Coordinates_ItemChanged); Coordinates.Reset += new EventHandler(Coordinates_Reset); } private void DeregisterCoordinatesEvents() { Coordinates.ItemChanged -= new EventHandler>(Coordinates_ItemChanged); Coordinates.Reset -= new EventHandler(Coordinates_Reset); } private void RegisterSolutionEvents() { Solution.ToStringChanged += new EventHandler(Solution_ToStringChanged); } private void DeregisterSolutionEvents() { Solution.ToStringChanged -= new EventHandler(Solution_ToStringChanged); } private void RegisterQualityEvents() { Quality.ValueChanged += new EventHandler(Quality_ValueChanged); } private void DeregisterQualityEvents() { Quality.ValueChanged -= new EventHandler(Quality_ValueChanged); } private void RegisterDistanceEvents() { Distance.ValueChanged += new EventHandler(Distance_ValueChanged); } private void DeregisterDistanceEvents() { Distance.ValueChanged -= new EventHandler(Distance_ValueChanged); } private void RegisterOverloadEvents() { Overload.ValueChanged += new EventHandler(Overload_ValueChanged); } private void DeregisterOverloadEvents() { Overload.ValueChanged -= new EventHandler(Overload_ValueChanged); } private void RegisterTardinessEvents() { Tardiness.ValueChanged += new EventHandler(Tardiness_ValueChanged); } private void DeregisterTardinessEvents() { Tardiness.ValueChanged -= new EventHandler(Tardiness_ValueChanged); } private void RegisterTravelTimeEvents() { TravelTime.ValueChanged += new EventHandler(TravelTime_ValueChanged); } private void DeregisterTravelTimeEvents() { TravelTime.ValueChanged -= new EventHandler(TravelTime_ValueChanged); } private void RegisterVehicleUtilizationEvents() { VehicleUtilization.ValueChanged += new EventHandler(VehicleUtilization_ValueChanged); } private void DeregisterVehicleUtilizationEvents() { VehicleUtilization.ValueChanged -= new EventHandler(VehicleUtilization_ValueChanged); } private void Coordinates_ItemChanged(object sender, EventArgs e) { OnCoordinatesChanged(); } private void Coordinates_Reset(object sender, EventArgs e) { OnCoordinatesChanged(); } private void Solution_ToStringChanged(object sender, EventArgs e) { OnSolutionChanged(); } private void Quality_ValueChanged(object sender, EventArgs e) { OnQualityChanged(); } private void Distance_ValueChanged(object sender, EventArgs e) { OnDistanceChanged(); } private void Overload_ValueChanged(object sender, EventArgs e) { OnOverloadChanged(); } private void Tardiness_ValueChanged(object sender, EventArgs e) { OnTardinessChanged(); } private void TravelTime_ValueChanged(object sender, EventArgs e) { OnTravelTimeChanged(); } private void VehicleUtilization_ValueChanged(object sender, EventArgs e) { OnVehicleUtilizationChanged(); } #endregion } }