我索引了一组{1,2,3,4,5}
。决策变量输出是:
x[1][2] = 0
x[1][3] = 0
x[1][4] = 1
x[1][5] = 1
x[2][1] = 0
x[2][3] = 0
x[2][4] = 1
x[2][5] = 1
x[3][1] = 0
x[3][2] = 0
x[3][4] = 1
x[3][5] = 1
x[4][1] = 1
x[4][2] = 1
x[4][3] = 1
x[4][5] = 0
x[5][1] = 1
x[5][2] = 1
x[5][3] = 1
x[5][4] = 1
现在我想根据决策变量值创建分区。如果x[i][j]= 0
则i
& j
属于同一组。这就是上述问题的输出应该是两个分区:{1,2,3}
和{4,5}
。
我怎样才能在java中做到这一点?有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
static <T> void partitioning(Set<Set<T>> partition, Set<T> set) {
L: while (true) {
for (Set<T> p : partition) {
for (T e : set) {
if (p.contains(e)) {
partition.remove(p);
p.addAll(set);
set = p;
continue L;
}
}
}
partition.add(set);
return;
}
}
public static void main(String[] args) {
int[][] x = new int[6][6];
x[1][2] = 0;
x[1][3] = 0;
// .....
x[5][4] = 1;
Set<Set<Integer>> partition = new HashSet<>();
for (int i = 1, is = x.length; i < is; ++i)
for (int j = 1, js = x[i].length; j < js; ++j)
if (x[i][j] == 0) {
Set<Integer> set = new HashSet<>();
set.add(i);
set.add(j);
partitioning(partition, set);
}
System.out.println(partition);
// -> [[1, 2, 3], [4, 5]]
}