1
0
Fork 0

Spectacular improvement in traffic manager initialization and preparatory

work for ground based distance separation of AIAircraft.

Traffic manager initialization related changes:
- Schedules initialize "on the fly", instead of during initialization
- Invalid routes are no longer deleted, but marked as BOGUS and ignored
- Changed loading order from a distance based prioritization to a point-
  score based prioritization, resulting in a much faster establisment of
  AIAircraft near the user's plane.

Preparatory work for ground-based separation of Aircraft.
- The groundnetwork findShrortestRoute function not only returns a list
  of waypoints, but also a list of taxi "segments" (a.k.a. taxiways).
- The taxiway list is stored in the Flightplan, and updated everytime
  a new taxi leg is created.
This commit is contained in:
durk 2006-07-29 18:17:19 +00:00
parent 46a3200569
commit 8c2e595ff0
11 changed files with 219 additions and 104 deletions

View file

@ -49,6 +49,7 @@ FGAIFlightPlan::FGAIFlightPlan(const string& filename)
start_time = 0;
leg = 10;
gateId = 0;
taxiRoute = 0;
SGPath path( globals->get_fg_root() );
path.append( ("/AI/FlightPlans/" + filename).c_str() );
SGPropertyNode root;
@ -113,6 +114,7 @@ FGAIFlightPlan::FGAIFlightPlan(const std::string& p,
repeat = false;
leg = 10;
gateId=0;
taxiRoute = 0;
start_time = start;
bool useInitialWayPoint = true;
bool useCurrentWayPoint = false;
@ -300,6 +302,8 @@ FGAIFlightPlan::~FGAIFlightPlan()
// delete *(waypoints.begin());
// waypoints.erase (waypoints.begin());
// }
if (taxiRoute)
delete taxiRoute;
}

View file

@ -112,7 +112,8 @@ private:
int leg;
int gateId;
string activeRunway;
FGAirRoute route;
FGAirRoute airRoute;
FGTaxiRoute *taxiRoute;
Point3D temp;

View file

@ -192,6 +192,8 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
double lat2, lon2, az2;
waypoint *wpt;
int nrWaypointsToSkip;
if (direction == 1)
{
// If this function is called during initialization,
@ -256,15 +258,18 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
// fallback mechanism for this.
// Starting from gate 0 in this case is a bit of a hack
// which requires a more proper solution later on.
FGTaxiRoute route;
//FGTaxiRoute route;
if (taxiRoute)
delete taxiRoute;
taxiRoute = new FGTaxiRoute;
if (gateId >= 0)
route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(gateId,
*taxiRoute = apt->getDynamics()->getGroundNetwork()->findShortestRoute(gateId,
runwayId);
else
route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(0, runwayId);
*taxiRoute = apt->getDynamics()->getGroundNetwork()->findShortestRoute(0, runwayId);
intVecIterator i;
if (route.empty()) {
if (taxiRoute->empty()) {
//Add the runway startpoint;
wpt = new waypoint;
wpt->name = "Airport Center";
@ -294,34 +299,35 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
waypoints.push_back(wpt);
} else {
int node;
route.first();
taxiRoute->first();
bool isPushBackPoint = false;
if (firstFlight) {
// If this is called during initialization, randomly
// skip a number of waypoints to get a more realistic
// taxi situation.
isPushBackPoint = true;
int nrWaypoints = route.size();
int nrWaypointsToSkip = rand() % nrWaypoints;
int nrWaypoints = taxiRoute->size();
nrWaypointsToSkip = rand() % nrWaypoints;
// but make sure we always keep two active waypoints
// to prevent a segmentation fault
for (int i = 0; i < nrWaypointsToSkip-2; i++) {
isPushBackPoint = false;
route.next(&node);
taxiRoute->next(&node);
}
}
else {
//chop off the first two waypoints, because
// those have already been created
// by create pushback
int size = route.size();
int size = taxiRoute->size();
if (size > 2) {
route.next(&node);
route.next(&node);
taxiRoute->next(&node);
taxiRoute->next(&node);
}
}
while(route.next(&node))
while(taxiRoute->next(&node))
{
//FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findSegment(node)->getEnd();
FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node);
//ids.pop_back();
wpt = new waypoint;
@ -345,7 +351,20 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
wpt->on_ground = true;
waypoints.push_back(wpt);
}
cerr << endl;
//cerr << endl;
// finally, rewind the taxiRoute object to the point where we started
taxiRoute->first();
if (firstFlight) {
for (int i = 0; i < nrWaypointsToSkip-2; i++) {
taxiRoute->next(&node);
}
} else {
int size = taxiRoute->size();
if (size > 2) {
taxiRoute->next(&node);
taxiRoute->next(&node);
}
}
}
}
else
@ -399,16 +418,19 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
// A negative gateId indicates an overflow parking, use a
// fallback mechanism for this.
// Starting from gate 0 is a bit of a hack...
FGTaxiRoute route;
//FGTaxiRoute route;
if (taxiRoute)
delete taxiRoute;
taxiRoute = new FGTaxiRoute;
if (gateId >= 0)
route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId,
*taxiRoute = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId,
gateId);
else
route = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId, 0);
*taxiRoute = apt->getDynamics()->getGroundNetwork()->findShortestRoute(runwayId, 0);
intVecIterator i;
// No route found: go from gate directly to runway
if (route.empty()) {
if (taxiRoute->empty()) {
//Add the runway startpoint;
wpt = new waypoint;
wpt->name = "Airport Center";
@ -438,13 +460,14 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
waypoints.push_back(wpt);
} else {
int node;
route.first();
int size = route.size();
taxiRoute->first();
int size = taxiRoute->size();
// Omit the last two waypoints, as
// those are created by createParking()
for (int i = 0; i < size-2; i++)
{
route.next(&node);
taxiRoute->next(&node);
//FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node);
FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node);
wpt = new waypoint;
wpt->name = "taxiway"; // fixme: should be the name of the taxiway
@ -636,7 +659,7 @@ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed,
heading = rwy._heading;
double azimuth = heading + 180.0;
while ( azimuth >= 360.0 ) { azimuth -= 360.0; }
cerr << "Creating climb at : " << rwy._id << " " << rwy._rwy_no << endl;
//cerr << "Creating climb at : " << rwy._id << " " << rwy._rwy_no << endl;
geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, heading,
10*SG_NM_TO_METER,
&lat2, &lon2, &az2 );

View file

@ -119,7 +119,7 @@ void FGAIFlightPlan::evaluateRoutePart(double deplat,
FGAirRoute routePart = globals->get_airwaynet()->findShortestRoute(*i, *j);
if (!(routePart.empty()))
{
route.add(routePart);
airRoute.add(routePart);
i = j;
break;
}

View file

@ -102,10 +102,9 @@ void FGTaxiSegment::setTrackDistance()
end->getLatitude(),
0);
first.CourseAndDistance(second, &course, &length);
}
bool FGTaxiRoute::next(int *val)
bool FGTaxiRoute::next(int *nde)
{
//for (intVecIterator i = nodes.begin(); i != nodes.end(); i++)
// cerr << "FGTaxiRoute contains : " << *(i) << endl;
@ -114,11 +113,35 @@ bool FGTaxiRoute::next(int *val)
// cerr << "true" << endl;
//else
// cerr << "false" << endl;
//if (nodes.size() != (routes.size()) +1)
// cerr << "ALERT: Misconfigured TaxiRoute : " << nodes.size() << " " << routes.size() << endl;
if (currNode == nodes.end())
return false;
*val = *(currNode);
*nde = *(currNode);
currNode++;
currRoute++;
return true;
};
bool FGTaxiRoute::next(int *nde, int *rte)
{
//for (intVecIterator i = nodes.begin(); i != nodes.end(); i++)
// cerr << "FGTaxiRoute contains : " << *(i) << endl;
//cerr << "Offset from end: " << nodes.end() - currNode << endl;
//if (currNode != nodes.end())
// cerr << "true" << endl;
//else
// cerr << "false" << endl;
//if (nodes.size() != (routes.size()) +1)
// cerr << "ALERT: Misconfigured TaxiRoute : " << nodes.size() << " " << routes.size() << endl;
if (currNode == nodes.end())
return false;
*nde = *(currNode);
*rte = *(currRoute);
currNode++;
currRoute++;
return true;
};
/***************************************************************************
@ -163,12 +186,14 @@ void FGGroundNetwork::addNodes(FGParkingVec *parkings)
void FGGroundNetwork::init()
{
hasNetwork = true;
int index = 0;
FGTaxiSegmentVectorIterator i = segments.begin();
while(i != segments.end()) {
//cerr << "initializing node " << i->getIndex() << endl;
i->setStart(&nodes);
i->setEnd (&nodes);
i->setTrackDistance();
i->setIndex(index++);
//cerr << "Track distance = " << i->getLength() << endl;
//cerr << "Track ends at" << i->getEnd()->getIndex() << endl;
i++;
@ -216,6 +241,18 @@ FGTaxiNode *FGGroundNetwork::findNode(int idx)
return 0;
}
FGTaxiSegment *FGGroundNetwork::findSegment(int idx)
{
for (FGTaxiSegmentVectorIterator
itr = segments.begin();
itr != segments.end(); itr++)
{
if (itr->getIndex() == idx)
return itr->getAddress();
}
return 0;
}
FGTaxiRoute FGGroundNetwork::findShortestRoute(int start, int end)
{
foundRoute = false;
@ -225,7 +262,9 @@ FGTaxiRoute FGGroundNetwork::findShortestRoute(int start, int end)
//prevNode = prevPrevNode = -1;
//prevNode = start;
routes.clear();
traceStack.clear();
nodesStack.clear();
routesStack.clear();
trace(firstNode, end, 0, 0);
FGTaxiRoute empty;
@ -249,7 +288,7 @@ FGTaxiRoute FGGroundNetwork::findShortestRoute(int start, int end)
void FGGroundNetwork::trace(FGTaxiNode *currNode, int end, int depth, double distance)
{
traceStack.push_back(currNode->getIndex());
nodesStack.push_back(currNode->getIndex());
totalDistance += distance;
//cerr << "Starting trace " << depth << " total distance: " << totalDistance<< endl;
//<< currNode->getIndex() << endl;
@ -258,9 +297,10 @@ void FGGroundNetwork::trace(FGTaxiNode *currNode, int end, int depth, double dis
// So we can add this to the routing table
if (currNode->getIndex() == end)
{
//cerr << "Found route : " << totalDistance << "" << " " << *(traceStack.end()-1) << endl;
routes.push_back(FGTaxiRoute(traceStack,totalDistance));
traceStack.pop_back();
//cerr << "Found route : " << totalDistance << "" << " " << *(nodesStack.end()-1) << endl;
routes.push_back(FGTaxiRoute(nodesStack,routesStack,totalDistance));
nodesStack.pop_back();
routesStack.pop_back();
if (!(foundRoute))
maxDistance = totalDistance;
else
@ -276,18 +316,19 @@ void FGGroundNetwork::trace(FGTaxiNode *currNode, int end, int depth, double dis
// if so, we should step back one level, because it is
// rather rediculous to proceed further from here.
// if the current node has not been encountered before,
// i should point to traceStack.end()-1; and we can continue
// if i is not traceStack.end, the previous node was found,
// i should point to nodesStack.end()-1; and we can continue
// if i is not nodesStack.end, the previous node was found,
// and we should return.
// This only works at trace levels of 1 or higher though
if (depth > 0) {
intVecIterator i = traceStack.begin();
intVecIterator i = nodesStack.begin();
while ((*i) != currNode->getIndex()) {
//cerr << "Route so far : " << (*i) << endl;
i++;
}
if (i != traceStack.end()-1) {
traceStack.pop_back();
if (i != nodesStack.end()-1) {
nodesStack.pop_back();
routesStack.pop_back();
totalDistance -= distance;
return;
}
@ -297,7 +338,8 @@ void FGGroundNetwork::trace(FGTaxiNode *currNode, int end, int depth, double dis
if ((totalDistance > maxDistance) && foundRoute)
{
//cerr << "Stopping rediculously long trace: " << totalDistance << endl;
traceStack.pop_back();
nodesStack.pop_back();
routesStack.pop_back();
totalDistance -= distance;
return;
}
@ -312,7 +354,10 @@ void FGGroundNetwork::trace(FGTaxiNode *currNode, int end, int depth, double dis
i != currNode->getEndRoute();
i++)
{
//cerr << (*i)->getLenght() << endl;
//cerr << (*i)->getLength() << endl;
//cerr << (*i)->getIndex() << endl;
int idx = (*i)->getIndex();
routesStack.push_back((*i)->getIndex());
trace((*i)->getEnd(), end, depth+1, (*i)->getLength());
// {
// // cerr << currNode -> getIndex() << " ";
@ -325,7 +370,8 @@ void FGGroundNetwork::trace(FGTaxiNode *currNode, int end, int depth, double dis
{
SG_LOG( SG_GENERAL, SG_DEBUG, "4" );
}
traceStack.pop_back();
nodesStack.pop_back();
routesStack.pop_back();
totalDistance -= distance;
return;
}

View file

@ -104,6 +104,8 @@ public:
double getLength() { return length; };
int getIndex() { return index; };
FGTaxiSegment *getAddress() { return this;};
};
@ -111,21 +113,32 @@ public:
typedef vector<int> intVec;
typedef vector<int>::iterator intVecIterator;
/***************************************************************************************
* class FGTaxiRoute
**************************************************************************************/
class FGTaxiRoute
{
private:
intVec nodes;
intVec routes;
double distance;
intVecIterator currNode;
intVecIterator currRoute;
public:
FGTaxiRoute() { distance = 0; currNode = nodes.begin(); };
FGTaxiRoute(intVec nds, double dist) { nodes = nds; distance = dist; currNode = nodes.begin();};
FGTaxiRoute() { distance = 0; currNode = nodes.begin(); currRoute = routes.begin();};
FGTaxiRoute(intVec nds, intVec rts, double dist) {
nodes = nds;
routes = rts;
distance = dist;
currNode = nodes.begin();
};
bool operator< (const FGTaxiRoute &other) const {return distance < other.distance; };
bool empty () { return nodes.begin() == nodes.end(); };
bool next(int *val);
bool next(int *nde);
bool next(int *nde, int *rte);
void first() { currNode = nodes.begin(); };
void first() { currNode = nodes.begin(); currRoute = routes.begin(); };
int size() { return nodes.size(); };
};
@ -142,7 +155,8 @@ private:
FGTaxiNodeVector nodes;
FGTaxiSegmentVector segments;
//intVec route;
intVec traceStack;
intVec nodesStack;
intVec routesStack;
TaxiRouteVector routes;
bool foundRoute;
@ -159,6 +173,7 @@ public:
bool exists() { return hasNetwork; };
int findNearestNode(double lat, double lon);
FGTaxiNode *findNode(int idx);
FGTaxiSegment *findSegment(int idx);
FGTaxiRoute findShortestRoute(int start, int end);
void trace(FGTaxiNode *, int, int, double dist);

View file

@ -265,13 +265,13 @@ bool FGScheduledFlight::initializeAirports()
departurePort = globals->get_airports()->search(depId);
if(departurePort == NULL)
{
cerr << "Could not find " << depId << endl;
SG_LOG( SG_GENERAL, SG_WARN, "Traffic manager could not find departure airport : " << depId);
return false;
}
arrivalPort = globals->get_airports()->search(arrId);
if(arrivalPort == NULL)
{
cerr << "Could not find " << arrId << endl;
SG_LOG( SG_GENERAL, SG_WARN, "Traffic manager could not find arrival airort : " << arrId);
return false;
}

View file

@ -25,6 +25,8 @@
# include "config.h"
#endif
#define BOGUS 0xFFFF
#include <stdlib.h>
#include <time.h>
#include <iostream>
@ -72,6 +74,7 @@ FGAISchedule::FGAISchedule()
radius = 0;
groundOffset = 0;
distanceToUser = 0;
score = 0;
}
FGAISchedule::FGAISchedule(string mdl,
@ -84,6 +87,7 @@ FGAISchedule::FGAISchedule(string mdl,
string fltpe,
double rad,
double grnd,
int scre,
FGScheduledFlightVec flt)
{
modelPath = mdl;
@ -104,6 +108,7 @@ FGAISchedule::FGAISchedule(string mdl,
i++)
flights.push_back(FGScheduledFlight((*i)));
AIManagerRef = 0;
score = scre;
firstRun = true;
}
@ -124,6 +129,7 @@ FGAISchedule::FGAISchedule(const FGAISchedule &other)
radius = other.radius;
groundOffset = other.groundOffset;
flightType = other.flightType;
score = other.score;
distanceToUser = other.distanceToUser;
}
@ -155,7 +161,7 @@ bool FGAISchedule::init()
// Since time isn't initialized yet when this function is called,
// Find the closest possible airport.
// This should give a reasonable initialization order.
setClosestDistanceToUser();
//setClosestDistanceToUser();
return true;
}
@ -203,6 +209,9 @@ bool FGAISchedule::update(time_t now)
// finally kicks in.
if (firstRun)
{
if (init() == false)
AIManagerRef = BOGUS;
for (FGScheduledFlightVecIterator i = flights.begin();
i != flights.end();
i++)
@ -460,47 +469,47 @@ double FGAISchedule::getSpeed()
}
void FGAISchedule::setClosestDistanceToUser()
{
// void FGAISchedule::setClosestDistanceToUser()
// {
double course;
double dist;
// double course;
// double dist;
Point3D temp;
time_t
totalTimeEnroute,
elapsedTimeEnroute;
// Point3D temp;
// time_t
// totalTimeEnroute,
// elapsedTimeEnroute;
double userLatitude = fgGetDouble("/position/latitude-deg");
double userLongitude = fgGetDouble("/position/longitude-deg");
// double userLatitude = fgGetDouble("/position/latitude-deg");
// double userLongitude = fgGetDouble("/position/longitude-deg");
FGAirport *dep;
// FGAirport *dep;
#if defined( __CYGWIN__) || defined( __MINGW32__)
#define HUGE HUGE_VAL
#endif
distanceToUser = HUGE;
FGScheduledFlightVecIterator i = flights.begin();
while (i != flights.end())
{
dep = i->getDepartureAirport();
//if (!(dep))
//return HUGE;
// #if defined( __CYGWIN__) || defined( __MINGW32__)
// #define HUGE HUGE_VAL
// #endif
// distanceToUser = HUGE;
// FGScheduledFlightVecIterator i = flights.begin();
// while (i != flights.end())
// {
// dep = i->getDepartureAirport();
// //if (!(dep))
// //return HUGE;
SGWayPoint user ( userLongitude,
userLatitude,
i->getCruiseAlt());
SGWayPoint current (dep->getLongitude(),
dep->getLatitude(),
0);
user.CourseAndDistance(current, &course, &dist);
if (dist < distanceToUser)
{
distanceToUser = dist;
//cerr << "Found closest distance to user for " << registration << " to be " << distanceToUser << " at airport " << dep->getId() << endl;
}
i++;
}
//return distToUser;
}
// SGWayPoint user ( userLongitude,
// userLatitude,
// i->getCruiseAlt());
// SGWayPoint current (dep->getLongitude(),
// dep->getLatitude(),
// 0);
// user.CourseAndDistance(current, &course, &dist);
// if (dist < distanceToUser)
// {
// distanceToUser = dist;
// //cerr << "Found closest distance to user for " << registration << " to be " << distanceToUser << " at airport " << dep->getId() << endl;
// }
// i++;
// }
// //return distToUser;
// }

View file

@ -50,13 +50,15 @@ class FGAISchedule
double groundOffset;
double distanceToUser;
int AIManagerRef;
int score;
bool firstRun;
public:
FGAISchedule(); // constructor
FGAISchedule(string, string, string, bool, string, string, string, string, double, double, FGScheduledFlightVec); // construct & init
FGAISchedule(const FGAISchedule &other); // copy constructor
FGAISchedule(string, string, string, bool, string, string, string, string, double, double,
int, FGScheduledFlightVec); // construct & init
FGAISchedule(const FGAISchedule &other); // copy constructor
~FGAISchedule(); //destructor
@ -64,7 +66,7 @@ class FGAISchedule
bool init();
double getSpeed ();
void setClosestDistanceToUser();
//void setClosestDistanceToUser();
void next(); // forces the schedule to move on to the next flight.
time_t getDepartureTime () { return flights.begin()->getDepartureTime (); };
@ -79,7 +81,9 @@ class FGAISchedule
const string& getCallSign () { return flights.begin()->getCallSign (); };
const string& getRegistration () { return registration;};
bool getHeavy () { return heavy; };
bool operator< (const FGAISchedule &other) const { return (distanceToUser < other.distanceToUser); };
// used to sort in decending order of score: I've probably found a better way to
// decending order sorting, but still need to test that.
bool operator< (const FGAISchedule &other) const { return (score > other.score); };
//void * getAiRef () { return AIManagerRef; };
//FGAISchedule* getAddress () { return this;};
// More member functions follow later

View file

@ -63,7 +63,7 @@
#include <AIModel/AIFlightPlan.hxx>
#include <AIModel/AIBase.hxx>
#include <Airports/simple.hxx>
#include <Main/fg_init.hxx> // That's pretty ugly, but I need fgFindAirportID
#include <Main/fg_init.hxx>
@ -76,26 +76,27 @@ SG_USING_STD(sort);
*****************************************************************************/
FGTrafficManager::FGTrafficManager()
{
score = 0;
}
void FGTrafficManager::init()
{
//cerr << "Initializing Schedules" << endl;
time_t now = time(NULL) + fgGetLong("/sim/time/warp");
currAircraft = scheduledAircraft.begin();
while (currAircraft != scheduledAircraft.end())
{
if (!(currAircraft->init()))
{
currAircraft=scheduledAircraft.erase(currAircraft);
//cerr << "Erasing " << currAircraft->getRegistration() << endl;
}
else
{
currAircraft++;
}
}
//time_t now = time(NULL) + fgGetLong("/sim/time/warp");
//currAircraft = scheduledAircraft.begin();
//while (currAircraft != scheduledAircraft.end())
// {
// if (!(currAircraft->init()))
// {
// currAircraft=scheduledAircraft.erase(currAircraft);
// //cerr << "Erasing " << currAircraft->getRegistration() << endl;
// }
// else
// {
// currAircraft++;
// }
// }
//cerr << "Sorting by distance " << endl;
sort(scheduledAircraft.begin(), scheduledAircraft.end());
currAircraft = scheduledAircraft.begin();
@ -107,7 +108,7 @@ void FGTrafficManager::update(double something)
{
time_t now = time(NULL) + fgGetLong("/sim/time/warp");
if (scheduledAircraft.size() == 0)
return;
return;
if(currAircraft == scheduledAircraft.end())
{
//cerr << "resetting schedule " << endl;
@ -226,6 +227,11 @@ void FGTrafficManager::endElement (const char * name) {
//cerr << "Pusing back flight " << callsign << endl;
//cerr << callsign << " " << fltrules << " "<< departurePort << " " << arrivalPort << " "
// << cruiseAlt << " " << departureTime<< " "<< arrivalTime << " " << repeat << endl;
//Prioritize aircraft
string apt = fgGetString("/sim/presets/airport-id");
//cerr << "Airport information: " << apt << " " << departurePort << " " << arrivalPort << endl;
if (departurePort == apt) score++;
flights.push_back(FGScheduledFlight(callsign,
fltrules,
departurePort,
@ -248,9 +254,15 @@ void FGTrafficManager::endElement (const char * name) {
flighttype,
radius,
offset,
score,
flights));
while(flights.begin() != flights.end())
flights.pop_back();
SG_LOG( SG_GENERAL, SG_BULK, "Reading aircraft : "
<< registration
<< " with prioritization score "
<< score);
score = 0;
}
}

View file

@ -49,6 +49,7 @@ private:
port, timeString, departurePort, departureTime, arrivalPort, arrivalTime,
repeat, acType, airline, m_class, flighttype;
int cruiseAlt;
int score;
double radius, offset;
bool heavy;