frvcpy:FRVCP的开源解算器
丰富FRVCP的快速优化解决方案
什么是FRVCP?
给定一辆电动汽车(EV),它被分配了一些要访问的位置序列(a固定路径),的固定路线车辆充电问题(FRVCP)是一个寻找充电操作最佳插入路线的问题,该路线可使电动汽车以能量可行的方式穿越该路线所需的时间最小化。
安装
在使用Python 3.6+的虚拟环境中,可以通过以下方式安装frvcpy
管道 安装 玻璃钢
测试安装
进口 frvcpy.测试
玻璃钢.测试.全部运行()
或从命令行:
frvcpy-测试
使用frvcpy
使用兼容的实例文件(查看模式),从Python脚本中解决FRVCP:
从 玻璃钢 进口 解算器
路线 = [0,40,12,33,38,16,0] #使能源可行的途径
q_输入 = 16000 #车辆的初始能量水平
#使用文件中的现有实例
frvcp求解器 = 解算器.解算器(“instances/frvcpy-instance.json”, 路线, q_输入)
#运行算法
期间, feas_route(有限元_路线) = frvcp解算器.解决()
#将解决方案写入文件
frvcp求解器.write_solution(写入解决方案)(“my-solution.xml”, 实例名称=“frvcpy-instance”)
打印((f)“持续时间:{期间:.4}")
#持续时间:7.339
打印((f)“节能路线:\n个{feas_route(有限元_路线)}")
#节能路线:
#[(0,无),(40,无)
或从命令行:
玻璃钢 --实例=实例/frvcpy-instance.json --路线=0,40,12,33,38,16,0 --奇尼特=16000 --输出=my-solution.xml(我的解决方案.xml)#持续时间:7.339
#节能路线:
#[(0,无),(40,无)
解决方案写在VRP-REP软件易于导入和可视化的格式VRP-REP映射器(提供正式的解决方案规范在这里).
注:示例问题实例可在实例
目录项目主页。为了方便访问示例文件,建议克隆存储库。
实例转换
实例翻译可用于根据VRP-REP规范格式化的某些E-VRP实例(可获得的在这里).
可以通过Python API进行翻译
从 油炸馅饼 进口 翻译
#选项1)将翻译后的实例写入文件
翻译.翻译(“instances/vrprep-instance.xml”, 目标文件名(_F)=“instances/my-new-instance.json”)
#选项2)使实例对象直接传递给解算器
frvcp_实例 = 翻译.翻译(“instances/vrprep-instance.xml”)
或使用命令行:
#从CLI中,唯一的选项是将转换后的实例写入文件frvcpy-翻译 实例/vrprep-instance.xml 实例/my-new-instance.json
注意:如果以“.xml”结尾的实例被传递给解算器,则假定它是VRP-REP实例,解算器将自动尝试转换它。
VRP-REP实例的翻译要求
frvcpy的转换器假设VRP-REP实例的格式与Montoya等人(2017年)的实例:
- 客户服务被识别为
<节点>
具有属性的元素type=“2”
- 充电站节点具有
<自定义>
包含cs_类型
要素
- 对于每种独特的CS类型
t吨
出现在那些cs_类型
元素,存在充电功能
具有属性的元素cs_type=t
- 这些
功能
元素是充电功能
中的元素车辆_配置文件
的习俗
要素
- 仓库具有节点ID 0,N个客户具有ID{1,…,N},而CS具有ID{N+1,…,N+C}
这种情况的一个很好的例子是存储库中的示例VRP-REP实例.
以下是一个满足这些要求的较小示例:
<?xml version=“1.0”encoding=“UTF-8”?>
<实例>
<网络>
<节点>
<节点 标识="0" 类型="0">
<cx>74.83</cx>
<cy>51.85</cy>
</节点>
<节点 标识="1" 类型="1">
<cx>68.77</cx>
<cy>75.69</cy>
</节点>
<节点 标识="11" 类型=“2”>
<cx>57</cx>
<cy>57.04</cy>
<自定义>
<cs_type>快速的</cs_type>
</自定义>
</节点>
</节点>
<欧几里德/>
<小数>14</小数>
</网络>
<车队>
<车辆配置文件 类型="0">
<离开模式>0</deature_node>
<到达节点>0</arrival_node>
<速度系数>25</speed_factor>
<自定义>
<消耗_比率>0.125</consumption_rate>
<电池容量>16</电池容量>
<充电功能>
<功能 cs_类型=“快速”>
<断点>
<电池液位>0</battery_level>
<充电时间>0</charging_time>
</断点>
<断点>
<电池液位>13.6</battery_level>
<充电时间>0.317</charging_time>
</断点>
<断点>
<电池液位>15.2</battery_level>
<充电时间>0.383</charging_time>
</断点>
<断点>
<电池水平>16</battery_level>
<充电时间>0.517</charging_time>
</断点>
</功能>
</charging_functions>
</自定义>
</vehicle_profile>
</车队>
<请求>
<请求 标识="1" 节点="1">
<服务时间>0.5</service_time>
</request>
</请求>
</instance>
解决者
为了求解FRVCP,frvcpy实现了Froger等人(2019)的标记算法,在低运行时提供了最佳解决方案。该算法适应了现实问题的特点,例如非线性充电功能、异构充电站技术和站点之间的多次CS访问。
其他信息
有关解算器中使用的算法的详细信息,请参见Froger等人(2019年).
HAL上提供了此软件包的摘要在这里.