From ad73ee93b6e3440475599e65dad33a6ba51daa9d Mon Sep 17 00:00:00 2001 From: juliayyan Date: Tue, 3 Apr 2018 11:55:44 -0400 Subject: [PATCH 1/8] Add package requirements --- REQUIRE | 5 +++++ src/NetworkDesignModels.jl | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/REQUIRE b/REQUIRE index 137767a..57f9d3b 100644 --- a/REQUIRE +++ b/REQUIRE @@ -1 +1,6 @@ julia 0.6 +DataFrames +Iterators +TransitNetworks +JuMP +Gurobi \ No newline at end of file diff --git a/src/NetworkDesignModels.jl b/src/NetworkDesignModels.jl index 5c8d7bd..c30a76d 100644 --- a/src/NetworkDesignModels.jl +++ b/src/NetworkDesignModels.jl @@ -1,5 +1,5 @@ module NetworkDesignModels + + import DataFrames, Iterators, TransitNetworks, JuMP, Gurobi -# package code goes here - -end # module +end From 5bf3c45b2d380e176830b534034735843ff7f2d7 Mon Sep 17 00:00:00 2001 From: juliayyan Date: Tue, 3 Apr 2018 14:11:20 -0400 Subject: [PATCH 2/8] DesignModel structure and variables --- src/NetworkDesignModels.jl | 8 +++++++- src/model/designmodel.jl | 33 +++++++++++++++++++++++++++++++++ src/model/variables.jl | 20 ++++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/model/designmodel.jl create mode 100644 src/model/variables.jl diff --git a/src/NetworkDesignModels.jl b/src/NetworkDesignModels.jl index c30a76d..e86e8ac 100644 --- a/src/NetworkDesignModels.jl +++ b/src/NetworkDesignModels.jl @@ -1,5 +1,11 @@ module NetworkDesignModels - import DataFrames, Iterators, TransitNetworks, JuMP, Gurobi + export DesignModel + + import DataFrames, Iterators, JuMP, Gurobi + using TransitNetworks + + include("model/designmodel.jl") + include("model/variables.jl") end diff --git a/src/model/designmodel.jl b/src/model/designmodel.jl new file mode 100644 index 0000000..11bba2b --- /dev/null +++ b/src/model/designmodel.jl @@ -0,0 +1,33 @@ +mutable struct DesignModel + np::TransitNetworkProblem + model::JuMP.Model + + auxinfo::Dict{Symbol,Any} + results::Dict{Symbol,Any} + + y::Vector{JuMP.Variable} + ride::JuMP.JuMPDict{JuMP.Variable} + open::JuMP.JuMPArray{JuMP.Variable,1,Tuple{Array{Array{Int64,1},1}}} + + function DesignModel( + np::TransitNetworkProblem, + model::JuMP.Model + ) + new(np, model, Dict(), Dict()) + end +end + +function DesignModel( + np::TransitNetworkProblem, + solver = Gurobi.GurobiSolver(OutputFlag=0), + warmstart = zeros(0,0) + ) + dm = DesignModel(np, JuMP.Model(solver=solver)) + + # Variables + dm.y = designvariable(dm) + dm.ride = ridershipvariable(dm) + dm.open = openroutevariable(dm) + + dm +end diff --git a/src/model/variables.jl b/src/model/variables.jl new file mode 100644 index 0000000..ebb49fd --- /dev/null +++ b/src/model/variables.jl @@ -0,0 +1,20 @@ +function designvariable(dm::DesignModel) + JuMP.@variable(dm.model, + y[1:length(dm.np.nsegments)], Bin) + y +end + +function ridershipvariable(dm::DesignModel) + JuMP.@variable(dm.model, + ride[u=1:dm.np.nstations, v=TransitNetworks.dests(dm.np,u)], Bin) + ride +end + +function openroutevariable(dm::DesignModel) + validod = vec([isassigned(dm.np.stage, u,v) + for u in 1:dm.np.nstations, v in 1:dm.np.nstations]) + stages = unique(vcat(dm.np.stage[validod]...)) + JuMP.@variable(dm.model, + open[stages], Bin) + open +end From 06f775b15d0397c2c7cb3cfd3401467d752734bd Mon Sep 17 00:00:00 2001 From: juliayyan Date: Tue, 3 Apr 2018 14:42:11 -0400 Subject: [PATCH 3/8] Fix indexing of segments --- src/model/variables.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/model/variables.jl b/src/model/variables.jl index ebb49fd..4fb5758 100644 --- a/src/model/variables.jl +++ b/src/model/variables.jl @@ -1,6 +1,6 @@ function designvariable(dm::DesignModel) JuMP.@variable(dm.model, - y[1:length(dm.np.nsegments)], Bin) + y[1:dm.np.nsegments], Bin) y end From 2aba7d33bae1de331baf9769d6539af66fbb247f Mon Sep 17 00:00:00 2001 From: juliayyan Date: Tue, 3 Apr 2018 14:50:50 -0400 Subject: [PATCH 4/8] Add constraints indicating whether a sequence of segments can be taken or not --- src/NetworkDesignModels.jl | 1 + src/model/constraints.jl | 12 ++++++++++++ src/model/designmodel.jl | 3 +++ 3 files changed, 16 insertions(+) create mode 100644 src/model/constraints.jl diff --git a/src/NetworkDesignModels.jl b/src/NetworkDesignModels.jl index e86e8ac..1c2ac28 100644 --- a/src/NetworkDesignModels.jl +++ b/src/NetworkDesignModels.jl @@ -7,5 +7,6 @@ module NetworkDesignModels include("model/designmodel.jl") include("model/variables.jl") + include("model/constraints.jl") end diff --git a/src/model/constraints.jl b/src/model/constraints.jl new file mode 100644 index 0000000..7bbe0df --- /dev/null +++ b/src/model/constraints.jl @@ -0,0 +1,12 @@ +function routeopenconstraint(dm::DesignModel) + validod = vec([isassigned(dm.np.stage, u,v) + for u in 1:dm.np.nstations, v in 1:dm.np.nstations]) + stages = unique(vcat(dm.np.stage[validod]...)) + JuMP.@constraint(dm.model, + [r=1:length(stages), s=stages[r]], + dm.open[stages[r]] <= dm.y[s]) + JuMP.@constraint(dm.model, + [r=1:length(stages)], + dm.open[stages[r]] >= + sum(dm.y[s] for s in stages[r]) - length(stages[r]) + 1) +end diff --git a/src/model/designmodel.jl b/src/model/designmodel.jl index 11bba2b..0a9dc31 100644 --- a/src/model/designmodel.jl +++ b/src/model/designmodel.jl @@ -29,5 +29,8 @@ function DesignModel( dm.ride = ridershipvariable(dm) dm.open = openroutevariable(dm) + # Constraints + routeopenconstraint(dm) + dm end From df8b2705b32e9dc736428fc59fec954e25d82c58 Mon Sep 17 00:00:00 2001 From: juliayyan Date: Wed, 4 Apr 2018 09:03:46 -0400 Subject: [PATCH 5/8] Add constraints indicating whether commuter uses public transit --- src/model/constraints.jl | 21 +++++++++++++++++++++ src/model/designmodel.jl | 1 + 2 files changed, 22 insertions(+) diff --git a/src/model/constraints.jl b/src/model/constraints.jl index 7bbe0df..bd390bb 100644 --- a/src/model/constraints.jl +++ b/src/model/constraints.jl @@ -10,3 +10,24 @@ function routeopenconstraint(dm::DesignModel) dm.open[stages[r]] >= sum(dm.y[s] for s in stages[r]) - length(stages[r]) + 1) end + +function ridetransitconstraint(dm::DesignModel) + routeoptions = Dict{Tuple{Int, Int}, Any}() + for u=1:dm.np.nstations, v=TransitNetworks.dests(dm.np, u) + # TODO: Replace with stages that are ranked higher than + # no-transit option in preference ranking + routeoptions[u,v] = + unique(TransitNetworks.expandedstages(dm.np,u,v)[2]) + end + JuMP.@constraint(dm.model, + [u=1:dm.np.nstations, + v=TransitNetworks.dests(dm.np,u), + r=1:length(routeoptions[u,v])], + dm.ride[u,v] >= dm.open[routeoptions[u,v][r]]) + JuMP.@constraint(dm.model, + [u=1:dm.np.nstations, + v=TransitNetworks.dests(dm.np,u)], + dm.ride[u,v] <= + sum(dm.open[routeoptions[u,v][r]] + for r in 1:length(routeoptions[u,v]))) +end diff --git a/src/model/designmodel.jl b/src/model/designmodel.jl index 0a9dc31..ac39a99 100644 --- a/src/model/designmodel.jl +++ b/src/model/designmodel.jl @@ -31,6 +31,7 @@ function DesignModel( # Constraints routeopenconstraint(dm) + ridetransitconstraint(dm) dm end From 9015dfee6545e22fa2c358eb40c2ac5150c7cb59 Mon Sep 17 00:00:00 2001 From: juliayyan Date: Wed, 4 Apr 2018 09:15:41 -0400 Subject: [PATCH 6/8] Add budget constraint --- src/model/constraints.jl | 8 ++++++++ src/model/designmodel.jl | 1 + 2 files changed, 9 insertions(+) diff --git a/src/model/constraints.jl b/src/model/constraints.jl index bd390bb..4239ff2 100644 --- a/src/model/constraints.jl +++ b/src/model/constraints.jl @@ -31,3 +31,11 @@ function ridetransitconstraint(dm::DesignModel) sum(dm.open[routeoptions[u,v][r]] for r in 1:length(routeoptions[u,v]))) end + +function budgetconstraint(dm::DesignModel) + costs = [sum([TransitNetworks.haversinedistance(dm.np, + seg[i], seg[i+1]) for i in 1:length(seg)-1]) + for seg in dm.np.segments] + JuMP.@constraint(dm.model, + dot(costs, dm.y) <= dm.np.budget) +end diff --git a/src/model/designmodel.jl b/src/model/designmodel.jl index ac39a99..8a81304 100644 --- a/src/model/designmodel.jl +++ b/src/model/designmodel.jl @@ -32,6 +32,7 @@ function DesignModel( # Constraints routeopenconstraint(dm) ridetransitconstraint(dm) + budgetconstraint(dm) dm end From ab7e17d3ca6656312c02fe8b63b30a9786c0581b Mon Sep 17 00:00:00 2001 From: juliayyan Date: Wed, 4 Apr 2018 09:19:31 -0400 Subject: [PATCH 7/8] Add ridership objective --- src/NetworkDesignModels.jl | 1 + src/model/designmodel.jl | 3 +++ src/model/objective.jl | 3 +++ 3 files changed, 7 insertions(+) create mode 100644 src/model/objective.jl diff --git a/src/NetworkDesignModels.jl b/src/NetworkDesignModels.jl index 1c2ac28..08b6d45 100644 --- a/src/NetworkDesignModels.jl +++ b/src/NetworkDesignModels.jl @@ -8,5 +8,6 @@ module NetworkDesignModels include("model/designmodel.jl") include("model/variables.jl") include("model/constraints.jl") + include("model/objective.jl") end diff --git a/src/model/designmodel.jl b/src/model/designmodel.jl index 8a81304..d81f694 100644 --- a/src/model/designmodel.jl +++ b/src/model/designmodel.jl @@ -34,5 +34,8 @@ function DesignModel( ridetransitconstraint(dm) budgetconstraint(dm) + # Objective + ridershipobjective(dm) + dm end diff --git a/src/model/objective.jl b/src/model/objective.jl new file mode 100644 index 0000000..ff80728 --- /dev/null +++ b/src/model/objective.jl @@ -0,0 +1,3 @@ +function ridershipobjective(dm::DesignModel) + JuMP.@objective(dm.model, Max, sum(dm.ride)) +end From 6628033058af85e9d48a626b0e6cd39bb9603a37 Mon Sep 17 00:00:00 2001 From: juliayyan Date: Wed, 4 Apr 2018 09:55:58 -0400 Subject: [PATCH 8/8] Add constraints indicating that both directions of a segment should either be open or closed together --- src/model/constraints.jl | 8 ++++++++ src/model/designmodel.jl | 1 + 2 files changed, 9 insertions(+) diff --git a/src/model/constraints.jl b/src/model/constraints.jl index 4239ff2..3a5ed90 100644 --- a/src/model/constraints.jl +++ b/src/model/constraints.jl @@ -39,3 +39,11 @@ function budgetconstraint(dm::DesignModel) JuMP.@constraint(dm.model, dot(costs, dm.y) <= dm.np.budget) end + +function segmentmatchingconstraint(dm::DesignModel) + for s1 in 1:dm.np.nsegments, s2 in (s1+1):dm.np.nsegments + if (sort(dm.np.segments[s1]) == sort(dm.np.segments[s2])) + JuMP.@constraint(dm.model, dm.y[s1] == dm.y[s2]) + end + end +end diff --git a/src/model/designmodel.jl b/src/model/designmodel.jl index d81f694..7634e07 100644 --- a/src/model/designmodel.jl +++ b/src/model/designmodel.jl @@ -33,6 +33,7 @@ function DesignModel( routeopenconstraint(dm) ridetransitconstraint(dm) budgetconstraint(dm) + segmentmatchingconstraint(dm) # Objective ridershipobjective(dm)