Python TSP问题:Traveler不会访问所有节点-谷歌或工具

Python TSP问题:Traveler不会访问所有节点-谷歌或工具,python,or-tools,Python,Or Tools,背景: 我正在处理一种调度问题,其中我有一组任务和机器。必须将所有任务分配给机器(并非所有机器都需要)。除此之外,我还必须计算在两台机器之间转移产品的成本 首先,我将我的问题放在护士任务中: 然而,我不知道如何获得更换机器的成本,这意味着,将材料从一台机器转移到另一台机器 考虑进程序列的任务分配,我建立了二进制变量x[w,o,j],其中w是机器,O是运算,j是进程计划上的位置。p> 为了计算更换机器的成本,我还建立了另一个二元变量T[w1,w2,j-1,j],表示在工艺计划的两个后续位置是否存在

背景:

我正在处理一种调度问题,其中我有一组任务和机器。必须将所有任务分配给机器(并非所有机器都需要)。除此之外,我还必须计算在两台机器之间转移产品的成本

首先,我将我的问题放在护士任务中:

然而,我不知道如何获得更换机器的成本,这意味着,将材料从一台机器转移到另一台机器

考虑进程序列的任务分配,我建立了二进制变量x[w,o,j],其中w是机器,O是运算,j是进程计划上的位置。p> 为了计算更换机器的成本,我还建立了另一个二元变量T[w1,w2,j-1,j],表示在工艺计划的两个后续位置是否存在从一台机器到另一台机器的材料过渡

一些代码:

我已尝试实施一些约束:

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和T之间的关系,我尝试了两种不同的方法,但都奏效了

第一条路:

第二种方式:

在这两种情况下,当我运行代码时,它返回的结果都是不在两台机器之间进行转换的解决方案,这意味着这些约束没有被正确读取

我想知道,通过建立变量X和T之间的关系,是否有更好的方法来解决这个问题

我想可以像TSP一样求解,但在我的例子中,并不是所有节点都被访问,而只是执行任务所需的节点(机器)

有人知道我如何解决这个问题吗? 或者你能给我举个例子吗


提前感谢,

您应该看看


特别是,它维护了同一台机器上任务之间的直接后续关系图。

Xposted:感谢您的回复。在我的情况下,任务持续时间并不重要,也不一定所有的机器都会被使用。我不确定此示例是否适用于我的情况。此示例尝试最小化转换成本:
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)
# 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)