如何在Gurobi运输问题求解中输出总最小成本?
使用Gurobi在Python中求解运输问题及总成本输出疑问
运输问题是一类线性规划(LP)问题,核心目标是找到从供应点(i)到需求点(j)运输单一产品的最小成本最优方案。
实现代码
import gurobipy as gp from gurobipy import GRB import csv import numpy m = 2 n = 4 # 定义数据 supply = [100000, 100000] # 供应节点供应量 demand = [40500, 22300, 85200, 47500] # 需求节点需求量 cost = [ [52, 32, 11, 69], [45, 84, 76, 15], ] # 从供应点i到需求点j的运输成本 theModel = gp.Model() # 定义决策变量 flow = theModel.addVars(m, n, lb=0, vtype=GRB.INTEGER, name="flow") # 定义供应约束 for i in range(m): theModel.addConstr(gp.quicksum(flow[i, j] for j in range(n)) <= supply[i], name=f"supply_{i}") # 定义需求约束 for j in range(n): theModel.addConstr(gp.quicksum(flow[i, j] for i in range(m)) >= demand[j], name=f"demand_{j}") # 定义目标函数 theModel.setObjective(gp.quicksum(flow[i, j] * cost[i][j] for i in range(m) for j in range(n)), sense=GRB.MINIMIZE) theModel.optimize() # 输出结果 if theModel.status == GRB.OPTIMAL: print(f"找到最优解,目标函数值(总最小成本): {theModel.objVal:.2f}") for i in range(m): for j in range(n): if flow[i, j].x > 0: print(f"从供应点{i+1}到需求点{j+1}的运输量: {flow[i, j].x:.0f}") else: print("未找到可行解。")
问题说明
目前已能输出供应点到需求点的最优运输量,但不清楚如何输出该方案的总最小成本?已知运输量为{flow[i, j].x:.0f},是否需要累加各运输路径的成本来计算总最小成本?
运行输出(翻译后)
找到最优解(容差1.00e-04) 最优目标值4.575800000000e+06,最优边界4.575800000000e+06,间隙0.0000% 找到最优解,目标函数值(总最小成本): 4575800.00 从供应点1到需求点2的运输量: 14800 从供应点1到需求点3的运输量: 85200 从供应点2到需求点1的运输量: 40500 从供应点2到需求点2的运输量: 7500 从供应点2到需求点4的运输量: 47500
解答
不需要手动累加各路径成本,Gurobi已经直接通过theModel.objVal给出了目标函数的最优值,也就是总最小成本——你当前的代码里已经输出了这个值。
如果需要手动验证结果的正确性,可以通过遍历所有运输路径,用运输量乘以对应路径成本再求和,示例代码如下:
# 手动计算总最小成本用于验证 total_manual_cost = 0.0 for i in range(m): for j in range(n): if flow[i, j].x > 0: total_manual_cost += flow[i, j].x * cost[i][j] print(f"手动计算的总最小成本: {total_manual_cost:.2f}")
运行这段代码会得到和objVal一致的结果,两种方式可以互相验证。
内容的提问来源于stack exchange,提问作者C.Unbay
相关产品推荐
相关产品推荐

