用Java实现局部搜索(2-opt)解决TSP问题

用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

我试图实现这一点,但我找不到一个好的文件或描述如何做到这一点,你们能告诉我正确的方向吗?我确实有一个C语言的实现,但我不知道如何将代码转换成Java

根据一条评论,我正在添加一些我无法转换为Java的C代码:

//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*/}
    
    因此,我们只剩下以下算法:

  • 输入站点列表
  • 下一站=第一站
  • 从停止列表中删除下一个停止
  • 找到距离下一站最近的站并设置下一站=最近
  • 如果还有更多站点,请转到3
  • 按到站顺序返回站点

  • 希望现在更清楚了。

    为什么不把无法转换的部分发布出来,我们来看看我们能提供什么帮助:)另外,请添加将输入构造为最近邻居的代码。我现在添加了一个部分答案,以便您更好地理解所写的内容。
     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;
          }