繁体   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