【问题标题】:Combinatorial optimization with interdependent variables具有相互依存变量的组合优化
【发布时间】:2016-12-20 11:52:35
【问题描述】:

这是我在这些论坛上的第一篇文章,提前感谢所有回复。

我正在开发一个 java 应用程序,我在其中遇到了我认为被称为“组合优化问题”的问题。我只有基本的数学技能,所以到目前为止,试图研究这样一个问题的设置还没有取得成果。

基本上,我想做的是编写最有效的方法来找到具有变量 v1、v2、v3 等的较大集合 N 的最佳子集 n。这些变量除了具有确定的值/分数之外取决于某些其他变量的值/分数,这些变量可能包含在子集中,也可能不包含在子集中。

我有兴趣选择总价值/得分最高的子集。

因此,例如,完整集 N 由以下变量组成,并具有以下确定的值以及与其他变量的关系:

v1  8   { v2 ; v8 }
v2  6   { v1 ; v4 }
v3  9   { }
v4  7   { v2 ; v5 ; v8 }
v5  6   { v4 ; v10 }
v6  8   { v7 }
v7  5   { v6 }
v8  9   { v1 ; v4 }
v9  6   { } 
v10 7   { v5 }

与一个或多个其他选定变量有关系意味着总值将有一定的“起飞”——为了这个例子,我们假设每个关系都有一个。 因此,选择前五个变量作为子集将得到 30 的总值:

v1  8   { v2 ; v8 }      = 8 - 1 = 7
v2  6   { v1 ; v4 }      = 6 - 2 = 4
v3  9   { }              = 9 - 0 = 9
v4  7   { v2 ; v5 ; v8 } = 7 - 2 = 5
v5  6   { v4 ; v10 }     = 6 - 1 = 5

对于这么小的集合当然不是问题,但我目前面临 100K 的集合和 10K 的子集——使用当前算法,我的计算机在 3 天内计算出解决方案!

我不一定需要解决此问题的代码,而是需要最佳的数学方法(如果有的话!)。请记住,虽然我很难理解基本水平以上的数学符号。

再次感谢所有回复!

【问题讨论】:

    标签: java algorithm mathematical-optimization combinatorics


    【解决方案1】:

    对于线性规划求解器,输入类似

    v1  8   { v2 ; v8 }
    v2  6   { v1 ; v4 }
    v3  9   { }
    v4  7   { v2 ; v5 ; v8 }
    v5  6   { v4 ; v10 }
    v6  8   { v7 }
    v7  5   { v6 }
    v8  9   { v1 ; v4 }
    v9  6   { }
    v10 7   { v5 }
    

    并将其转换为整数程序,如

    maximize   8*v1 - v1v2 - v1v8
             + 6*v2 - v2v1 - v2v4
             + 9*v3
             + 7*v4 - v4v2 - v4v5 - v4v8
             + 6*v5 - v5v4 - v5v10
             + 8*v6 - v6v7
             + 5*v7 - v7v6
             + 9*v8 - v8v1 - v8v4
             + 6*v9
             + 7*v10 - v10v5
    
    subject to
    v1 + v2 - v1v2 <= 1
    v1 + v8 - v1v8 <= 1
    v2 + v1 - v2v1 <= 1
    v2 + v4 - v2v4 <= 1
    v4 + v2 - v4v2 <= 1
    v4 + v5 - v4v5 <= 1
    v4 + v8 - v4v8 <= 1
    v5 + v4 - v5v4 <= 1
    v5 + v10 - v5v10 <= 1
    v6 + v7 - v6v7 <= 1
    v7 + v6 - v7v6 <= 1
    v8 + v1 - v8v1 <= 1
    v8 + v4 - v8v4 <= 1
    v10 + v5 - v10v5 <= 1
    
    binary v1, v1v2, v1v8,
           v2, v2v1, v2v4,
           v3,
           v4, v4v2, v4v5, v4v8,
           v5, v5v4, v5v10,
           v6, v6v7,
           v7, v7v6,
           v8, v8v1, v8v4,
           v9,
           v10, v10v5
    

    对于最佳解决方案而言,您的实例大小可能太大了,但人们永远不知道...

    【讨论】:

      【解决方案2】:

      不幸的是,这个问题很难找到最优解。

      如果你能有效地解决这个问题,那么你可以通过将每个顶点的值设置为 1 来解决 NP-hard maximum independent set problem,并对每条边进行非常大的惩罚。

      因此,您应该寻找近似解决方案。您可能会发现使用模拟退火或遗传算法得到了合理的答案。

      【讨论】:

      • 花了我一些时间,但我现在尝试掌握这里提到的几个解决方案。我最终以模拟退火结束。不确定它是否是正确/最佳的解决方案,但至少它很容易理解和实施——而且它似乎对我正在尝试做的事情表现得相当好。感谢所有建议!
      【解决方案3】:

      您可以将您的集合视为图表。每个 vX 都是具有相应值的节点/顶点。示例 v1 是值为 8 的节点/顶点,v2 是值为 6 的节点/顶点,依此类推。然后它们之间存在边。示例 v1 有 2 条边:一条用于 v2,另一条用于 v8。每条边也可以有一个值(在您的情况下为 -1)。

      因此,如果您使用图形,并选择 v1 到 v5:您有 8 + 6 + 9 + 7 + 6(顶点值)-1 -1 -1 -1 -1 -1(边值)。

      试试看这个http://jgrapht.org/ 看看它是否对你有帮助。

      另见一些 Graph Teory:http://www.people.vcu.edu/~gasmerom/MAT131/graphs.html。观察最长/最短路径算法(例如:http://www.maxburstein.com/blog/introduction-to-graph-theory-finding-shortest-path/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-14
        • 1970-01-01
        • 1970-01-01
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        • 2020-09-05
        相关资源
        最近更新 更多