用Java实现局部搜索(2-opt)解决TSP问题
我试图实现这一点,但我找不到一个好的文件或描述如何做到这一点,你们能告诉我正确的方向吗?我确实有一个C语言的实现,但我不知道如何将代码转换成Java 根据一条评论,我正在添加一些我无法转换为Java的C代码:用Java实现局部搜索(2-opt)解决TSP问题,java,heuristics,traveling-salesman,Java,Heuristics,Traveling Salesman,我试图实现这一点,但我找不到一个好的文件或描述如何做到这一点,你们能告诉我正确的方向吗?我确实有一个C语言的实现,但我不知道如何将代码转换成Java 根据一条评论,我正在添加一些我无法转换为Java的C代码: //T with the smallest func(t) static T MinBy<T, TComparable>(this IEnumerable<T> xs, Func<T, TComparable> func) where TCo
//T with the smallest func(t)
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);
}
//returns an ordered set of nearest neighbors
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;
}
}
//具有最小func(T)的T
静态T MinBy(此IEnumerable xs,Func Func),其中TComparable:IComparable{
返回xs.DefaultIfEmpty().Aggregate((maxSoFar,elem)=>func(elem).CompareTo(func(maxSoFar))>0?maxSoFar:elem);
}
//返回最近邻的有序集
静态IEnumerable近邻(此IEnumerable停止){
var stopsLeft=stops.ToList();
对于(var stop=stopsLeft.First();stop!=null;stop=stopsLeft.MinBy(s=>stop.Distance(stop,s))){
stopsLeft.移除(停止);
回程停止;
}
}
我想你不熟悉C。因此,我将尝试简单地解释一些事情
IEnumerable
是C#与java的Iterable
Func
是一个方法的抽象,该方法的输入是T,返回值是V。C#与Java不同,它支持闭包,但它们实际上类似于Java匿名类,没有任何语法上的麻烦。所以基本上,MinBy的第二个参数是一种从T中提取属性的方法,用于比较。您可以很容易地用匿名类实现相同的抽象,但它不会那么简洁this
修饰符表示这是一个扩展方法。它仅用于语法上的糖类目的。当一个方法是这样定义的,这意味着它可以在第一个参数(前面有this修饰符)的实例上调用。这允许您编写如下代码:
IEnumerable seq=get()
序号:MinBy(/*bla*/)代码>
MyUtility.MinBy(s, /*bla*/);
您可能不需要这种高层次的抽象(坦白说,java现在并不是为它而构建的),所以您要做的是定义一个方法,而不是MinBy,该方法输入一个Iterable leftStops和另一个Stop currentStop,并从leftStops中找到最接近currentStop的Stop
比如:
Stop findClosest(Stop currentStop, Iterable<Stop> left stops) {/*implement me*/}
因此,我们只剩下以下算法:
希望现在更清楚了。为什么不把无法转换的部分发布出来,我们来看看我们能提供什么帮助:)另外,请添加将输入构造为最近邻居的代码。我现在添加了一个部分答案,以便您更好地理解所写的内容。
static IEnumerable<Stop> NearestNeighbors(IEnumerable<Stop> stops){
IEnumerable<Stop> result = new List<stop>();
var stopsLeft = stops.ToList();
for (var stop = stopsLeft.First(); stop != null; stop = stopsLeft.MinBy(s => Stop.Distance(stop, s))){
stopsLeft.Remove(stop);
result.Add(stop);
}
return result;
}