【问题标题】:Formulating a binary sequence with shift in MILP用 MILP 中的移位制定二进制序列
【发布时间】:2021-10-09 10:00:03
【问题描述】:

我想知道是否真的可以在 MILP/MIP 中编码带有旋转的(二进制)序列。

给定一个二进制序列 (0,1,1,0,0,0,0,1) 和变量 x0,x1,x2,x3,x4,x5,x6,x7,
我想限制我的 MILP 程序,使其占用以下内容之一:

(x0,x1,x2,x3,x4,x5,x6,x7) = (0,1,1,0,0,0,0,1) 或
(x7,x0,x1,x2,x3,x4,x5,x6) = (0,1,1,0,0,0,0,1) 或
...
(x1,x2,x3,x4,x5,x6,x7,x0) = (0,1,1,0,0,0,0,1)

我知道只需扩展序列即可轻松解决旋转问题。但我发现自己创建了多个 MILP 实例,每个实例恰好对应一个案例。如果这是不可行的,为什么?

【问题讨论】:

    标签: constraint-programming mixed-integer-programming


    【解决方案1】:

    可以设计的方法有很多,但不清楚你将在什么情况下使用它。

    这里是一个比较简单的:

    A: Introduce n new binary variables: These describe the "root / first zero" decision
    
        s_x0, s_x1, s_x2, s_x3, s_x4, s_x5, s_x6, s_x7
    
    B: Add a simplex-constraint / make those add up to 1: We do want a unique root!
    
        s_x0 + s_x1 + s_x2 + s_x3 + s_x4 + s_x5 + s_x6 + s_x7 = 1
    
    C: Encode all implications for all possible roots which can be chosen
    
      for: s_x0  
    
        logic-form   |  milp-form
    
        s_x0 ->  x0    (1-s_x0) + x0     >= 1
        s_x0 ->  x1    (1-s_x0) + x1     >= 1
        s_x0 -> !x2    (1-s_x0) + (1-x2) >= 1
        s_x0 -> !x3    (1-s_x0) + (1-x3) >= 1
        s_x0 -> !x4    (1-s_x0) + (1-x4) >= 1
        s_x0 -> !x5    (1-s_x0) + (1-x5) >= 1
        s_x0 ->  x6    (1-s_x0) + x6     >= 1
        s_x0 -> !x7    (1-s_x0) + (1-x7) >= 1
    
      for: s_x1
    
        s_x1 -> !x0    (1-s_x1) + (1-x0) >= 1
        s_x1 ->  x1    (1-s_x1) + x1     >= 1
        s_x1 ->  x2    (1-s_x1) + x2     >= 1
        s_x1 -> !x3    (1-s_x1) + (1-x3) >= 1
        s_x1 -> !x4    (1-s_x1) + (1-x4) >= 1
        s_x1 -> !x5    (1-s_x1) + (1-x5) >= 1
        s_x1 -> !x6    (1-s_x1) + (1-x6) >= 1
        s_x1 ->  x7    (1-s_x1) + x7     >= 1
    
      for ......
    

    这个:

    • 基本上利用了问题背后的核心结构:
      • 我们需要在 n 个不同的模式中进行选择,并且必须强制执行效果
    • 会变大(至少对于人类消费而言)
    • 相当简单/易于理解和实施
    • 但也应该提供一个不错的 LP 松弛
    • 这种(非紧凑)公式还利用了 MILP 求解器(例如 clique-tables)的一些优势

    【讨论】:

    • 谢谢!这正是我一直在寻找的。我很惊讶我完全错过了这样一个简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-01-13
    • 2011-02-07
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多