|
| 1 | + |
| 2 | +""" |
| 3 | + maximum_independent_set!(model, g; var_name) |
| 4 | +
|
| 5 | +Computes in-place in the JuMP model a maximum-weighted independent set of `g`. |
| 6 | +An optional `vertex_weights` vector can be passed to the graph, defaulting to uniform weights (computing a maximum size independent set). |
| 7 | +""" |
| 8 | +function maximum_weight_independent_set!( |
| 9 | + model::Model, g::AbstractGraph; binary::Bool=true, var_name, vertex_weights=ones(nv(g)) |
| 10 | +) |
| 11 | + if is_directed(g) |
| 12 | + throw(ArgumentError("The graph must not be directed")) |
| 13 | + end |
| 14 | + g_vertices = collect(vertices(g)) |
| 15 | + f = @variable(model, [g_vertices]; binary=binary, base_name=String(var_name)) |
| 16 | + model[Symbol(var_name)] = f |
| 17 | + @constraint( |
| 18 | + model, |
| 19 | + covering_constraint[i=1:nv(g), j=1:nv(g); i ≠ j && has_edge(g, i, j)], |
| 20 | + f[i] + f[j] <= 1, |
| 21 | + ) |
| 22 | + @objective(model, Max, dot(f, vertex_weights)) |
| 23 | + return model |
| 24 | +end |
| 25 | + |
| 26 | +""" |
| 27 | + maximum_weight_independent_set(g; optimizer, binary, vertex_weights) |
| 28 | +
|
| 29 | +Computes a maximum-weighted independent set or stable set of `g`. |
| 30 | +""" |
| 31 | +function maximum_weight_independent_set( |
| 32 | + g::AbstractGraph; |
| 33 | + binary::Bool=true, |
| 34 | + vertex_weights=ones(nv(g)), |
| 35 | + optimizer=HiGHS.Optimizer, |
| 36 | +) |
| 37 | + model = Model(optimizer) |
| 38 | + set_silent(model) |
| 39 | + maximum_weight_independent_set!( |
| 40 | + model, g; binary=binary, vertex_weights=vertex_weights, var_name=:stable |
| 41 | + ) |
| 42 | + optimize!(model) |
| 43 | + @assert termination_status(model) == OPTIMAL |
| 44 | + stable_variables = Vector(model[:stable]) |
| 45 | + stable_vertices = findall(v -> value(v) > 0.5, stable_variables) |
| 46 | + return stable_vertices |
| 47 | +end |
0 commit comments