【问题标题】:Max number of consecutive values (Minizinc)最大连续值数(Minizinc)
【发布时间】:2016-10-26 12:09:17
【问题描述】:

我正在尝试在 Minizinc 中为下一个约束建模:

假设 S 是一个大小为 n 的决策变量数组。我希望我的决策变量取 1-k 之间的值,但使用的连续值的数量有一个最大值“Cons_Max”。

例如,假设 Cons_Max = 2,n = 8 和 k = 15,则序列 [1,2,4,5,7,8,10,11] 是有效序列,而 e.g. [1,2,3,5,6,8,9,11] 不是有效序列,因为此处的最大连续值数等于 3 (1,2,3)。 重要的是要提到序列 [1,3,5,7,9,10,12,14] 也是有效的,因为这些值不需要是连续的,但是连续值的最大数量固定为“Cons_Max” .

关于如何在 Minizinc 中进行建模有什么建议吗?

【问题讨论】:

    标签: optimization minizinc


    【解决方案1】:

    这是一个似乎可行的模型。我还添加了两个约束 all_diff 和增加,因为它们可能在问题中被假定。

    include "globals.mzn";
    int: n = 8;
    int: k = 15;
    int: Cons_Max = 2;
    % decision variables
    array[1..n] of var 1..k: x;
    
    constraint 
       forall(i in 1..n-Cons_Max) (
          x[i+Cons_Max]-x[i] > Cons_Max
       )
    ;
    
    constraint 
      increasing(x) /\
      all_different(x)
    ;
    
    %% test cases
    % constraint 
    %    % x = [1,2,4,5,7,8,10,11] % valid solution
    %    % x = [1,3,5,7,9,10,12,14] % valid valid solution
    
    %    % x = [1,2,3,5,6,8,9,11] % -> not valid solution (-> UNSAT)
    %  ;
    
    
    solve satisfy;
    output ["x: \(x)\n" ];
    

    【讨论】:

      【解决方案2】:

      假设您使用数组 x 来表示您的决策变量。

      array[1..n] of var 1..k: x;
      

      然后你可以像这样对约束进行建模。

      constraint not exists (i in 1..n-1)(
                             forall(j in i+1..min(n, i+Cons_Max))
                                   (x[j]=x[i]+1)
                            );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-15
        • 1970-01-01
        • 2022-07-19
        相关资源
        最近更新 更多