Skip to content

Commit

Permalink
improved biogeme trip choice model
Browse files Browse the repository at this point in the history
  • Loading branch information
rakow committed Jul 21, 2024
1 parent bfb7397 commit 7d4f2c2
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -233,15 +233,15 @@ private List<Object> computeAlternatives(TripRouter router, Network network, Per
}
}

if (!PersonUtils.canUseCar(person) && mode.equals(TransportMode.car)) {
valid = false;
}

// Filter rows that have been chosen, but would not be valid
if (choice.equals(mode) && !valid) {
return null;
}

if (!PersonUtils.canUseCar(person) && mode.equals(TransportMode.car)) {
valid = false;
}

row.addAll(List.of(travelDistance / 1000, travelTime / 3600, walkDistance / 1000, valid));
}

Expand Down
24 changes: 17 additions & 7 deletions src/main/python/choicemodels/estimate_biogeme_trip_choice.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import biogeme.biogeme as bio
import biogeme.database as db
import biogeme.models as models
from biogeme.expressions import Beta
from biogeme.expressions import Beta, bioDraws, PanelLikelihoodTrajectory, log, MonteCarlo

from prepare import read_trip_choices

Expand All @@ -17,29 +17,33 @@
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Estimate the trip choice model")
parser.add_argument("--input", help="Path to the input file", type=str, default="../../../../trip-choices.csv")
parser.add_argument("--mxl-modes", help="Modes to use mixed logit for", nargs="+", type=set,
default=["pt", "bike", "ride"])
parser.add_argument("--est-performing", help="Estimate the beta for performing", action="store_true")
parser.add_argument("--no-income", help="Don't consider the income", action="store_true")

args = parser.parse_args()

ds = read_trip_choices(args.input)

df = ds.df.drop(columns=["person"])

# Convert all the columns to numeric
df = df * 1
df = ds.df * 1

database = db.Database("data/choices", df)
v = database.variables

database.remove(v["choice"] == 0)
database.panel("person")

km_costs = defaultdict(lambda: 0.0, car=-0.149, ride=-0.149)

ASC = {}
for mode in ds.modes:
# Base asc
ASC[mode] = Beta(f"ASC_{mode}", 0, None, None, 1 if mode == "walk" else 0)
ASC[mode] = Beta(f"ASC_{mode}", 0, None, None, FIXED if mode == "walk" else ESTIMATE)

if mode in args.mxl_modes:
sd = Beta(f"ASC_{mode}_s", 1, 0, None, ESTIMATE)
ASC[mode] += sd * bioDraws(f"{mode}_RND", "NORMAL_ANTI")

U = {}
AV = {}
Expand All @@ -57,7 +61,13 @@
U[i] = u
AV[i] = v[f"{mode}_valid"]

logprob = models.loglogit(U, AV, v["choice"])
if not args.mxl_modes:
logprob = models.loglogit(U, AV, v["choice"])

else:
obsprob = models.logit(U, AV, v["choice"])
condprobIndiv = PanelLikelihoodTrajectory(obsprob)
logprob = log(MonteCarlo(condprobIndiv))

biogeme = bio.BIOGEME(database, logprob)

Expand Down

0 comments on commit 7d4f2c2

Please sign in to comment.