首页 > 解决方案 > 根据python中的条件创建值列表

问题描述

我需要创建一个尊重字典规定的优先关系的工作列表。

 dict_preced = {(1, 2): 0,  (1, 3): 0,  (2, 1): 1,  (2, 3): 0,  (3, 1): 1,  (3, 2): 0}

 Where (j1, j2) == 1 means that j1 requires j2, 0 otherwise.

假设我已经有了 start list: j_seq = [3, 2, 1],我需要创建一个new_list其中 j_seq 中的所有值都将尊重优先关系,这意味着在所需的作业之前没有作业正在执行。(即,作业 3 和作业 2 不能在作业 1 之前执行)。

因此,有许多候选列表(即,new_list = [1, 2, 3]new_list = [1, 3, 2])。如何创建new_list始终尊重这些优先关系的样本?

当每个值都需要尊重给定条件而不依赖于其他值时,我发现了许多列表理解示例。但是我没有找到任何例子,其中陈述的条件涉及同一列表的两个值。

编辑:我不需要得到所有关于优先约束的排列,一个就足够了。

标签: pythonlistdictionary

解决方案


我正在回答我自己的问题,因为我找到了解决这个问题的方法。

当使用短列表时,@jarmod 提出的方法可以很方便。然而,当考虑长列表时,使用他的方法变得不切实际,因为排列的数量上升到 10^18。

对于那些可以从 IBM CPLEX(或其他约束规划求解器)访问 CP 优化器的人,一种可能的替代方法是使用约束传播方法来获取一些有效序列列表(尊重优先约束)。

在我的例子中,我通过 docplex 模块调用了 CP 优化器。您可以在此处查看脚本:https ://github.com/campioni1/CPO_Docplex_precedence_constraints

如果您遇到任何困难,请告诉我,


推荐阅读