旅行商问题,2

编程入门 行业动态 更新时间:2024-10-17 13:31:26
本文介绍了旅行商问题,2-OPT算法的C#实现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

您好 有人可以给我的2-OPT算法code样品旅行商问题。现在即时通讯使用近邻找到路径,但这种方法是远远不够完善,部分研究后,我发现2-OPT算法,将更正路径可接受的水平。我发现了一些示例应用程序,但没有源$ C ​​$ C。

Hello Can someone give me a code sample of 2-opt algorithm for traveling salesman problem. For now im using nearest neighbour to find the path but this method is far from perfect, and after some research i found 2-opt algorithm that would correct that path to the acceptable level. I found some sample apps but without source code.

推荐答案

所以,我觉得无聊写的。它的看起来的喜欢它的工作原理,但我还没有测试过得很周全。它假定三角不等式,所有的边存在,诸如此类的事情。它的工作原理主要是像我概括的答案。它打印每一次迭代;最后一个是2-优化之一。

So I got bored and wrote it. It looks like it works, but I haven't tested it very thoroughly. It assumes triangle inequality, all edges exist, that sort of thing. It works largely like the answer I outlined. It prints each iteration; the last one is the 2-optimized one.

我敢肯定,它可以在无数的方式来改善。

I'm sure it can be improved in a zillion ways.

using System; using System.Collections.Generic; using System.Linq; namespace TSP { internal static class Program { private static void Main(string[] args) { //create an initial tour out of nearest neighbors var stops = Enumerable.Range(1, 10) .Select(i => new Stop(new City(i))) .NearestNeighbors() .ToList(); //create next pointers between them stops.Connect(true); //wrap in a tour object Tour startingTour = new Tour(stops); //the actual algorithm while (true) { Console.WriteLine(startingTour); var newTour = startingTour.GenerateMutations() .MinBy(tour => tour.Cost()); if (newTour.Cost() < startingTour.Cost()) startingTour = newTour; else break; } Console.ReadLine(); } private class City { private static Random rand = new Random(); public City(int cityName) { X = rand.NextDouble() * 100; Y = rand.NextDouble() * 100; CityName = cityName; } public double X { get; private set; } public double Y { get; private set; } public int CityName { get; private set; } } private class Stop { public Stop(City city) { City = city; } public Stop Next { get; set; } public City City { get; set; } public Stop Clone() { return new Stop(City); } public static double Distance(Stop first, Stop other) { return Math.Sqrt( Math.Pow(first.City.X - other.City.X, 2) + Math.Pow(first.City.Y - other.City.Y, 2)); } //list of nodes, including this one, that we can get to public IEnumerable<Stop> CanGetTo() { var current = this; while (true) { yield return current; current = current.Next; if (current == this) break; } } public override bool Equals(object obj) { return City == ((Stop)obj).City; } public override int GetHashCode() { return City.GetHashCode(); } public override string ToString() { return City.CityName.ToString(); } } private class Tour { public Tour(IEnumerable<Stop> stops) { Anchor = stops.First(); } //the set of tours we can make with 2-opt out of this one public IEnumerable<Tour> GenerateMutations() { for (Stop stop = Anchor; stop.Next != Anchor; stop = stop.Next) { //skip the next one, since you can't swap with that Stop current = stop.Next.Next; while (current != Anchor) { yield return CloneWithSwap(stop.City, current.City); current = current.Next; } } } public Stop Anchor { get; set; } public Tour CloneWithSwap(City firstCity, City secondCity) { Stop firstFrom = null, secondFrom = null; var stops = UnconnectedClones(); stops.Connect(true); foreach (Stop stop in stops) { if (stop.City == firstCity) firstFrom = stop; if (stop.City == secondCity) secondFrom = stop; } //the swap part var firstTo = firstFrom.Next; var secondTo = secondFrom.Next; //reverse all of the links between the swaps firstTo.CanGetTo() .TakeWhile(stop => stop != secondTo) .Reverse() .Connect(false); firstTo.Next = secondTo; firstFrom.Next = secondFrom; var tour = new Tour(stops); return tour; } public IList<Stop> UnconnectedClones() { return Cycle().Select(stop => stop.Clone()).ToList(); } public double Cost() { return Cycle().Aggregate( 0.0, (sum, stop) => sum + Stop.Distance(stop, stop.Next)); } private IEnumerable<Stop> Cycle() { return Anchor.CanGetTo(); } public override string ToString() { string path = String.Join( "->", Cycle().Select(stop => stop.ToString()).ToArray()); return String.Format("Cost: {0}, Path:{1}", Cost(), path); } } //take an ordered list of nodes and set their next properties private static void Connect(this IEnumerable<Stop> stops, bool loop) { Stop prev = null, first = null; foreach (var stop in stops) { if (first == null) first = stop; if (prev != null) prev.Next = stop; prev = stop; } if (loop) { prev.Next = first; } } //T with the smallest func(T) private static T MinBy<T, TComparable>( this IEnumerable<T> xs, Func<T, TComparable> func) where TComparable : IComparable<TComparable> { return xs.DefaultIfEmpty().Aggregate( (maxSoFar, elem) => func(elem).CompareTo(func(maxSoFar)) > 0 ? maxSoFar : elem); } //return an ordered nearest neighbor set private static IEnumerable<Stop> NearestNeighbors(this IEnumerable<Stop> stops) { var stopsLeft = stops.ToList(); for (var stop = stopsLeft.First(); stop != null; stop = stopsLeft.MinBy(s => Stop.Distance(stop, s))) { stopsLeft.Remove(stop); yield return stop; } } } }

更多推荐

旅行商问题,2

本文发布于:2023-11-29 12:07:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1646353.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:旅行

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!