C#访问数组实现最低成本航班路径及货运趟次计算
解答
概念理解校验
你的理解完全正确:
flightpath是存储所有可选航线的二维数组,每个一维子数组对应一条从A到B的完整独立航线- 每条航线下的单个
Hop就是组成航线的航段(也就是你说的Trip对应的经停航段),其@base字段存储航段的起止点,capacity为该航段单趟最大载重,price为该航段单趟运输价格。
现有代码问题修正
你当前写的findRoute方法存在逻辑漏洞:最优航线的判断写在了内层航段遍历循环里,会出现还没累计完整条航线的总成本、没校验完全部航段载重限制时,就提前更新最优航线的问题。修正后的单趟选线逻辑需要把最优值判断移到单条航线遍历完成之后。
全量货物最低成本运输计算逻辑
要计算运完指定总重量货物的最低成本、对应所需趟次,按以下规则实现即可:
- 先预处理每条航线的基础属性:
- 单趟最大载重:取整条航线所有航段
capacity的最小值——串联航段的最严格载重限制,决定单趟最多能运多少货 - 单趟总成本:累加整条航线所有航段的
price - 若航线单趟最大载重为0直接跳过,属于不可用航线
- 单趟最大载重:取整条航线所有航段
- 对每条可用航线计算运输总需求:
- 所需趟次 = 向上取整(总货物重量 / 航线单趟最大载重)
- 运输总成本 = 所需趟次 * 航线单趟总成本
- 遍历所有航线,选出总成本最低的方案即可。
实现代码
你可以直接新增如下方法,同时修正原有findRoute的逻辑:
// 新增:运输方案返回结构 class TransportPlan { public int RouteIndex { get; set; } public int TotalTrips { get; set; } public double TotalCost { get; set; } public int SingleTripMaxWeight { get; set; } public double SingleTripCost { get; set; } } // 修正原有单趟选线逻辑的bug int FindBestSingleTripRoute(int weight) { int bestRoute = -1; double lowestPrice = double.MaxValue; for (int routeIdx = 0; routeIdx < flightpath.Length; routeIdx++) { double routeTotalPrice = 0; bool isRouteValid = true; // 先遍历完整条航线,校验载重、算总成本 for (int hopIdx = 0; hopIdx < flightpath[routeIdx].Length; hopIdx++) { Hop currentHop = flightpath[routeIdx][hopIdx]; if (weight > currentHop.capacity) { isRouteValid = false; break; } routeTotalPrice += currentHop.price; } // 整条航线校验通过后再对比价格 if (isRouteValid && routeTotalPrice < lowestPrice) { lowestPrice = routeTotalPrice; bestRoute = routeIdx; } } return bestRoute; } // 新增:计算全量货物最低成本运输方案 TransportPlan FindLowestCostPlan(int totalCargoWeight) { TransportPlan bestPlan = null; double lowestTotalCost = double.MaxValue; for (int routeIdx = 0; routeIdx < flightpath.Length; routeIdx++) { int minCapacity = int.MaxValue; double singleTripCost = 0; // 计算当前航线的单趟属性 foreach (Hop hop in flightpath[routeIdx]) { singleTripCost += hop.price; if (hop.capacity < minCapacity) minCapacity = hop.capacity; } if (minCapacity <= 0) continue; // 跳过不可用航线 // 计算需要的趟次:向上取整 int trips = (int)Math.Ceiling(totalCargoWeight * 1.0 / minCapacity); double totalCost = trips * singleTripCost; // 对比更新最优方案 if (totalCost < lowestTotalCost) { lowestTotalCost = totalCost; bestPlan = new TransportPlan { RouteIndex = routeIdx, TotalTrips = trips, TotalCost = totalCost, SingleTripMaxWeight = minCapacity, SingleTripCost = singleTripCost }; } } return bestPlan; }
调用示例
你可以在Main方法里直接调用测试,和你注释里的预期结果对齐:
static void Main(string[] args) { Program prg = new Program(); prg.initRoutes(); // 单趟39重量选线测试 var singleTripRoute = prg.FindBestSingleTripRoute(39); // 125总重量的最低成本运输方案测试,对应你注释里的预设场景 var planFor125 = prg.FindLowestCostPlan(125); Console.WriteLine($"最优航线索引:{planFor125.RouteIndex},所需趟次:{planFor125.TotalTrips},总成本:{planFor125.TotalCost}"); }
按你当前初始化的航线数据计算:
- 航线0单趟最大载重150,单趟成本600,运125需要1趟,总成本600
- 航线1单趟最大载重25(C->B航段限重25),单趟成本100,运125需要5趟,总成本500
- 航线2单趟最大载重80(E->B航段限重80),单趟成本300,运125需要2趟,总成本600
如果计算结果和你注释里的预期值有差异,一般是因为存在中转囤货、按实际载重分段计价这类你没写在代码里的规则,补充对应规则后调整单趟成本、趟次的计算逻辑即可。
内容的提问来源于stack exchange,提问作者Weltenwanderer
相关产品推荐
相关产品推荐

