|
SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00007 // An edge the jtr-router may route through 00008 /****************************************************************************/ 00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00010 // Copyright (C) 2001-2011 DLR (http://www.dlr.de/) and contributors 00011 /****************************************************************************/ 00012 // 00013 // This program is free software; you can redistribute it and/or modify 00014 // it under the terms of the GNU General Public License as published by 00015 // the Free Software Foundation; either version 2 of the License, or 00016 // (at your option) any later version. 00017 // 00018 /****************************************************************************/ 00019 00020 00021 // =========================================================================== 00022 // included modules 00023 // =========================================================================== 00024 #ifdef _MSC_VER 00025 #include <windows_config.h> 00026 #else 00027 #include <config.h> 00028 #endif 00029 00030 #include <algorithm> 00031 #include <cassert> 00032 #include <utils/common/MsgHandler.h> 00033 #include <utils/common/RandHelper.h> 00034 #include "ROJTREdge.h" 00035 #include <utils/common/RandomDistributor.h> 00036 00037 #ifdef CHECK_MEMORY_LEAKS 00038 #include <foreign/nvwa/debug_new.h> 00039 #endif // CHECK_MEMORY_LEAKS 00040 00041 00042 // =========================================================================== 00043 // method definitions 00044 // =========================================================================== 00045 ROJTREdge::ROJTREdge(const std::string& id, RONode* from, RONode* to, unsigned int index) throw() 00046 : ROEdge(id, from, to, index, false) {} 00047 00048 00049 ROJTREdge::~ROJTREdge() throw() { 00050 for (FollowerUsageCont::iterator i=myFollowingDefs.begin(); i!=myFollowingDefs.end(); i++) { 00051 delete(*i).second; 00052 } 00053 } 00054 00055 00056 void 00057 ROJTREdge::addFollower(ROEdge* s) throw() { 00058 ROEdge::addFollower(s); 00059 ROJTREdge* js = static_cast<ROJTREdge*>(s); 00060 if (myFollowingDefs.find(js)==myFollowingDefs.end()) { 00061 myFollowingDefs[js] = new ValueTimeLine<SUMOReal>(); 00062 } 00063 } 00064 00065 00066 void 00067 ROJTREdge::addFollowerProbability(ROJTREdge* follower, SUMOTime begTime, 00068 SUMOTime endTime, SUMOReal probability) { 00069 FollowerUsageCont::iterator i = myFollowingDefs.find(follower); 00070 if (i==myFollowingDefs.end()) { 00071 WRITE_ERROR("The edges '" + getID() + "' and '" + follower->getID() + "' are not connected."); 00072 return; 00073 } 00074 (*i).second->add(begTime, endTime, probability); 00075 } 00076 00077 00078 ROJTREdge* 00079 ROJTREdge::chooseNext(const ROVehicle* const veh, SUMOTime time) const { 00080 // if no usable follower exist, return 0 00081 // their probabilities are not yet regarded 00082 if (myFollowingEdges.size()==0 || (veh!=0 && allFollowersProhibit(veh))) { 00083 return 0; 00084 } 00085 // gather information about the probabilities at this time 00086 RandomDistributor<ROJTREdge*> dist; 00087 { 00088 // use the loaded definitions, first 00089 FollowerUsageCont::const_iterator i; 00090 for (i=myFollowingDefs.begin(); i!=myFollowingDefs.end(); i++) { 00091 if ((veh==0 || !(*i).first->prohibits(veh)) && (*i).second->describesTime(time)) { 00092 dist.add((*i).second->getValue(time), (*i).first); 00093 } 00094 } 00095 } 00096 // if no loaded definitions are valid for this time, try to use the defaults 00097 if (dist.getOverallProb()==0) { 00098 for (size_t i=0; i<myParsedTurnings.size(); ++i) { 00099 if (veh==0 || !myFollowingEdges[i]->prohibits(veh)) { 00100 dist.add(myParsedTurnings[i], static_cast<ROJTREdge*>(myFollowingEdges[i])); 00101 } 00102 } 00103 } 00104 // if still no valid follower exists, return null 00105 if (dist.getOverallProb()==0) { 00106 return 0; 00107 } 00108 // return one of the possible followers 00109 return dist.get(); 00110 } 00111 00112 00113 void 00114 ROJTREdge::setTurnDefaults(const std::vector<SUMOReal> &defs) { 00115 // I hope, we'll find a less ridiculous solution for this 00116 std::vector<SUMOReal> tmp(defs.size()*myFollowingEdges.size(), 0); 00117 // store in less common multiple 00118 size_t i; 00119 for (i=0; i<defs.size(); i++) { 00120 for (size_t j=0; j<myFollowingEdges.size(); j++) { 00121 tmp[i*myFollowingEdges.size()+j] = (SUMOReal) 00122 (defs[i] / 100.0 / (myFollowingEdges.size())); 00123 } 00124 } 00125 // parse from less common multiple 00126 for (i=0; i<myFollowingEdges.size(); i++) { 00127 SUMOReal value = 0; 00128 for (size_t j=0; j<defs.size(); j++) { 00129 value += tmp[i*defs.size()+j]; 00130 } 00131 myParsedTurnings.push_back((SUMOReal) value); 00132 } 00133 } 00134 00135 00136 00137 /****************************************************************************/ 00138