using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using HeuristicLab.MainForm; using HeuristicLab.Problems.VehicleRouting.ProblemInstances; using HeuristicLab.Data; namespace HeuristicLab.Problems.VehicleRouting.Views { [View("CVRPTWProblemInstance View")] [Content(typeof(CVRPTWProblemInstance), true)] public partial class CVRPTWView : VRPProblemInstanceView { public new CVRPTWProblemInstance Content { get { return (CVRPTWProblemInstance)base.Content; } set { base.Content = value; } } public CVRPTWView() { InitializeComponent(); } protected override void DrawVisualization(Bitmap bitmap) { DoubleMatrix coordinates = Content.Coordinates; DoubleMatrix distanceMatrix = Content.DistanceMatrix; BoolValue useDistanceMatrix = Content.UseDistanceMatrix; DoubleArray dueTime = Content.DueTime; DoubleArray serviceTime = Content.ServiceTime; DoubleArray readyTime = Content.ReadyTime; Pen[] pens = {new Pen(Color.FromArgb(92,20,237)), new Pen(Color.FromArgb(237,183,20)), new Pen(Color.FromArgb(237,20,219)), new Pen(Color.FromArgb(20,237,76)), new Pen(Color.FromArgb(237,61,20)), new Pen(Color.FromArgb(115,78,26)), new Pen(Color.FromArgb(20,237,229)), new Pen(Color.FromArgb(39,101,19)), new Pen(Color.FromArgb(230,170,229)), new Pen(Color.FromArgb(142,136,89)), new Pen(Color.FromArgb(157,217,166)), new Pen(Color.FromArgb(31,19,101)), new Pen(Color.FromArgb(173,237,20)), new Pen(Color.FromArgb(230,231,161)), new Pen(Color.FromArgb(142,89,89)), new Pen(Color.FromArgb(93,89,142)), new Pen(Color.FromArgb(146,203,217)), new Pen(Color.FromArgb(101,19,75)), new Pen(Color.FromArgb(198,20,237)), new Pen(Color.FromArgb(185,185,185)), new Pen(Color.FromArgb(179,32,32)), new Pen(Color.FromArgb(18,119,115)), new Pen(Color.FromArgb(104,158,239)), new Pen(Color.Black)}; if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)) { double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue; for (int i = 0; i < coordinates.Rows; i++) { if (xMin > coordinates[i, 0]) xMin = coordinates[i, 0]; if (yMin > coordinates[i, 1]) yMin = coordinates[i, 1]; if (xMax < coordinates[i, 0]) xMax = coordinates[i, 0]; if (yMax < coordinates[i, 1]) yMax = coordinates[i, 1]; } int border = 20; double xStep = xMax != xMin ? (bitmap.Width - 2 * border) / (xMax - xMin) : 1; double yStep = yMax != yMin ? (bitmap.Height - 2 * border) / (yMax - yMin) : 1; using (Graphics graphics = Graphics.FromImage(bitmap)) { if (Solution != null) { int currentTour = 0; foreach (Tour tour in Solution.GetTours()) { double t = 0.0; Point[] tourPoints = new Point[tour.Stops.Count + 2]; Brush[] customerBrushes = new Brush[tour.Stops.Count]; int lastCustomer = 0; for (int i = -1; i <= tour.Stops.Count; i++) { int location = 0; if (i == -1 || i == tour.Stops.Count) location = 0; //depot else location = tour.Stops[i]; Point locationPoint = new Point(border + ((int)((coordinates[location, 0] - xMin) * xStep)), bitmap.Height - (border + ((int)((coordinates[location, 1] - yMin) * yStep)))); tourPoints[i + 1] = locationPoint; if (i != -1 && i != tour.Stops.Count) { Brush customerBrush = Brushes.Black; t += Content.GetDistance( lastCustomer, location); if (t < readyTime[location]) { t = readyTime[location]; customerBrush = Brushes.Orange; } else if (t > dueTime[location]) { customerBrush = Brushes.Red; } t += serviceTime[location]; customerBrushes[i] = customerBrush; } lastCustomer = location; } graphics.DrawPolygon(pens[((currentTour >= pens.Length) ? (pens.Length - 1) : (currentTour))], tourPoints); for (int i = 0; i < tour.Stops.Count; i++) { graphics.FillRectangle(customerBrushes[i], tourPoints[i + 1].X - 3, tourPoints[i + 1].Y - 3, 6, 6); } graphics.FillEllipse(Brushes.Blue, tourPoints[0].X - 5, tourPoints[0].Y - 5, 10, 10); currentTour++; } } else { Point locationPoint; //just draw customers for (int i = 1; i < coordinates.Rows; i++) { locationPoint = new Point(border + ((int)((coordinates[i, 0] - xMin) * xStep)), bitmap.Height - (border + ((int)((coordinates[i, 1] - yMin) * yStep)))); graphics.FillRectangle(Brushes.Black, locationPoint.X - 3, locationPoint.Y - 3, 6, 6); } locationPoint = new Point(border + ((int)((coordinates[0, 0] - xMin) * xStep)), bitmap.Height - (border + ((int)((coordinates[0, 1] - yMin) * yStep)))); graphics.FillEllipse(Brushes.Blue, locationPoint.X - 5, locationPoint.Y - 5, 10, 10); } } } for (int i = 0; i < pens.Length; i++) pens[i].Dispose(); } } }