【问题标题】:Minizinc nested for loopMinizinc 嵌套 for 循环
【发布时间】:2016-05-07 15:35:47
【问题描述】:

我如何使用嵌套的 for 循环(就像下面的 java 所做的那样)在 Minizinc 中生成/填充数组?

int[][] input1 = {{1,1,1}, {3,3,3}, {5,5,5} };
int[][] input2 = {{2,6,9},{7,7,7}, {9,9,9}, {11,11,11} };
int[][] diff = new int[input1.length][input2.length];
for(int i = 0; i < input1.length; i++){
    for(int j = 0; j < input2.length; j++){
        for(int k = 0; k < 3; k++){
            diff[i][j] += input1[i][k]-input2[j][k]; 
        }
    }
}

【问题讨论】:

    标签: minizinc


    【解决方案1】:

    有两种方法可以做到这一点,具体取决于diff 矩阵的性质(下面称为diffs,因为diff 是保留字)。

    两种方法都使用相同的启动和输出。

    int: n = 3;
    int: m = 4;
    
    array[1..n,1..n] of int: input1 = array2d(1..n,1..n,[1,1,1, 3,3,3, 5,5,5 ]);
    array[1..m,1..n] of int: input2 = array2d(1..4,1..n,[2,6,9, 7,7,7, 9,9,9, 11,11,11 ]);
    
    output [
       if k = 1 then "\n" else " " endif ++
          show(diffs[i,k])
       | i in 1..n, k in 1..m
    ];
    

    1) 作为决策变量。 如果diffs 是一个决策变量矩阵,那么你可以这样做:

    array[1..n,1..m] of var int: diffs;
    
    constraint 
       forall(i in 1..n, j in 1..m) (
         diffs[i,j] = sum(k in 1..n) ( input1[i,k]-input2[j,k] )
       )
    ;
    

    2) 作为常数矩阵 如果diffs矩阵只是一个常量矩阵,那么你可以直接初始化它:

    array[1..n,1..m] of int: diffs = array2d(1..n,1..m, [sum(k in 1..n) (input1[i,k]-input2[j,k]) | i in 1..n, j in 1..m]);
    
    constraint
       % ... 
    ;
    

    我假设模型包含比这更多的约束和决策变量,所以我建议您使用第二种(“常量”)方法,因为它更容易让求解器求解。

    【讨论】:

    • 非常有帮助。谢谢!
    • 太棒了。如果您对答案感到满意,请将其标记为“已接受”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2021-07-08
    • 2012-06-27
    • 2014-09-21
    • 1970-01-01
    相关资源
    最近更新 更多