无法复现CVRPTW路径可视化效果,请求技术协助
CVRPTW可视化代码问题排查与修复
问题背景
尝试复现CVRPTW(带时间窗车辆路径问题)的可视化效果,当前图表可生成,但存在错误警告,且未显示车辆行驶路径,与预期效果不符。
现有代码
from colour import Color import matplotlib.patches as mpatches plt.figure(figsize=(12,5)) plt.scatter(X, Y, color='blue') #DC plt.scatter(X[0], Y[0],color='red', marker='D') plt.annotate("DC",(X[0]-1,Y[0]-5.5)) #imprimir as rotas for r in range(len(rotas)): for n in range(len(rotas[r])-1): i = rotas[r][n] j = rotas[r][n+1] plt.plot([X[i],X[j]], [Y[i],Y[j]], color=Color(r), alpha=0.4) for r in range(len(temp_acum)): for n in range(len(temp_acum[r])): i = rotas[r][n] plt.annotate('$q_{%d}=%d$ |$t_{%d}=%d$' %(i, q[i], i, temp_acum[r][n]), (X[i]+1,Y[i])) patch = [mpatches.Patch(color=Color(n), label="Veiculo "+str(truck[n])+"|cap="+str(Q[truck[n]])) for n in range(len(truck))] plt.legend(handles=patch,loc='best') plt.xlabel('Distância X') plt.ylabel('Distância Y') plt.title('CVRPTW | Problema de Roteamento de Veículos com Janela de Tempos') plt.show()
问题分析与修复步骤
1. 缩进错误导致路径不绘制
Python是缩进敏感语言,原代码中绘制路径的两层for循环没有正确缩进,内层循环无法执行,导致路径完全不显示。修复后代码块:
#imprimir as rotas for r in range(len(rotas)): for n in range(len(rotas[r])-1): i = rotas[r][n] j = rotas[r][n+1] plt.plot([X[i],X[j]], [Y[i],Y[j]], color=Color(r), alpha=0.4)
2. Color类参数错误
直接传入整数r给Color()会触发警告,因为colour.Color仅接受颜色名称、十六进制值或RGB元组。可以生成一组离散颜色对应不同车辆:
# 生成对应车辆数量的渐变颜色列表 colors = list(Color("green").range_to(Color("purple"), len(rotas))) # 绘制路径时调用对应颜色 plt.plot([X[i],X[j]], [Y[i],Y[j]], color=colors[r], alpha=0.6) # 图例部分同步修改颜色引用 patch = [mpatches.Patch(color=colors[n], label="Veiculo "+str(truck[n])+"|cap="+str(Q[truck[n]])) for n in range(len(truck))]
3. 变量一致性检查
- 确认
rotas是二维列表,每个子列表代表一辆车的完整路径(包含从DC出发并返回DC的节点索引) - 检查
temp_acum的结构与rotas完全匹配,每个子列表对应车辆路径上的时间累积值 - 验证
X、Y、q、truck、Q等变量无索引越界、类型不匹配问题
修复后完整代码示例
from colour import Color import matplotlib.patches as mpatches import matplotlib.pyplot as plt # 需提前正确初始化X, Y, rotas, temp_acum, q, truck, Q等变量 plt.figure(figsize=(12,5)) plt.scatter(X, Y, color='blue') # DC节点标记 plt.scatter(X[0], Y[0], color='red', marker='D') plt.annotate("DC", (X[0]-1, Y[0]-5.5)) # 生成车辆路径对应的颜色列表 colors = list(Color("green").range_to(Color("purple"), len(rotas))) # 绘制车辆行驶路径 for r in range(len(rotas)): for n in range(len(rotas[r])-1): i = rotas[r][n] j = rotas[r][n+1] plt.plot([X[i], X[j]], [Y[i], Y[j]], color=colors[r], alpha=0.6) # 标注节点的装载量与时间信息 for r in range(len(temp_acum)): for n in range(len(temp_acum[r])): i = rotas[r][n] plt.annotate(f'$q_{{{i}}}={q[i]}$ | $t_{{{i}}}={temp_acum[r][n]}$', (X[i]+1, Y[i])) # 设置图例 patch = [mpatches.Patch(color=colors[n], label=f"Veiculo {truck[n]} | cap={Q[truck[n]]}") for n in range(len(truck))] plt.legend(handles=patch, loc='best') plt.xlabel('Distância X') plt.ylabel('Distância Y') plt.title('CVRPTW | Problema de Roteamento de Veículos com Janela de Tempos') plt.show()
内容的提问来源于stack exchange,提问作者betafico123
相关产品推荐
相关产品推荐

