Все подмножество SE в Юлии

Не могли бы вы помочь мне? Как я могу сделать код, который может найти все подмножество набора

например

Я хочу закодировать это ограничение в Юлии. Это подпольное ограничение. Но я не знаю, как найти все подмножества множества S.

ht tps://stackru.com/images/9663234811a8ade7f5c6b5b700c29f86a0c2b5e4.jpg

@constraint(ILRP,
            c7[k in totalK, t in totalH],
            sum(x[i,j,k,t] for i=1:totalS, j=1:totalS)<=size(S)-1);

Спасибо большое

2 ответа

Решение

Не знаю, ищите ли вы это:

используя комбинаторику

   function subsets(A::AbstractArray,r::Union{AbstractArray,Integer})
  o= Array{Array{eltype(A),1},1}(undef,0)         
  if typeof(r)<:Integer
      r>length(A) && (r=[length(A)])
      r=[r...]
  elseif typeof(r)<:UnitRange
      r[end]>length(A) && (r=1:r[length(A)])
  else
      !issubset(r,1:length(A)) && (r=intersect(r,1:length(A)))
  end
  for n = r
      a=combinations(A,n)
      for i in a     
          push!(o,i)
      end
  end
  return o
end

subsets(A::AbstractArray) = subsets(A,1:length(A))

Он может перечислить все подмножества или подмножества до определенного предела (длины): например:

 julia> subsets(1:3)
 7-element Array{Array{Int64,1},1}:
  [1]
  [2]
  [3]
  [1, 2]
  [1, 3]
  [2, 3]
  [1, 2, 3]
  julia> subsets(1:3,2)
  3-element Array{Array{Int64,1},1}:
  [1, 2]
  [1, 3]
  [2, 3]

Вы можете получить это используя powerset функция из пакета Combinatorics.jl, например:

julia> using Combinatorics

julia> x = [1:5;]
5-element Array{Int64,1}:
 1
 2
 3
 4
 5

julia> powerset(x)
Base.Iterators.Flatten{Array{Combinatorics.Combinations{Array{Int64,1}},1}}(Combinatorics.Combinations{Array{Int64,1}}[Combinations{Array{Int64,1}}([1, 2, 3, 4, 5], 0), Combinations{Array{Int64,1}}([1, 2, 3, 4, 5], 1), Combinations{Array{Int64,1}}([1, 2, 3, 4, 5], 2), Combinations{Array{Int64,1}}([1, 2, 3, 4, 5], 3), Combinations{Array{Int64,1}}([1, 2, 3, 4, 5], 4), Combinations{Array{Int64,1}}([1, 2, 3, 4, 5], 5)])

julia> collect(powerset(x))
32-element Array{Array{Int64,1},1}:
 []
 [1]
 [2]
 [3]
 [4]
 [5]
 [1, 2]
 [1, 3]
 [1, 4]
 [1, 5]
 [2, 3]
 [2, 4]
 [2, 5]
 [3, 4]
 [3, 5]
 [4, 5]
 [1, 2, 3]
 [1, 2, 4]
 [1, 2, 5]
 [1, 3, 4]
 [1, 3, 5]
 [1, 4, 5]
 [2, 3, 4]
 [2, 3, 5]
 [2, 4, 5]
 [3, 4, 5]
 [1, 2, 3, 4]
 [1, 2, 3, 5]
 [1, 2, 4, 5]
 [1, 3, 4, 5]
 [2, 3, 4, 5]
 [1, 2, 3, 4, 5]

Обратите внимание, что по умолчанию powerset возвращает итератор, чтобы избежать выделения всех подмножеств. Также вы можете передать второй и третий позиционный аргумент powerset ограничить минимальный и максимальный размер возвращаемого подмножества, например:

julia> collect(powerset(x, 2, 3))
20-element Array{Array{Int64,1},1}:
 [1, 2]
 [1, 3]
 [1, 4]
 [1, 5]
 [2, 3]
 [2, 4]
 [2, 5]
 [3, 4]
 [3, 5]
 [4, 5]
 [1, 2, 3]
 [1, 2, 4]
 [1, 2, 5]
 [1, 3, 4]
 [1, 3, 5]
 [1, 4, 5]
 [2, 3, 4]
 [2, 3, 5]
 [2, 4, 5]
 [3, 4, 5]
Другие вопросы по тегам