std::pair<MSVehicle* const, SUMOReal> MSLaneChanger::getRealLeader(const ChangerIt& target) const { // get the leading vehicle on the lane to change to MSVehicle* neighLead = target->lead; //if (veh(myCandi)->getID() == "disabled") std::cout << SIMTIME // << " target=" << target->lane->getID() // << " neighLead=" << Named::getIDSecure(neighLead) // << " hopped=" << Named::getIDSecure(target->hoppedVeh) // << " (416)\n"; // check whether the hopped vehicle became the leader if (target->hoppedVeh != 0) { SUMOReal hoppedPos = target->hoppedVeh->getPositionOnLane(); if (hoppedPos > veh(myCandi)->getPositionOnLane() && (neighLead == 0 || neighLead->getPositionOnLane() > hoppedPos)) { neighLead = target->hoppedVeh; //if (veh(myCandi)->getID() == "flow.21") std::cout << SIMTIME << " neighLead=" << Named::getIDSecure(neighLead) << " (422)\n"; } } if (neighLead == 0) { MSLane* targetLane = target->lane; if (targetLane->myPartialVehicles.size() > 0) { assert(targetLane->myPartialVehicles.size() == 1); MSVehicle* leader = targetLane->myPartialVehicles.front(); return std::pair<MSVehicle*, SUMOReal>(leader, leader->getBackPositionOnLane(targetLane) - veh(myCandi)->getPositionOnLane() - veh(myCandi)->getVehicleType().getMinGap()); } SUMOReal seen = myCandi->lane->getLength() - veh(myCandi)->getPositionOnLane(); SUMOReal speed = veh(myCandi)->getSpeed(); SUMOReal dist = veh(myCandi)->getCarFollowModel().brakeGap(speed) + veh(myCandi)->getVehicleType().getMinGap(); if (seen > dist) { return std::pair<MSVehicle* const, SUMOReal>(static_cast<MSVehicle*>(0), -1); } const std::vector<MSLane*>& bestLaneConts = veh(myCandi)->getBestLanesContinuation(targetLane); //if (veh(myCandi)->getID() == "flow.21") std::cout << SIMTIME << " calling getLeaderOnConsecutive (443)\n"; return target->lane->getLeaderOnConsecutive(dist, seen, speed, *veh(myCandi), bestLaneConts); } else { MSVehicle* candi = veh(myCandi); return std::pair<MSVehicle* const, SUMOReal>(neighLead, neighLead->getBackPositionOnLane(target->lane) - candi->getPositionOnLane() - candi->getVehicleType().getMinGap()); } }
std::pair<MSVehicle* const, SUMOReal> MSLaneChanger::getRealLeader(const ChangerIt& target) const { assert(veh(myCandi) != 0); #ifdef DEBUG_SURROUNDING_VEHICLES MSVehicle* vehicle = veh(myCandi); if (DEBUG_COND) { std::cout << SIMTIME << " veh '" << vehicle->getID() << "' looks for leader on lc-target lane '" << target->lane->getID() << "'." << std::endl; } #endif // get the leading vehicle on the lane to change to MSVehicle* neighLead = target->lead; #ifdef DEBUG_SURROUNDING_VEHICLES if (DEBUG_COND) { if (neighLead != 0) { std::cout << "Considering '" << neighLead->getID() << "' at position " << neighLead->getPositionOnLane() << std::endl; } } #endif //if (veh(myCandi)->getID() == "disabled") std::cout << SIMTIME // << " target=" << target->lane->getID() // << " neighLead=" << Named::getIDSecure(neighLead) // << " hopped=" << Named::getIDSecure(target->hoppedVeh) // << " (416)\n"; // check whether the hopped vehicle became the leader if (target->hoppedVeh != 0) { SUMOReal hoppedPos = target->hoppedVeh->getPositionOnLane(); #ifdef DEBUG_SURROUNDING_VEHICLES if (DEBUG_COND) { std::cout << "Considering hopped vehicle '" << target->hoppedVeh->getID() << "' at position " << hoppedPos << std::endl; } #endif if (hoppedPos > veh(myCandi)->getPositionOnLane() && (neighLead == 0 || neighLead->getPositionOnLane() > hoppedPos)) { neighLead = target->hoppedVeh; //if (veh(myCandi)->getID() == "flow.21") std::cout << SIMTIME << " neighLead=" << Named::getIDSecure(neighLead) << " (422)\n"; } } if (neighLead == 0) { #ifdef DEBUG_SURROUNDING_VEHICLES if (DEBUG_COND) { std::cout << "Looking for leader on consecutive lanes." << std::endl; } #endif // There's no leader on the target lane. Look for leaders on consecutive lanes. MSLane* targetLane = target->lane; if (targetLane->myPartialVehicles.size() > 0) { assert(targetLane->myPartialVehicles.size() > 0); std::vector<MSVehicle*>::const_iterator i = targetLane->myPartialVehicles.begin(); MSVehicle* leader = *i; SUMOReal leaderPos = leader->getBackPositionOnLane(targetLane); while (++i != targetLane->myPartialVehicles.end()) { if ((*i)->getBackPositionOnLane(targetLane) < leader->getBackPositionOnLane(targetLane)) { leader = *i; leaderPos = leader->getBackPositionOnLane(targetLane); } } return std::pair<MSVehicle*, SUMOReal>(leader, leaderPos - veh(myCandi)->getPositionOnLane() - veh(myCandi)->getVehicleType().getMinGap()); } SUMOReal seen = myCandi->lane->getLength() - veh(myCandi)->getPositionOnLane(); SUMOReal speed = veh(myCandi)->getSpeed(); SUMOReal dist = veh(myCandi)->getCarFollowModel().brakeGap(speed) + veh(myCandi)->getVehicleType().getMinGap(); if (seen > dist) { return std::pair<MSVehicle* const, SUMOReal>(static_cast<MSVehicle*>(0), -1); } const std::vector<MSLane*>& bestLaneConts = veh(myCandi)->getBestLanesContinuation(targetLane); return target->lane->getLeaderOnConsecutive(dist, seen, speed, *veh(myCandi), bestLaneConts); } else { MSVehicle* candi = veh(myCandi); return std::pair<MSVehicle* const, SUMOReal>(neighLead, neighLead->getBackPositionOnLane(target->lane) - candi->getPositionOnLane() - candi->getVehicleType().getMinGap()); } }