簡體   English   中英

TSP 問題:旅行者不訪問所有節點 - Google OR-tools

[英]TSP problem: traveller does not visit all nodes - Google OR-tools

語境:

我正在處理一種調度問題,其中我有一組任務和機器。 所有任務都必須分配給機器(不必全部分配)。 除此之外,我必須計算在兩台機器之間轉移產品的成本。

首先,我的問題是護士分配: https://developers.google.com/optimization/scheduling/employee_scheduling

但是,我不知道如何獲得更換機器的成本,這意味着將材料從一台機器帶到另一台機器。

為了考慮與流程順序的任務分配,我建立了二進制變量X[w, o, j] ,其中w是機器, o是操作, j是工藝計划上的 position。

為了計算更換機器的成本,我還建立了另一個二進制變量 T[w1, w2, j-1, j],它表明在工藝計划的兩個后續位置中是否存在從一台機器到另一台機器的材料轉換。

一些代碼

# Create the decision variabl
X = {}
for w in range(num_machines):
    for p in range(num_operations):
        for j in range(num_operations):
            X[w, p, j] = model.NewBoolVar('X_{}_{}_{}'.format(w + 1, p + 1, j + 1))
T = {}
for w1 in range(num_machines):
    for w2 in range(num_machines):
        for j in range(1, num_operations):
            #if w1 != w2:
                # T[w1, w2] = model.NewBoolVar(f'T_{w1}_{w2}') # using f-string notation
            T[w1, w2, j-1, j] = model.NewBoolVar('T_{}_{}_{}_{}'.format(w1 + 1, w2 + 1, j, j + 1))

B = model.NewBoolVar('B')     # declaring an intermediate variable

我試圖實現一些約束:

1) The number of transitions must be equal the number of operations -1
  number_transitions = sum(
        T[(w1, w2, j-1, j)] 
        for w1 in range(num_machines) 
        for w2 in range(num_machines)
        for j in range(1, num_operations)

        )
    model.Add(number_transitions == num_operations - 1)

因此,為了建立 X 和 TI 之間的關系,嘗試了 2 種不同的方法,但其中任何一種都有效。

第一種方式:

# Implementing B == [X1 + X2]
for w1 in all_machines:
    for w2 in all_machines:
        for p1 in all_operations:
            for p2 in all_operations:
                for j in range(1, num_operations):
                    model.Add(X[w1, p1, j-1] + X[w2, p2, j] == 2).OnlyEnforceIf(B)
                    model.Add(X[w1, p1, j-1] + X[w2, p2, j] != 2).OnlyEnforceIf(B.Not())

# Reinforcing the value of T
for w1 in all_machines:
    for w2 in all_machines:
        for j in range(1, num_operations):
            model.Add(T[w1, w2, j-1, j] == 1).OnlyEnforceIf(B)
            model.Add(T[w1, w2, j-1, j] == 0).OnlyEnforceIf(B.Not())

第二種方式

 for p in all_operations:
     for w1 in all_machines:
         for w2 in all_machines:
             for j in range(1, num_operations):
                 model.Add((X[w1, p, j-1] + X[w2, p, j]) == T[w1, w2, j-1, j] + 1)

在這兩種方式中,當我運行代碼時,它返回的結果只是不會在兩台機器之間進行轉換的解決方案,這意味着這些約束沒有被正確讀取。

我想知道是否有更好的方法通過建立變量 X 和 T 之間的關系來解決這個問題。

我想它可以像 TSP 一樣解決,但在我的情況下,並非所有節點都被訪問,而只是執行任務所需的節點(機器)。

有人知道我該如何解決這個問題? 或者你有一個例子可以發給我嗎?

提前致謝,

您應該看一下帶有轉換的 Jobshop 調度示例

特別是,它維護了同一台機器上任務之間的直接后繼圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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