![](/img/trans.png)
[英]Using OptaPlanner to solve a Vehicle Routing Problem with Time Windows
[英]How to model a time-dependent vehicle routing problem with time windows in octapy?
我希望在 OctaPy 上使用時間窗對車輛路徑問題進行建模。 具體來說,這個問題涉及公共道路上的交通執法,因此停車管理員需要在 24 小時內對停車場和路段進行調查並多次訪問。
我將以下問題的答案作為開發我的問題的基礎: Is it possible to create a VRP solution using NetworkX?
我有幾個關於建模的問題:
OptaPy 以您對時間依賴性建模的方式對時間依賴性進行建模。 也就是說,無論您使用什么來建模時間依賴性(可能是邊、列表、矩陣、類等),OptaPy 都可以在其約束中使用它。
如果 X 是預先知道的,對於每個需求點,您創建它的 X 個副本並將其放入@problem_fact_collection_property
字段中。 如果事先不知道 X,請考慮使用實時規划 ( https://www.optapy.org/docs/latest/repeated-planning/repeated-planning.html#realTimePlanning )。
這取決於您如何實現時間依賴性。 當 OptaPy 支持 OptaPlanner 擁有的用於列表變量(以及內置列表影子變量)的新 VariableListener API 時,這會更容易。 在此之前,您需要在函數中進行計算。 使Edge
成為@planning_entity
並為其提供一個反向關系影子變量 ( https://www.optapy.org/docs/latest/shadow-variable/shadow-variable.html#bidirectionalVariable )。 將方法get_arrival_time(edge)
添加到Vehicle
以獲取其visited_edges_list
中給定Edge
的估計訪問時間。
def less_than_one_hour_between(visit_1: Edge, visit_2: Edge):
visit_1_arrival_time = visit_1.vehicle.get_arrival_time(visit_1)
visit_2_arrival_time = visit_2.vehicle.get_arrival_time(visit_2)
duration = visit_2_arrival_time - visit_1_arrival_time
return timedelta(hours=0) <= duration <= timedelta(hours=1)
def one_hour_between_consecutive_visits(constraint_factory):
return (
constraint_factory.for_each(Edge)
.join(Edge, Joiners.equal(lambda edge: edge.graph_from_node),
Joiners.equal(lambda edge: edge.graph_to_node))
.filter(lambda a, b: a is not b and less_than_one_hour_between(a, b))
.penalize('less than 1 hour between visits', HardSoftScore.ONE_HARD)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.