.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
相关产品推荐
相关产品推荐

