gpt4 book ai didi

c# - 在一个 LINQ 查询中使用最近邻算法解决旅行商问题?

转载 作者:太空狗 更新时间:2023-10-29 23:17:47 25 4
gpt4 key购买 nike

给定

List<Point> cities = /* ... */ ;
double distance(Point a, Point b) { /* ... */ };

是否有单个 LINQ 查询通过最近邻算法返回旅行推销员最短路线作为 List<int> cities 的指数?

最佳答案

我不认为你可以在一个查询中完成所有事情,算法的某些部分必须单独实现。

这是一个蛮力实现,它检查所有城市排列并返回访问所有城市的最短路径:

var bestPath =
cities.Permutations()
.MinBy(
steps => steps.Aggregate(
new { Sum = 0, Previous = default(Point) },
(acc, c) =>
new
{
Sum = acc.Sum + (acc.Previous != null ? Distance(c, acc.Previous) : 0 ),
Previous = c
},
acc => acc.Sum));

Permutations扩展方法定义如下:

public static IEnumerable<IEnumerable<T>> Permutations<T>(this IEnumerable<T> source)
{
var query =
from item in source
from others in source.SkipOnce(item).Permutations()
select new[] { item }.Concat(others);
return query.DefaultIfEmpty(Enumerable.Empty<T>());
}

public static IEnumerable<T> SkipOnce<T>(this IEnumerable<T> source, T itemToSkip)
{
bool skipped = false;
var comparer = EqualityComparer<T>.Default;
foreach (var item in source)
{
if (!skipped && comparer.Equals(item, itemToSkip))
skipped = true;
else
yield return item;
}
}

当然有很多更好的方法来解决这个问题,但是这个是有效的......大部分是在一个查询中,单独实现的唯一部分并不特定于手头的问题并且可以重用用于其他任务。

编辑:糟糕,我刚刚意识到我还使用了非标准的 MinBy 方法;你可以找到它in the MoreLinq project

关于c# - 在一个 LINQ 查询中使用最近邻算法解决旅行商问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7538622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com