首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Minizinc嵌套for循环

Minizinc嵌套for循环
EN

Stack Overflow用户
提问于 2016-01-29 19:17:33
回答 1查看 3.9K关注 0票数 3

如何使用嵌套的for循环(如下面的java所做的)来生成/填充Minizinc中的数组?

代码语言:javascript
复制
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]; 
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-30 07:10:53

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

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

代码语言:javascript
复制
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是决策变量的矩阵,那么您可以这样做:

代码语言:javascript
复制
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矩阵只是一个常数矩阵,那么您可以直接初始化它:

代码语言:javascript
复制
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
   % ... 
;

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35092341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档