【问题标题】:TSP / CPP variant - subtour constraintTSP / CPP 变体 - 子旅游约束
【发布时间】:2019-05-24 12:00:52
【问题描述】:

我正在开发一个优化问题,它是 Traveling Salesman 的变体。在这种情况下,您不必访问所有城市,有一个必需的起点和终点,旅行长度有一个最小和最大界限,如果需要,您可以多次遍历每个弧,并且您有一个非线性与遍历的弧相关的目标函数(以及遍历每个弧的次数)。决策变量是整数,你遍历每条弧的次数。

我在 Pyomo 中开发了一个非线性整数程序,并且正在从 NEOS 服务器获取结果。但是我没有加入 subtour 约束,我的结果是两个断开连接的 subtour。

我可以找到 TSP 的整数规划公式,其中说明了如何制定 subtour 约束,但这与标准 TSP 有点不同,我正试图弄清楚如何开始。任何可以提供的帮助将不胜感激。

编辑:问题表述

50 arcs ,不是节点之间的穷举对。 50 决策变量 N_ab 是整数 >=0,对应于你从 a 遍历到 b 的次数。每个 N_ab 都有一个长度和利润。所有 ab 的 length_ab * N_ab 之和在最小和最大距离之间有两个约束。我有一个约束,即每个节点的 N_ab 总和等于节点外的 N_ab 总和,您可以根本不访问节点,也可以多次访问它。目标函数是非线性的,并且与弧对之间的相互作用有关(与 subtour 无关)。

Subtours:查看 math.uwaterloo.ca/tsp/methods/opt/subtour.htm ,该公式不适用,因为我不需要访问所有城市,并且可能无法访问。例如,假设我有 20 个节点和 50 条弧(所有弧长均为 10)。距离限制适用于长度为 30 的游览,这意味着我最多可以访问三个节点(从 A -> B -> C ->A = 长度 30 开始)。所以我根本不会访问其他节点。 TSP 子巡回消除将要求我有从节点子组 ABC 到未访问节点子组的边 - 这不是我的问题所需要的

【问题讨论】:

    标签: traveling-salesman integer-programming


    【解决方案1】:

    这是一种改编自奖品收集 TSP 的方法(例如,this paper)。设V 为所有节点的集合。我假设V 包含一个 depot 节点,称为节点 1,它必须在巡演中。 (如果没有,您可能可以添加一个充当此角色的虚拟节点。)

    x[i] 是一个决策变量,如果我们访问节点i 至少一次,则等于1,否则为0。 (您的模型中可能已经有这样的决策变量。) 添加这些约束,定义x[i]

    x[i] <= sum {j in V} N[i,j]    for all i in V
    M * x[i] >= N[i,j]             for all i, j in V
    

    换句话说:如果没有从节点i 出来的边,x[i] 不能等于 1,如果有任何边从节点 i 出来,x[i] 必须等于 1。 (这里,如果我们从ijN[i,j] 为 1,M 是一个足够大的数字,可能等于您可以遍历一条边的最大次数。)

    这里是 subtour-elimination 约束,为 V 的所有子集 S 定义,这样 S 包括节点 1,并为 V \ S 中的所有节点 i 定义:

    sum {j in S} (N[i,j] + N[j,i]) >= 2 * x[i]
    

    换句话说,如果我们访问不在S 中的节点i,那么必须至少有两条边进入或离开S。 (如果S 等于包含 1 的子巡回上的节点,子巡回将违反此约束。)

    我们还需要一个约束,要求节点 1 在巡演中:

    x[1] = 1
    

    我可能在方向索引上玩得有点快和松散,也就是说,我不确定你的模型是否设置了N[i,j] = N[j,i] 或类似的东西,但希望这个想法足够清晰,你可以修改我的方法为必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 2020-06-17
      • 2011-02-07
      • 2019-08-26
      • 2015-06-22
      相关资源
      最近更新 更多