/
urbanplan.jl
72 lines (61 loc) · 2.49 KB
/
urbanplan.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#############################################################################
# JuMP
# An algebraic modelling langauge for Julia
# See http://github.com/JuliaOpt/JuMP.jl
#############################################################################
# urbanplan.jl
#
# An "urban planning" problem.
# Based on
# http://puzzlor.editme.com/urbanplanning
#############################################################################
using JuMP
function SolveUrban()
m = Model()
# x is indexed by row and column
@defVar(m, 0 <= x[1:5,1:5] <= 1, Int)
# y is indexed by R or C, and the points
# JuMP allows indexing on arbitrary sets
rowcol = ["R","C"]
points = [+5,+4,+3,-3,-4,-5]
@defVar(m, 0 <= y[rowcol,points,i=1:5] <= 1, Int)
# Objective - combine the positive and negative parts
@setObjective(m, Max, sum{
3*(y["R", 3,i] + y["C", 3,i])
+ 1*(y["R", 4,i] + y["C", 4,i])
+ 1*(y["R", 5,i] + y["C", 5,i])
- 3*(y["R",-3,i] + y["C",-3,i])
- 1*(y["R",-4,i] + y["C",-4,i])
- 1*(y["R",-5,i] + y["C",-5,i]), i=1:5})
# Constrain the number of residential lots
@addConstraint(m, sum{x[i,j], i=1:5, j=1:5} == 12)
# Add the constraints that link the auxiliary y variables
# to the x variables
# Rows
for i = 1:5
@addConstraint(m, y["R", 5,i] <= 1/5*sum{x[i,j], j=1:5}) # sum = 5
@addConstraint(m, y["R", 4,i] <= 1/4*sum{x[i,j], j=1:5}) # sum = 4
@addConstraint(m, y["R", 3,i] <= 1/3*sum{x[i,j], j=1:5}) # sum = 3
@addConstraint(m, y["R",-3,i] >= 1-1/3*sum{x[i,j], j=1:5}) # sum = 2
@addConstraint(m, y["R",-4,i] >= 1-1/2*sum{x[i,j], j=1:5}) # sum = 1
@addConstraint(m, y["R",-5,i] >= 1-1/1*sum{x[i,j], j=1:5}) # sum = 0
end
# Columns
for j = 1:5
@addConstraint(m, y["C", 5,j] <= 1/5*sum{x[i,j], i=1:5}) # sum = 5
@addConstraint(m, y["C", 4,j] <= 1/4*sum{x[i,j], i=1:5}) # sum = 4
@addConstraint(m, y["C", 3,j] <= 1/3*sum{x[i,j], i=1:5}) # sum = 3
@addConstraint(m, y["C",-3,j] >= 1-1/3*sum{x[i,j], i=1:5}) # sum = 2
@addConstraint(m, y["C",-4,j] >= 1-1/2*sum{x[i,j], i=1:5}) # sum = 1
@addConstraint(m, y["C",-5,j] >= 1-1/1*sum{x[i,j], i=1:5}) # sum = 0
end
# Solve it with the default solver (CBC)
status = solve(m)
if status == :Infeasible
error("Solver couldn't find solution!")
end
# Print results
println("Best objective: $(round(getObjectiveValue(m)))")
println(getValue(x))
end
SolveUrban()