Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ABM1 Airport Model Improvement #10

Open
wants to merge 18 commits into
base: ABM1_TRUNK
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
print connecting trips between access point and terminal
i-am-sijia committed Jun 10, 2020

Unverified

This commit is not signed, but one or more authors requires that any commit attributed to them is signed.
commit b64c6072864b81ca2bfcf5b3c5d427006ac812db
43 changes: 21 additions & 22 deletions src/main/java/org/sandag/abm/airport/AirportModeChoiceModel.java
Original file line number Diff line number Diff line change
@@ -42,6 +42,9 @@ public class AirportModeChoiceModel
protected WalkTransitWalkSkimsCalculator wtw;
protected WalkTransitDriveSkimsCalculator wtd;
protected DriveTransitWalkSkimsCalculator dtw;

private boolean debugChoiceModel;
private int debugPartyID;

/**
* Constructor
@@ -91,12 +94,18 @@ public AirportModeChoiceModel(HashMap<String, String> rbMap, AirportDmuFactoryIf
int maxMgra = mgraManager.getMaxMgra();
dmu.setMaxMgra(maxMgra);

// fake choice model to get airport access MGRA input
mgraModel = new ChoiceModelApplication(airportModeUecFileName, mgraPage, dataPage,
rbMap, (VariableTable) dmu);

solveModeMgra(dmu);

// create ChoiceModelApplication objects for each airport mgra
driveAloneModel = new ChoiceModelApplication[5];
shared2Model = new ChoiceModelApplication[5];
shared3Model = new ChoiceModelApplication[5];
driveAloneModel = new ChoiceModelApplication[dmu.mgra_index_map.size()];
shared2Model = new ChoiceModelApplication[dmu.mgra_index_map.size()];
shared3Model = new ChoiceModelApplication[dmu.mgra_index_map.size()];

for (int i = 0; i < 5; i++){
for (int i = 0; i < dmu.mgra_index_map.size(); i++){
// create a ChoiceModelApplication object for drive-alone mode choice
driveAloneModel[i] = new ChoiceModelApplication(airportModeUecFileName, daPage, dataPage,
rbMap, (VariableTable) dmu);
@@ -108,10 +117,6 @@ public AirportModeChoiceModel(HashMap<String, String> rbMap, AirportDmuFactoryIf
rbMap, (VariableTable) dmu);
}

// fake choice model to get airport access MGRA input
mgraModel = new ChoiceModelApplication(airportModeUecFileName, mgraPage, dataPage,
rbMap, (VariableTable) dmu);

rideHailModel = new ChoiceModelApplication(airportModeUecFileName, rideHailPage, dataPage,
rbMap, (VariableTable) dmu);

@@ -143,6 +148,10 @@ public AirportModeChoiceModel(HashMap<String, String> rbMap, AirportDmuFactoryIf
}
}
seek = Util.getBooleanValueFromPropertyMap(rbMap, "Seek");

debugChoiceModel = Util.getBooleanValueFromPropertyMap(rbMap, "airport.debug");
debugPartyID = Integer.parseInt(Util.getStringValueFromPropertyMap(rbMap,
"airport.debug.party.id"));

}

@@ -170,7 +179,7 @@ public void initializeBestPathCalculators()
/**
* get access mode MGRA from UEC user input
*/
public void solveModeMgra(AirportModelDMU dmu){ //question for Jim -- Do I need dmu index for this one?
public void solveModeMgra(AirportModelDMU dmu){
mgraModel.computeUtilities(dmu, dmu.getDmuIndex());

int modeCount = mgraModel.getNumberOfAlternatives();
@@ -254,15 +263,15 @@ public void chooseMode(AirportParty party, AirportModelDMU dmu)
if (party.getDirection() == AirportModelStructure.ARRIVAL) inbound = true;

dmu.setAirportParty(party);
//dmu.setDmuIndexValues(party.getID(), origTaz, destTaz); // should this be access point Taz?

dmu.setDmuSkimAttributes(origMgra, destMgra, period, inbound, debug);

// Solve trip mode level utilities

for (int mode = 1; mode <= AirportModelStructure.ACCESS_MODES; mode++)
{
airportMgra = dmu.mode_mgra_map.get(mode);
//dmu.setAirportMgra(airportMgra);

airportMgra_index = dmu.mgra_index_map.get(airportMgra);

if (airportMgra == -999)
@@ -303,11 +312,6 @@ else if (los == AirportModelStructure.SR3){
double shared3Logsum = shared3Model[airportMgra_index].getLogsum();
dmu.setModeTravelTime(nonAirportMgra, airportMgra_index, direction, los, shared3Logsum);
}
// else {
// transitModel.computeUtilities(dmu, dmu.getDmuIndex());
// double transitLogsum = transitModel.getLogsum();
// dmu.setModeTravelTime(nonAirportMgra, airportMgra_index, direction, los, transitLogsum);
// }
}
}

@@ -341,7 +345,7 @@ else if (los == AirportModelStructure.SR3){
party.setAirportAccessMGRA(airportAccessMGRA);

// add debug
if (party.getID() == 5)
if (debugChoiceModel & party.getID() == debugPartyID)
{
String choiceModelDescription = "";
String decisionMakerLabel = "";
@@ -420,11 +424,6 @@ public void chooseModes(HashMap<String, String> rbMap, AirportParty[] airportPar
{

int ID = party.getID();

// if (ID != 56)
// {
// continue;
// }

if ((ID <= 5) || (ID % 100) == 0)
logger.info("Choosing mode for party " + party.getID());
12 changes: 6 additions & 6 deletions src/main/java/org/sandag/abm/airport/AirportModelStructure.java
Original file line number Diff line number Diff line change
@@ -34,9 +34,9 @@ public final class AirportModelStructure
public static final int PARK_LOC1 = 1;
public static final int PARK_LOC2 = 2;
public static final int PARK_LOC3 = 3;
public static final int PARK_LOC4 = 4;
public static final int PARK_LOC5 = 5;
public static final int PARK_ESC = 6;
public static final int PARK_LOC4 = 4;
public static final int PARK_LOC5 = 5;
public static final int PARK_ESC = 6;
public static final int RENTAL = 7;
public static final int SHUTTLE_VAN = 8;
public static final int HOTEL_COURTESY = 9;
@@ -52,9 +52,9 @@ public final class AirportModelStructure
public static final int LOS_TYPE = 4;

public static final int DA = 0;
public static final int SR2 = 1;
public static final int SR3 = 2;
public static final int Transit = 3;
public static final int SR2 = 1;
public static final int SR3 = 2;
public static final int Transit = 3;


private AirportModelStructure()
103 changes: 95 additions & 8 deletions src/main/java/org/sandag/abm/airport/AirportPartyManager.java
Original file line number Diff line number Diff line change
@@ -27,6 +27,8 @@ public class AirportPartyManager
private double[][] incomeDistribution;
private double[][] departureDistribution;
private double[][] arrivalDistribution;

private int airportMgra;

SandagModelStructure sandagStructure;

@@ -73,6 +75,9 @@ public AirportPartyManager(HashMap<String, String> rbMap, float sampleRate)
"airport.annualizationFactor"));
float averageSize = new Float(Util.getStringValueFromPropertyMap(rbMap,
"airport.averageSize"));

airportMgra = Util.getIntegerValueFromPropertyMap(rbMap,
"airport.airportMgra");

float directPassengers = (enplanements - connectingPassengers) / annualFactor;
int totalParties = (int) (directPassengers / averageSize) * 2;
@@ -329,22 +334,104 @@ public void writeOutputFile(HashMap<String, String> rbMap)
throw new RuntimeException();
}
String headerString = new String(
"id,direction,purpose,size,income,nights,departTime,originMGRA,destinationMGRA,airportAccessMGRA,tripMode,arrivalMode,boardingTAP,alightingTAP\n");
"id,direction,purpose,size,income,nights,departTime,originMGRA,destinationMGRA,tripMode,arrivalMode,boardingTAP,alightingTAP\n");
writer.print(headerString);

// Iterate through the array, printing records to the file
for (int i = 0; i < parties.length; ++i)
{

int[] taps = getTapPair(parties[i]);

int airportAccessMgra = parties[i].getAirportAccessMGRA();
int accMode_null = -99;

// if the arrival mode access point is transit, or it's an external trip
if (airportAccessMgra <= 0)
{
String record = new String(parties[i].getID() + "," + parties[i].getDirection() + ","
+ parties[i].getPurpose() + "," + parties[i].getSize() + ","
+ parties[i].getIncome() + "," + parties[i].getNights() + ","
+ parties[i].getDepartTime() + "," + parties[i].getOriginMGRA() + ","
+ parties[i].getDestinationMGRA() + "," + parties[i].getMode() + ","
+ parties[i].getArrivalMode() + "," + taps[0] + "," + taps[1] + "\n");

writer.print(record);

continue;
}

// if the arrival mode access point is not transit, two trip legs will be printed out
else
{
String record_Origin2Access = new String();
String record_Access2Destination = new String();

if (parties[i].getDirection() == AirportModelStructure.DEPARTURE)
{
record_Origin2Access = new String(parties[i].getID() + "," + parties[i].getDirection() + ","
+ parties[i].getPurpose() + "," + parties[i].getSize() + ","
+ parties[i].getIncome() + "," + parties[i].getNights() + ","
+ parties[i].getDepartTime() + "," + parties[i].getOriginMGRA() + ","
+ parties[i].getAirportAccessMGRA() + "," + parties[i].getMode() + ","
+ parties[i].getArrivalMode() + "," + taps[0] + "," + taps[1] + "\n");

// if access point is airport terminal, connection mode is walk
if (airportAccessMgra == airportMgra)
{
record_Access2Destination = new String(parties[i].getID() + "," + parties[i].getDirection() + ","
+ parties[i].getPurpose() + "," + parties[i].getSize() + ","
+ parties[i].getIncome() + "," + parties[i].getNights() + ","
+ parties[i].getDepartTime() + "," + parties[i].getAirportAccessMGRA() + ","
+ parties[i].getDestinationMGRA() + "," + SandagModelStructure.WALK_ALTS[0] + ","
+ accMode_null + "," + taps[0] + "," + taps[1] + "\n");
}
// else if access point is not airport terminal, connection mode is transit (APM)
else
{
record_Access2Destination = new String(parties[i].getID() + "," + parties[i].getDirection() + ","
+ parties[i].getPurpose() + "," + parties[i].getSize() + ","
+ parties[i].getIncome() + "," + parties[i].getNights() + ","
+ parties[i].getDepartTime() + "," + parties[i].getAirportAccessMGRA() + ","
+ parties[i].getDestinationMGRA() + "," + SandagModelStructure.WALK_TRANSIT_ALTS[0] + ","
+ accMode_null + "," + taps[0] + "," + taps[1] + "\n");
}
writer.print(record_Origin2Access);
writer.print(record_Access2Destination);
}
else
{
record_Access2Destination = new String(parties[i].getID() + "," + parties[i].getDirection() + ","
+ parties[i].getPurpose() + "," + parties[i].getSize() + ","
+ parties[i].getIncome() + "," + parties[i].getNights() + ","
+ parties[i].getDepartTime() + "," + parties[i].getAirportAccessMGRA() + ","
+ parties[i].getDestinationMGRA() + "," + parties[i].getMode() + ","
+ parties[i].getArrivalMode() + "," + taps[0] + "," + taps[1] + "\n");
// if access point is airport terminal, connection mode is walk
if (airportAccessMgra == airportMgra)
{
record_Origin2Access = new String(parties[i].getID() + "," + parties[i].getDirection() + ","
+ parties[i].getPurpose() + "," + parties[i].getSize() + ","
+ parties[i].getIncome() + "," + parties[i].getNights() + ","
+ parties[i].getDepartTime() + "," + parties[i].getOriginMGRA() + ","
+ parties[i].getAirportAccessMGRA() + "," + SandagModelStructure.WALK_ALTS[0] + ","
+ accMode_null + "," + taps[0] + "," + taps[1] + "\n");
}
// else if access point is not airport terminal, connection mode is transit (APM)
else
{
record_Origin2Access = new String(parties[i].getID() + "," + parties[i].getDirection() + ","
+ parties[i].getPurpose() + "," + parties[i].getSize() + ","
+ parties[i].getIncome() + "," + parties[i].getNights() + ","
+ parties[i].getDepartTime() + "," + parties[i].getOriginMGRA() + ","
+ parties[i].getAirportAccessMGRA() + "," + SandagModelStructure.WALK_TRANSIT_ALTS[0] + ","
+ accMode_null + "," + taps[0] + "," + taps[1] + "\n");
}
writer.print(record_Origin2Access);
writer.print(record_Access2Destination);
}
}

String record = new String(parties[i].getID() + "," + parties[i].getDirection() + ","
+ parties[i].getPurpose() + "," + parties[i].getSize() + ","
+ parties[i].getIncome() + "," + parties[i].getNights() + ","
+ parties[i].getDepartTime() + "," + parties[i].getOriginMGRA() + ","
+ parties[i].getDestinationMGRA() + "," + parties[i].getAirportAccessMGRA() + "," + parties[i].getMode() + ","
+ parties[i].getArrivalMode() + "," + taps[0] + "," + taps[1] + "\n");
writer.print(record);
}
writer.close();