You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework C#控制台应用无法识别OR-Tools指令求助

解决OR-Tools在.NET Framework WinForms中的编译错误

1. 确认依赖与项目配置

  • 卸载手动安装的Google.Protobuf,重新通过NuGet安装Google.OrTools——OR-Tools会自动引入适配版本的Protobuf,避免版本不兼容问题。
  • 检查项目目标框架:右键项目→属性→应用程序,确保目标框架为**.NET Framework 4.6.1及以上**,OR-Tools不支持更低版本。
  • 设置平台目标:右键项目→属性→生成,将平台目标改为x64(OR-Tools是原生库,不支持Any CPU或x86)。
  • 清理并重建项目:执行VS菜单→生成→清理解决方案,再重新生成,清除NuGet缓存导致的异常。

2. 修复编译错误细节

  • 确保代码顶部引入必要命名空间:
    using Google.OrTools.ConstraintSolver;
    using Google.OrTools.Tsp;
    
  • 若仍有错误,检查示例代码是否适配当前OR-Tools版本:官方示例可能随版本更新,可直接使用NuGet包内附带的Demo代码(路径:packages\Google.OrTools.x.x.x\examples\dotnet)。
实现点击地图点位+TSP路线生成(结合GMap.NET)

1. GMap.NET集成与点位采集

  • 通过NuGet安装GMap.NET.WindowsForms,在WinForms窗体中添加GMapControl控件,设置基础属性(如地图类型、初始坐标)。
  • 绑定鼠标点击事件记录点位:
    private List<LatLng> _selectedPoints = new List<LatLng>();
    
    private void gMapControl1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button != MouseButtons.Left) return;
        var latLng = gMapControl1.FromLocalToLatLng(e.X, e.Y);
        _selectedPoints.Add(latLng);
        // 在地图上添加蓝色标记
        var marker = new GMarkerGoogle(latLng, GMarkerGoogleType.blue);
        gMapControl1.Markers.Add(marker);
    }
    

2. TSP路线计算逻辑

  • 实现经纬度转距离的Haversine公式,生成OR-Tools所需的距离矩阵:
    private double GetHaversineDistance(LatLng p1, LatLng p2)
    {
        const double EarthRadius = 6371000; // 地球半径(米)
        var lat1Rad = Math.PI * p1.Lat / 180;
        var lat2Rad = Math.PI * p2.Lat / 180;
        var deltaLat = Math.PI * (p2.Lat - p1.Lat) / 180;
        var deltaLon = Math.PI * (p2.Lng - p1.Lng) / 180;
    
        var a = Math.Sin(deltaLat / 2) * Math.Sin(deltaLat / 2) +
                Math.Cos(lat1Rad) * Math.Cos(lat2Rad) *
                Math.Sin(deltaLon / 2) * Math.Sin(deltaLon / 2);
        var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
        return EarthRadius * c;
    }
    
  • 使用OR-Tools求解TSP:
    private List<int> CalculateTspRoute(List<LatLng> points)
    {
        int pointCount = points.Count;
        if (pointCount < 2) return new List<int>();
    
        // 构建距离矩阵
        long[,] distanceMatrix = new long[pointCount, pointCount];
        for (int i = 0; i < pointCount; i++)
        {
            for (int j = 0; j < pointCount; j++)
            {
                distanceMatrix[i, j] = (long)GetHaversineDistance(points[i], points[j]);
            }
        }
    
        // 初始化求解器
        var solver = new Solver("TspSolver");
        var routing = new RoutingModel(pointCount, 1, 0); // 1辆车,起点为第0个点位
        int transitCallback = routing.RegisterTransitCallback((long from, long to) => 
            distanceMatrix[(int)from, (int)to]);
        routing.SetArcCostEvaluatorOfAllVehicles(transitCallback);
    
        // 执行求解
        var searchParams = RoutingModel.DefaultSearchParameters();
        searchParams.FirstSolutionStrategy = FirstSolutionStrategy.Types.Value.PathCheapestArc;
        var assignment = routing.SolveWithParameters(searchParams);
    
        // 提取路线索引
        List<int> routeIndices = new List<int>();
        long currentIndex = routing.Start(0);
        while (!routing.IsEnd(currentIndex))
        {
            routeIndices.Add((int)currentIndex);
            currentIndex = assignment.Value(routing.NextVar(currentIndex));
        }
        routeIndices.Add((int)routing.End(0));
        return routeIndices;
    }
    

3. 在地图上绘制最优路线

  • 添加按钮触发路线生成与绘制:
    private void btnGenerateRoute_Click(object sender, EventArgs e)
    {
        if (_selectedPoints.Count < 2) return;
    
        var routeIndices = CalculateTspRoute(_selectedPoints);
        var routePoints = routeIndices.Select(i => _selectedPoints[i]).ToList();
        // 绘制红色路线
        var gRoute = new GMapRoute(routePoints, "TSP最优路线");
        gRoute.Stroke = new Pen(Color.Red, 3);
        gMapControl1.Routes.Add(gRoute);
    }
    

内容的提问来源于stack exchange,提问作者Syberin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:21:13