|
| 1 | +""" |
| 2 | + min_vertex_cover!( |
| 3 | + model, g; |
| 4 | + var_name |
| 5 | + ) |
| 6 | +
|
| 7 | +Modify a JuMP model by adding the variable, constraints and objective necessary to compute a minimum vertex cove of an undirected graph. |
| 8 | +
|
| 9 | +The vertex cover indicator variable will be named `var_name` |
| 10 | +""" |
| 11 | +function min_vertex_cover!(model::Model, g::AbstractGraph; integer::Bool, var_name) |
| 12 | + if is_directed(g) |
| 13 | + throw(ArgumentError("The graph must not be directed")) |
| 14 | + end |
| 15 | + |
| 16 | + ver = collect(vertices(g)) |
| 17 | + |
| 18 | + f = @variable(model, [ver]; integer=integer, base_name=String(var_name)) |
| 19 | + model[Symbol(var_name)] = f |
| 20 | + |
| 21 | + for v in ver |
| 22 | + @constraint(model, f[v] >= 0) |
| 23 | + @constraint(model, f[v] <= 1) |
| 24 | + end |
| 25 | + |
| 26 | + for e in edges(g) |
| 27 | + @constraint(model, f[src(e)] + f[dst(e)] >= 1) |
| 28 | + end |
| 29 | + |
| 30 | + obj = objective_function(model) |
| 31 | + for v in ver |
| 32 | + add_to_expression!(obj, f[v]) |
| 33 | + end |
| 34 | + @objective(model, Min, obj) |
| 35 | + |
| 36 | + return model |
| 37 | +end |
| 38 | + |
| 39 | +""" |
| 40 | + min_vertex_cover( |
| 41 | + g, optimizer |
| 42 | + ) |
| 43 | +
|
| 44 | +Compute a minimum vertex cover of an undirected graph. |
| 45 | +
|
| 46 | +# Arguments |
| 47 | +
|
| 48 | +- `g::Graphs.AbstractGraph`: an undirected graph `G = (V, E)` |
| 49 | +
|
| 50 | +# Keyword arguments |
| 51 | +
|
| 52 | +- `optimizer`: JuMP-compatible solver (default is `HiGHS.Optimizer`) |
| 53 | +""" |
| 54 | +function min_vertex_cover(g::AbstractGraph; integer::Bool=true, optimizer=HiGHS.Optimizer) |
| 55 | + model = Model(optimizer) |
| 56 | + set_silent(model) |
| 57 | + |
| 58 | + min_vertex_cover!(model, g; integer=integer, var_name=:cover) |
| 59 | + |
| 60 | + optimize!(model) |
| 61 | + @assert termination_status(model) == OPTIMAL |
| 62 | + |
| 63 | + cover_values = Vector(value.(model[:cover])) |
| 64 | + cover_vertices = findall(==(1), cover_values) |
| 65 | + |
| 66 | + return cover_vertices |
| 67 | +end |
0 commit comments