如何在 Or-tools 中对变量进行排序?

Posted

技术标签:

【中文标题】如何在 Or-tools 中对变量进行排序?【英文标题】:How to sort variables in Or-tools? 【发布时间】:2021-07-09 08:55:07 【问题描述】:

我正在使用 or-tools 来解决 CP 问题。求解器给出了一个可行的解决方案,如下所示。意思是:

 X1=345, X2=437, ..., X6=1150, X7=716, X8=788...etc.

random_list=[345, 437, 801, 981, 1068, 1150, 716, 788, 860, 982, 1069, 1151, 717, 789, 861, 944, 1026, 1152, 718, 790, 862, 984, 1071, 1153, 719, 791, 863, 985, 1072, 1154, 354, 436, 622, 1073, 1155]

The adjacent elements' gap ranged from -880 to 364.

实际上我想获得如下排序的变量并将约束设置为相邻元素的间隙。例如,间隙应在 10 到 50 之间。那么这样设置约束可行吗?

order_list=[345, 354, 436, 437, 622, 716, 717, 718, 719, 788, 789, 790, 791, 801, 860, 861, 862, 863, 944, 981, 982, 984, 985, 1026, 1068, 1069, 1071, 1072, 1073, 1150, 1151, 1152, 1153, 1154, 1155]

X1=345, X30=354, X31=436, X2=437,.... # the variables are not in order as definition. 

The adjacent elements' gap ranged from 1 to 185.

谢谢。

【问题讨论】:

如果您只对仅在存在这些差距的情况下可行的解决方案感兴趣,您应该明确编码如下:x2 - x1 >= MIN_GAPx2 - x1 <= MAX_GAP。这将是 (n-1) * 2 约束。 我认为你也可以制作一个电路并使用 onlyenforceif 添加约束 我已经尝试过您的建议,它确实有效。谢谢你,萨沙。 【参考方案1】:

按照斯特拉迪瓦里的建议,

我会使用电路约束。

从一个虚拟节点开始。将虚拟节点的一条弧添加到每个 var。 在 xi 和 xj 之间添加一条弧,当且仅当 xj 大于 xi 并且具有正确的间隙。 从每个节点添加一条弧到虚拟节点。 寻找可行的解决方案。

如果要计算排名,使用初始弧将到达变量的排名设置为0。使用每个弧将头部的排名设置为尾部的排名+1。

【讨论】:

嗨 Laurent,有没有关于如何添加电路约束的代码示例?我在网上搜索过,但没有找到一个好的。 如果您能按照您的建议提供主要代码,是否方便?我很抱歉对电路约束不熟悉。非常感谢。 github.com/google/or-tools/blob/stable/examples/python/…

以上是关于如何在 Or-tools 中对变量进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angularfire2 Angular2 中对 FirebaseListObservable 列表进行排序?

如何在golang中对固定长度的数组进行排序?

如何在熊猫数据框中对字符串进行排序或检查等效性而不考虑顺序?

如果您可以在 7 次比较中对 5 个数字进行排序,那么如何在 10 次比较中对 6 个数字进行排序?

如何在 Flutter 中对列表进行排序 [重复]

如何在C#中对列表进行排序[重复]