Как создать 0-1 комбинацию из n массивов с определенным условием в Julia - PullRequest
0 голосов
/ 17 июня 2019

Я настраиваю свою огромную матрицу 0-1-комбинации для n массивов в Julia.Тем не менее, я не хочу всю комбинацию, поскольку это создает проблему использования памяти.Я просто хочу иметь только допустимую комбинацию, соответствующую некоторому конкретному условию, и условие состоит в том, что если столбец I и столбец J равны 1, тогда эта строка не должна быть в комбинации.

Я пробовал некоторые коды в https://discourse.julialang.org/t/cleanest-way-to-generate-all-combinations-of-n-arrays/20127/6, а затем удалите ненужную строку, но это не удалось, когда дело доходит до 2 ^ 34 комбинаций.

Допустим, у нас есть n = 6, что в итоге дает 64 0-1 комбинаций, и я хочу исключитькомбинация, когда значения элементов 1 и 4 равны 1, 2 и 5 равны 1, а 3 и 6 равны 1. Матрица должна содержать 28 вместо 64 строк, например:

0 0 0 0 0 1

0 0 0 0 1 0

0 0 0 0 1 1

0 0 0 1 0 0

0 0 0 1 0 1

0 0 0 1 1 0

0 0 0 1 1 1

0 0 1 0 0 0

0 0 1 0 1 0

0 0 1 1 0 0

0 0 1 1 1 0

0 1 0 0 0 0

0 1 0 0 0 1

01 0 1 0 0

0 1 0 1 0 1

0 1 1 0 0 0

0 1 1 0 0 1

0 1 11 0 0

1 0 0 0 0 0

1 0 0 0 0 1

1 0 0 0 1 0

1 0 0 0 1 1

1 0 1 0 0 0

1 0 1 0 1 0

1 1 0 0 0 0

1 1 0 0 0 1

11 1 0 0 0

0 0 0 0 0 0

1 Ответ

3 голосов
/ 17 июня 2019

Зачем вам нужен весь этот массив?Гораздо лучше создавать каждую комбинацию «на лету», когда она вам нужна, или создавать итератор, который выдает вам допустимые строки по одной за раз.В сообщении, которое вы связываете, Стефан также описывает это https://discourse.julialang.org/t/cleanest-way-to-generate-all-combinations-of-n-arrays/20127/17, и, как он также говорит, трудно дать больше советов, не зная, для чего вы его будете использовать.

Вы можете сделатьитератор, который дает вам в основном то, что вы хотите,

iter = (x for x in Iterators.product(0:1, 0:1, 0:1, 0:1, 0:1, 0:1) if max(x[2] + x[5],x[1] + x[4], x[3] + x[6]) != 2)

Вы можете перебрать iter в цикле for или для чего вам нужно:

collect(iter)
27-element Array{NTuple{6,Int64},1}:
 (0, 0, 0, 0, 0, 0)
 (1, 0, 0, 0, 0, 0)
 (0, 1, 0, 0, 0, 0)
 (1, 1, 0, 0, 0, 0)
 (0, 0, 1, 0, 0, 0)
 ⋮
 (0, 0, 0, 0, 1, 1)
 (1, 0, 0, 0, 1, 1)
 (0, 0, 0, 1, 1, 1)
...