簡體   English   中英

如何用 octapy 中的時間窗對時間相關的車輛路徑問題進行建模?

[英]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?

我有幾個關於建模的問題:

  1. OctaPy 如何對時間依賴性進行建模,即根據一天中的不同時間表示旅行持續時間的不同邊權重?
  2. 如果每個點都需要訪問 X 次,我該如何對需求點進行建模?
  3. 如果要訪問一個請求點 X 次,我如何強制執行時間窗口間隙,以使訪問之間的持續時間至少為固定持續時間(例如 1 小時)?
  1. OptaPy 以您對時間依賴性建模的方式對時間依賴性進行建模。 也就是說,無論您使用什么來建模時間依賴性(可能是邊、列表、矩陣、類等),OptaPy 都可以在其約束中使用它。

  2. 如果 X 是預先知道的,對於每個需求點,您創建它的 X 個副本並將其放入@problem_fact_collection_property字段中。 如果事先不知道 X,請考慮使用實時規划 ( https://www.optapy.org/docs/latest/repeated-planning/repeated-planning.html#realTimePlanning )。

  3. 這取決於您如何實現時間依賴性。 當 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM