1:假设XY坐标系中有5个点ABCDE,位置随机,起点与终点也随机但相同,如假设A是起点,终点也是A,相似A-B B-C C-D D-E E-A 等 ;
2:分别获取每条线段的距离,然后相加,使之得到的最终距离最短;
3:给出这五个点的排列顺序? 谢谢。
备注:是求各段距离和的最小值,不是最短距离 !
2:分别获取每条线段的距离,然后相加,使之得到的最终距离最短;
3:给出这五个点的排列顺序? 谢谢。
备注:是求各段距离和的最小值,不是最短距离 !
解决方案
10
5个点可以用穷举。
假如是一般性解答,请搜索“旅行售货员问题”。
假如是一般性解答,请搜索“旅行售货员问题”。
30
利用穷举法把全部排列顺序列举出来,在比较距离总和
private List<List<Point>> ABCDE(Point pp, params Point[] ps) { if (ps.Length != 4) throw new ArgumentOutOfRangeException(); var s = ps.ToList(); List<List<Point>> result = new List<List<Point>>(); foreach (var p0 in s) { var s1 = s.Where(p => p != p0); foreach (var p1 in s1) { var s2 = s1.Where(p => p != p1); foreach (var p2 in s2) { var s3 = s2.Where(p => p != p2); foreach (var p3 in s3) { var s4 = s3.Where(p => p != p3); result.Add(new List<Point> { pp, p0, p1, p2, p3, pp }); } } } } return result; }
调用
Point p1 = new Point(); Point p2 = new Point(0,1); Point p3 = new Point(1,2); Point p4 = new Point(2,1); Point p5 = new Point(2,0); var arr = ABCDE(p1, p2, p3, p4, p5); List<Point> r = new List<Point>(); double length = double.MaxValue; foreach (var item in arr) { double tmp = 0; for (int i = 0; i < 5; i++) { tmp += Math.Sqrt(Math.Pow((item[i + 1].X - item[i].X), 2) + Math.Pow((item[i + 1].Y - item[i].Y), 2)); } Console.Write(string.Join(" ", item.Select(p => p.ToString()))+"--"); Console.WriteLine(tmp); if (length > tmp) { length = tmp; r = item; } } Console.WriteLine("距离总和最短方案:"); Console.Write(string.Join(" ", r.Select(p => p.ToString())) + "--"); Console.WriteLine(length);
结果
{X=0,Y=0} {X=0,Y=1} {X=1,Y=2} {X=2,Y=1} {X=2,Y=0} {X=0,Y=0}--6.82842712474619 {X=0,Y=0} {X=0,Y=1} {X=1,Y=2} {X=2,Y=0} {X=2,Y=1} {X=0,Y=0}--7.88634951737267 {X=0,Y=0} {X=0,Y=1} {X=2,Y=1} {X=1,Y=2} {X=2,Y=0} {X=0,Y=0}--8.65028153987289 {X=0,Y=0} {X=0,Y=1} {X=2,Y=1} {X=2,Y=0} {X=1,Y=2} {X=0,Y=0}--8.47213595499958 {X=0,Y=0} {X=0,Y=1} {X=2,Y=0} {X=1,Y=2} {X=2,Y=1} {X=0,Y=0}--9.12241749487247 {X=0,Y=0} {X=0,Y=1} {X=2,Y=0} {X=2,Y=1} {X=1,Y=2} {X=0,Y=0}--7.88634951737267 {X=0,Y=0} {X=1,Y=2} {X=0,Y=1} {X=2,Y=1} {X=2,Y=0} {X=0,Y=0}--8.65028153987289 {X=0,Y=0} {X=1,Y=2} {X=0,Y=1} {X=2,Y=0} {X=2,Y=1} {X=0,Y=0}--9.12241749487247 {X=0,Y=0} {X=1,Y=2} {X=2,Y=1} {X=0,Y=1} {X=2,Y=0} {X=0,Y=0}--9.88634951737268 {X=0,Y=0} {X=1,Y=2} {X=2,Y=1} {X=2,Y=0} {X=0,Y=1} {X=0,Y=0}--7.88634951737267 {X=0,Y=0} {X=1,Y=2} {X=2,Y=0} {X=0,Y=1} {X=2,Y=1} {X=0,Y=0}--10.9442719099992 {X=0,Y=0} {X=1,Y=2} {X=2,Y=0} {X=2,Y=1} {X=0,Y=1} {X=0,Y=0}--8.47213595499958 {X=0,Y=0} {X=2,Y=1} {X=0,Y=1} {X=1,Y=2} {X=2,Y=0} {X=0,Y=0}--9.88634951737268 {X=0,Y=0} {X=2,Y=1} {X=0,Y=1} {X=2,Y=0} {X=1,Y=2} {X=0,Y=0}--10.9442719099992 {X=0,Y=0} {X=2,Y=1} {X=1,Y=2} {X=0,Y=1} {X=2,Y=0} {X=0,Y=0}--9.30056307974577 {X=0,Y=0} {X=2,Y=1} {X=1,Y=2} {X=2,Y=0} {X=0,Y=1} {X=0,Y=0}--9.12241749487247 {X=0,Y=0} {X=2,Y=1} {X=2,Y=0} {X=0,Y=1} {X=1,Y=2} {X=0,Y=0}--9.12241749487247 {X=0,Y=0} {X=2,Y=1} {X=2,Y=0} {X=1,Y=2} {X=0,Y=1} {X=0,Y=0}--7.88634951737267 {X=0,Y=0} {X=2,Y=0} {X=0,Y=1} {X=1,Y=2} {X=2,Y=1} {X=0,Y=0}--9.30056307974577 {X=0,Y=0} {X=2,Y=0} {X=0,Y=1} {X=2,Y=1} {X=1,Y=2} {X=0,Y=0}--9.88634951737268 {X=0,Y=0} {X=2,Y=0} {X=1,Y=2} {X=0,Y=1} {X=2,Y=1} {X=0,Y=0}--9.88634951737268 {X=0,Y=0} {X=2,Y=0} {X=1,Y=2} {X=2,Y=1} {X=0,Y=1} {X=0,Y=0}--8.65028153987289 {X=0,Y=0} {X=2,Y=0} {X=2,Y=1} {X=0,Y=1} {X=1,Y=2} {X=0,Y=0}--8.65028153987289 {X=0,Y=0} {X=2,Y=0} {X=2,Y=1} {X=1,Y=2} {X=0,Y=1} {X=0,Y=0}--6.82842712474619 距离总和最短方案: {X=0,Y=0} {X=0,Y=1} {X=1,Y=2} {X=2,Y=1} {X=2,Y=0} {X=0,Y=0}--6.82842712474619
10
这是个NP问题,所以精确解只能是枚举全部的线路求最小值,否则要考虑效率的话只能求出近似的解