using JuMP using Cbc using Printf md = Model(with_optimizer(Cbc.Optimizer)) M = 38 T = 20 # Variables @variable(md, x[i in 1:T, j in 1:T, d in 1:M ; i != j], Bin) @variable(md, z[i in 1:T, d in 1:M] >= 0) @variable(md, y[i in 1:T, d in 1:M, e in 1:M ; e > d] >= 0) @variable(md, u >= 1) # Model @objective(md, Min, u) @constraint(md, [i in 1:T, j in 1:T ; i != j], sum(x[i, j, d] for d in 1:M) == 1) @constraint(md, [i in 1:T, d in 1:M], sum(x[i, j, d] for j in 1:T if j != i) + sum(x[j, i, d] for j in 1:T if j != i) <= 1) @constraint(md, [i in 1:T, d in 1:M], z[i, d] == sum(x[j, i, d] for j in 1:T if j != i)) @constraint(md, [i in 1:T, d in 1:M, e in 1:M ; e > d], y[i, d, e] >= sum(z[i, δ] for δ = d:e) - (e - d)) @constraint(md, [i in 1:T, d in 1:M, e in 1:M ; e > d], u >= (e - d + 1) * y[i, d, e]) # Solve model optimize!(md) # Print solution println(termination_status(md)) println("obj = ", objective_value(md)) for d in 1:M for i in 1:T home = false away = false games = [] for j in 1:T if j == i # x[i, j, d] does not exist elseif value(x[i, j, d]) >= 0.9 append!(games, j) home = true elseif value(x[j, i, d]) >= 0.9 append!(games, j) away = true end end if (size(games)[1] == 1) @printf(" %2d", games[1]) elseif (size(games)[1] == 0) @printf(" .") else @printf(" !!{%d}", size(games)[1]) end @printf(" %s", (away) ? "(a)" : " ") end @printf("\n") end