#include <mhics.h>
Nevrax France
Definition at line 200 of file mhics.h.
Public Member Functions | |
CMHiCSagent (CMHiCSbase *pMHiCSbase) | |
void | getDebugString (std::string &t) const |
Chaine de debug. | |
double | getExecutionIntensity (TAction action, TTargetId target) const |
Retourne l'intensité d'exécution d'une action. | |
const CMHiCSbase * | getMHiCSbase () const |
double | getMotivationPP (TMotivation motivationName) const |
Retourne la Puissance Propre d'une Motivation. | |
double | getMotivationValue (TMotivation motivationName) const |
Retourne la valeur d'une motiation. | |
uint32 | getTemporaryClassifierPriorityTime (TMotivation motivationName, TClassifierNumber classifierNumber) const |
void | run () |
* if (selectedClassifierNumber < 0) | |
const std::map< TTargetId, std::map< TAction, CMotivationEnergy > > * | selectBehavior () |
Return the Behavior that must be active. | |
void | setLearning (bool active) |
void | setMotivationPP (TMotivation motivationName, double PP) |
Donne la Puissance Propre d'une Motivation. | |
void | setMotivationValue (TMotivation motivationName, double value) |
Fixe la valeur d'une motivation. | |
void | setSensors (CCSPerception *psensorMap) |
Set the sensor source. | |
bool | wasClassifierPreviouslyActive (TMotivation motivationName, TClassifierNumber classifierNumber) const |
virtual | ~CMHiCSagent () |
Private Member Functions | |
void | learningComputation () |
If _Learning == true, it will compute new priority for each classifier. | |
void | motivationCompute () |
std::string | targetId2String (TTargetId id) const |
function used in debug to change a TTargetId in a string | |
Private Attributes | |
std::map< TMotivation, CMotivationEnergy > | _ClassifiersAndMotivationIntensity |
bool | _Learning |
std::map< TMotivation, CMotivationEnergy > | _OldClassifiersAndMotivationIntensity |
std::map< TTargetId, std::map< TAction, CMotivationEnergy > > * | _pActionsExecutionIntensityByTarget |
std::map< TMotivation, std::map< TClassifierNumber, CClassifierActivityInfo > > * | _pInfoClassifierActivity |
CMHiCSbase * | _pMHiCSbase |
std::map< TTargetId, std::map< TAction, CMotivationEnergy > > * | _pOldActionsExecutionIntensityByTarget |
std::map< TMotivation, std::map< TClassifierNumber, CClassifierActivityInfo > > * | _pOldInfoClassifierActivity |
CCSPerception * | _pSensorsValues |
std::map< TMotivation, std::map< TClassifierNumber, CTemporaryPriority > > | _TemporaryPriority |
|
Definition at line 668 of file mhics.cpp. References _Learning, _pActionsExecutionIntensityByTarget, _pInfoClassifierActivity, _pMHiCSbase, _pOldActionsExecutionIntensityByTarget, _pOldInfoClassifierActivity, and nlassert.
00669 { 00670 nlassert (pMHiCSbase != NULL); 00671 _pMHiCSbase = pMHiCSbase; 00672 _pActionsExecutionIntensityByTarget = new std::map<TTargetId, std::map<TAction, CMotivationEnergy> >(); 00673 _pOldActionsExecutionIntensityByTarget = new std::map<TTargetId, std::map<TAction, CMotivationEnergy> >(); 00674 _Learning = true; 00675 _pInfoClassifierActivity = new std::map<TMotivation, std::map<TClassifierNumber, CClassifierActivityInfo> >(); 00676 _pOldInfoClassifierActivity = new std::map<TMotivation, std::map<TClassifierNumber, CClassifierActivityInfo> >(); 00677 // _ActionsExecutionIntensity[Action_DoNothing] = CMotivationEnergy(); 00678 // _IdByActions[Action_DoNothing] = NullTargetId; 00679 // _ItCurrentAction = _IdByActions.find(Action_DoNothing); 00680 } |
|
Definition at line 682 of file mhics.cpp. References _pActionsExecutionIntensityByTarget, _pInfoClassifierActivity, _pOldActionsExecutionIntensityByTarget, and _pOldInfoClassifierActivity.
00683 { 00684 delete _pOldActionsExecutionIntensityByTarget; 00685 delete _pActionsExecutionIntensityByTarget; 00686 delete _pInfoClassifierActivity; 00687 delete _pOldInfoClassifierActivity; 00688 } |
|
Chaine de debug.
Definition at line 707 of file mhics.cpp. References _ClassifiersAndMotivationIntensity, _pSensorsValues, NLAINIMAT::CCSPerception::NoTargetSensors, t, targetId2String(), NLAINIMAT::CCSPerception::TargetSensors, and NLMISC::toString().
00708 { 00709 std::string ret = "\n\n---------------------------\n"; 00710 ret += "\nPerceptions :"; 00711 ret += "\n Without target"; 00712 NLAINIMAT::TSensorMap::const_iterator itNoTargetSensors; 00713 for (itNoTargetSensors = _pSensorsValues->NoTargetSensors.begin(); 00714 itNoTargetSensors != _pSensorsValues->NoTargetSensors.end(); 00715 itNoTargetSensors++) 00716 { 00717 ret += "\n " + conversionSensor.toString((*itNoTargetSensors).first) + "(" + (*itNoTargetSensors).second + ")"; 00718 } 00719 std::map<TTargetId, TSensorMap>::const_iterator itTargetSensors; 00720 for (itTargetSensors = _pSensorsValues->TargetSensors.begin(); 00721 itTargetSensors != _pSensorsValues->TargetSensors.end(); 00722 itTargetSensors++) 00723 { 00724 ret += "\n On target n#" + targetId2String((*itTargetSensors).first); 00725 for (itNoTargetSensors = (*itTargetSensors).second.begin(); 00726 itNoTargetSensors != (*itTargetSensors).second.end(); 00727 itNoTargetSensors++) 00728 { 00729 ret += "\n " + conversionSensor.toString((*itNoTargetSensors).first) + "(" + (*itNoTargetSensors).second + ")"; 00730 } 00731 } 00732 ret += "\n\nMotivations :"; 00733 std::map<TMotivation, CMotivationEnergy>::const_iterator itClassifiersAndMotivationIntensity; 00734 for (itClassifiersAndMotivationIntensity = _ClassifiersAndMotivationIntensity.begin(); 00735 itClassifiersAndMotivationIntensity != _ClassifiersAndMotivationIntensity.end(); 00736 itClassifiersAndMotivationIntensity++) 00737 { 00738 ret += "\n <" + conversionMotivation.toString((*itClassifiersAndMotivationIntensity).first) + "> "; 00739 ret += "[MI=" + NLMISC::toString((*itClassifiersAndMotivationIntensity).second.getSumValue()) + "] :"; 00740 (*itClassifiersAndMotivationIntensity).second.getDebugString(ret); 00741 // ret += "\n -> Classifier number " + NLMISC::toString((*itClassifiersAndMotivationIntensity).second.ClassifierNumber); 00742 ret += "\n"; 00743 } 00744 // ret += "\nVirtual Actions :"; 00745 // std::map<TAction, CMotivationEnergy>::const_iterator itClassifiersAndVirtualActionIntensity; 00746 // for (itClassifiersAndVirtualActionIntensity = _ClassifiersAndVirtualActionIntensity.begin(); 00747 // itClassifiersAndVirtualActionIntensity != _ClassifiersAndVirtualActionIntensity.end(); 00748 // itClassifiersAndVirtualActionIntensity++) 00749 // { 00750 // ret += "\n <" + conversionAction.toString((*itClassifiersAndVirtualActionIntensity).first) + "> "; 00751 // ret += "[MI=" + NLMISC::toString((*itClassifiersAndVirtualActionIntensity).second.getSumValue()) + "] :"; 00752 // (*itClassifiersAndVirtualActionIntensity).second.getDebugString(ret); 00757 // ret += "\n -> Classifier number " + NLMISC::toString((*itClassifiersAndVirtualActionIntensity).second.ClassifierNumber); 00758 // ret += "\n"; 00759 // } 00760 ret += "\nACTIONS :"; 00761 std::map<TAction, CMotivationEnergy>::const_iterator itActionsExecutionIntensity; 00762 // for (itActionsExecutionIntensity = _ActionsExecutionIntensity.begin(); itActionsExecutionIntensity != _ActionsExecutionIntensity.end(); itActionsExecutionIntensity++) 00763 // { 00764 // ret += "\n <" + conversionAction.toString((* itActionsExecutionIntensity).first) + "> [EI=" + NLMISC::toString((*itActionsExecutionIntensity).second.getSumValue()) + "] : "; 00765 // (*itActionsExecutionIntensity).second.getDebugString(ret); 00766 // std::map<TAction, TTargetId>::const_iterator itIdByActions = _IdByActions.find((*itActionsExecutionIntensity).first); 00767 // nlassert (itIdByActions != _IdByActions.end()); 00769 // ret += " on target n#" + targetId2String((*itIdByActions).second); 00770 // } 00771 // if (_ItCurrentAction != _IdByActions.end()) 00772 // { 00774 // ret += "\nACTION ACTIVE : " + NLAINIMAT::conversionAction.toString((*_ItCurrentAction).first) + " on " + targetId2String((*_ItCurrentAction).second); 00775 // } 00776 t+=ret; 00777 } |
|
Retourne l'intensité d'exécution d'une action.
Definition at line 855 of file mhics.cpp. References _pActionsExecutionIntensityByTarget, and NLAINIMAT::TTargetId.
00856 { 00857 std::map<TTargetId, std::map<TAction, CMotivationEnergy> >::const_iterator itActionsExecutionIntensityByTarget; 00858 itActionsExecutionIntensityByTarget = _pActionsExecutionIntensityByTarget->find(target); 00859 if (itActionsExecutionIntensityByTarget == _pActionsExecutionIntensityByTarget->end()) 00860 { 00861 return -1; 00862 } 00863 std::map<TAction, CMotivationEnergy>::const_iterator itActionsExecutionIntensity = (*itActionsExecutionIntensityByTarget).second.find(action); 00864 if (itActionsExecutionIntensity != (*itActionsExecutionIntensityByTarget).second.end()) 00865 { 00866 return (*itActionsExecutionIntensity).second.getSumValue(); 00867 } 00868 else 00869 { 00870 return -1; 00871 } 00872 } |
|
Definition at line 240 of file mhics.h. References _pMHiCSbase. Referenced by NLAINIMAT::CMotivationEnergy::computeMotivationValue().
00240 {return _pMHiCSbase;} |
|
Retourne la Puissance Propre d'une Motivation.
Definition at line 788 of file mhics.cpp. References _ClassifiersAndMotivationIntensity. Referenced by NLAINIMAT::CMotivationEnergy::computeMotivationValue().
00789 { 00790 std::map<TMotivation, CMotivationEnergy>::const_iterator itClassifiersAndMotivationIntensity = _ClassifiersAndMotivationIntensity.find(motivationName); 00791 if (itClassifiersAndMotivationIntensity != _ClassifiersAndMotivationIntensity.end()) 00792 { 00793 return (*itClassifiersAndMotivationIntensity).second.getMotivationPP(motivationName); 00794 } 00795 else 00796 { 00797 return -1; 00798 } 00799 } |
|
Retourne la valeur d'une motiation.
Definition at line 827 of file mhics.cpp. References _ClassifiersAndMotivationIntensity. Referenced by NLAINIMAT::CMotivationEnergy::computeMotivationValue().
00828 { 00829 std::map<TMotivation, CMotivationEnergy>::const_iterator itClassifiersAndMotivationIntensity = _ClassifiersAndMotivationIntensity.find(motivationName); 00830 if (itClassifiersAndMotivationIntensity != _ClassifiersAndMotivationIntensity.end()) 00831 { 00832 return (*itClassifiersAndMotivationIntensity).second.getMotivationValue(motivationName); 00833 } 00834 else 00835 { 00836 return -1; 00837 } 00838 } |
|
Definition at line 1608 of file mhics.cpp. References _TemporaryPriority, NLAINIMAT::TClassifierNumber, and uint32. Referenced by NLAINIMAT::CMotivationEnergy::computeMotivationValue().
01609 { 01610 std::map<TMotivation, std::map<TClassifierNumber, CTemporaryPriority> >::const_iterator itTemporaryPriority = _TemporaryPriority.find(motivationName); 01611 if (itTemporaryPriority == _TemporaryPriority.end()) 01612 { 01613 return 0; 01614 } 01615 std::map<TClassifierNumber, CTemporaryPriority>::const_iterator itIteratorBis = (*itTemporaryPriority).second.find(classifierNumber); 01616 if (itIteratorBis == (*itTemporaryPriority).second.end()) 01617 { 01618 return 0; 01619 } 01620 uint32 bibureturn = (*itIteratorBis).second.TemporaryClassifierPriorityTime; 01621 return bibureturn; 01622 } |
|
If _Learning == true, it will compute new priority for each classifier.
Definition at line 1219 of file mhics.cpp. References _ClassifiersAndMotivationIntensity, _OldClassifiersAndMotivationIntensity, _pActionsExecutionIntensityByTarget, _pMHiCSbase, _TemporaryPriority, NLMISC::CTime::getSecondsSince1970(), NLAINIMAT::CMHiCSbase::learningUpdatePriorityValueClassifierTime(), NLAINIMAT::CMHiCSbase::learningUpdatePriorityValueTimeToSuccess(), nlassert, NLAINIMAT::TClassifierNumber, NLAINIMAT::TMotivation, and uint32. Referenced by selectBehavior().
01220 { 01221 /* 01222 * Le but de l'apprentissage par ajustement des valeurs de priorité : 01223 * La valeur de priorité est utilisé pour choisir un classeur lorsque plusieurs classeurs sont activable simultanement 01224 * et partagent une même ressource d'action. 01225 * On veut la faire évoluer afin que dans une situation donnée, c'est le classeur le plus apte à satisfaire la motivation 01226 * qui soit sélectionné. 01227 * Celon le principe de bucket brigade, un classeur qui mène à satisfaire une motivation est un bon classeur. 01228 * Ensuite un classeur qui a défaut de satisfaire la motivation mène à un classeur pouvant la satisfaire est bon mais un peut moins, etc. 01229 */ 01230 01231 01232 // std::map<TMotivation, std::set<TClassifierNumber> > oldClassifierByMotivation; // Liste des classeurs actifs au pas précédent. 01233 // std::map<TMotivation, std::set<TClassifierNumber> > classifierByMotivation; // Liste des classeurs activés 01234 01235 // On note les descentes de motivations 01236 uint32 newTime = NLMISC::CTime::getSecondsSince1970(); 01237 std::set<TMotivation> decreasingMotivations; 01238 std::map<TMotivation, CMotivationEnergy>::iterator itOldClassifiersAndMotivationIntensity, itClassifiersAndMotivationIntensity; 01239 for(itOldClassifiersAndMotivationIntensity = _OldClassifiersAndMotivationIntensity.begin(); 01240 itOldClassifiersAndMotivationIntensity != _OldClassifiersAndMotivationIntensity.end(); 01241 itOldClassifiersAndMotivationIntensity++) 01242 { 01243 TMotivation motivationName = (*itOldClassifiersAndMotivationIntensity).first; 01244 double oldMV = (*itOldClassifiersAndMotivationIntensity).second.getMotivationValue(motivationName); 01245 itClassifiersAndMotivationIntensity = _ClassifiersAndMotivationIntensity.find(motivationName); 01246 nlassert(itClassifiersAndMotivationIntensity != _ClassifiersAndMotivationIntensity.end()); 01247 double newMV = (*itClassifiersAndMotivationIntensity).second.getMotivationValue(motivationName); 01248 if (newMV < oldMV) 01249 { 01250 decreasingMotivations.insert(motivationName); 01251 } 01252 } 01253 01254 // // On établit la liste des classeurs utilisés précédemment 01255 // std::map<TMotivation, std::set<TClassifierNumber> >::iterator itOldClassifierByMotivation; 01256 // std::map<TTargetId, std::map<TAction, CMotivationEnergy> >::iterator itOldActionsExecutionIntensityByTarget; 01257 // std::map<TAction, CMotivationEnergy>::iterator itOldActionsExecutionIntensity; 01258 // for(itOldActionsExecutionIntensityByTarget = _pOldActionsExecutionIntensityByTarget->begin(); 01259 // itOldActionsExecutionIntensityByTarget != _pOldActionsExecutionIntensityByTarget->end(); 01260 // itOldActionsExecutionIntensityByTarget++) 01261 // { 01262 // for(itOldActionsExecutionIntensity = (*itOldActionsExecutionIntensityByTarget).second.begin(); 01263 // itOldActionsExecutionIntensity != (*itOldActionsExecutionIntensityByTarget).second.end(); 01264 // itOldActionsExecutionIntensity++) 01265 // { 01266 // const std::map<TMotivation, std::set<TClassifierNumber> >* provounet = (*itOldActionsExecutionIntensity).second.getProviders(); 01267 // std::map<TMotivation, std::set<TClassifierNumber> >::const_iterator itProvounet; 01268 // for(itProvounet = provounet->begin(); 01269 // itProvounet != provounet->end(); 01270 // itProvounet++) 01271 // { 01272 // TMotivation motivationName = (*itProvounet).first; 01273 // std::set<TClassifierNumber>::const_iterator itClassifierNumber; 01274 // for (itClassifierNumber = (*itProvounet).second.begin(); itClassifierNumber != (*itProvounet).second.end(); itClassifierNumber++) 01275 // { 01276 // TClassifierNumber classifierNumber = (*itClassifierNumber); 01277 // // On établit une liste des classeurs ayant été actifs. 01278 // oldClassifierByMotivation[motivationName].insert(classifierNumber); 01279 // } 01280 // } 01281 // } 01282 // } 01283 01284 // On remet à zero les compteurs de temps pour les actions qui on satisfait une motivation 01285 std::set<TMotivation>::iterator itDecreasingMotivations; 01286 for (itDecreasingMotivations = decreasingMotivations.begin(); itDecreasingMotivations != decreasingMotivations.end(); itDecreasingMotivations++) 01287 { 01288 TMotivation motivationName = (*itDecreasingMotivations); 01289 std::map<TMotivation, std::map<TClassifierNumber, CTemporaryPriority> >::iterator itTemporaryPriority = _TemporaryPriority.find(motivationName); 01290 if (itTemporaryPriority != _TemporaryPriority.end()) 01291 { 01292 std::map<TClassifierNumber, CTemporaryPriority>::iterator itPrioByCl; 01293 for (itPrioByCl = (*itTemporaryPriority).second.begin(); itPrioByCl != (*itTemporaryPriority).second.end(); itPrioByCl++ ) 01294 { 01295 // Si le temps a été fixé 01296 // bool aUnFixedStartTime = (*itPrioByCl).second.FixedStartTime; 01297 // if (aUnFixedStartTime) 01298 // { 01299 uint32 startTime = (*itPrioByCl).second.StartTime; 01300 if (startTime > newTime) 01301 { 01302 newTime = startTime; 01303 } 01304 uint32 timeToSatisfaction = newTime - startTime; 01305 TClassifierNumber classifierNumber = (*itPrioByCl).first; 01306 // On met à jour la fitness des classeurs ayant été activés. 01307 _pMHiCSbase->learningUpdatePriorityValueTimeToSuccess(motivationName, classifierNumber, timeToSatisfaction); 01308 // } 01309 } 01310 } 01311 _TemporaryPriority.erase(motivationName); 01312 } 01313 01314 // On établit la liste des classeurs nouveaux utilisés à ce pas ci 01315 std::map<TTargetId, std::map<TAction, CMotivationEnergy> >::iterator itActionsExecutionIntensityByTarget; 01316 std::map<TAction, CMotivationEnergy>::iterator itActionsExecutionIntensity; 01317 for(itActionsExecutionIntensityByTarget = _pActionsExecutionIntensityByTarget->begin(); 01318 itActionsExecutionIntensityByTarget != _pActionsExecutionIntensityByTarget->end(); 01319 itActionsExecutionIntensityByTarget++) 01320 { 01321 for(itActionsExecutionIntensity = (*itActionsExecutionIntensityByTarget).second.begin(); 01322 itActionsExecutionIntensity != (*itActionsExecutionIntensityByTarget).second.end(); 01323 itActionsExecutionIntensity++) 01324 { 01325 const std::map<TMotivation, std::set<TClassifierNumber> >* provounet = (*itActionsExecutionIntensity).second.getProviders(); 01326 std::map<TMotivation, std::set<TClassifierNumber> >::const_iterator itProvounet; 01327 for(itProvounet = provounet->begin(); 01328 itProvounet != provounet->end(); 01329 itProvounet++) 01330 { 01331 TMotivation motivationName = (*itProvounet).first; 01332 std::set<TClassifierNumber>::const_iterator itClassifierNumber; 01333 for (itClassifierNumber = (*itProvounet).second.begin(); itClassifierNumber != (*itProvounet).second.end(); itClassifierNumber++) 01334 { 01335 TClassifierNumber classifierNumber = (*itClassifierNumber); 01336 // itOldClassifierByMotivation = oldClassifierByMotivation.find(motivationName); 01337 // if (itOldClassifierByMotivation != oldClassifierByMotivation.end() ) 01338 // { 01339 // ajout du classeur dans la liste des classeurs activés 01340 (*_pInfoClassifierActivity)[motivationName][classifierNumber].IsActive = true; 01341 // classifierByMotivation[motivationName].insert(classifierNumber); 01342 // } 01343 } 01344 } 01345 } 01346 } 01347 01348 // on établit la liste des classeurs qui étaient activables et qui ne le sont plus 01349 std::map<TMotivation, std::map<TClassifierNumber, CClassifierActivityInfo> >::iterator itOldInfoClassifierActivity; 01350 std::map<TMotivation, std::map<TClassifierNumber, CClassifierActivityInfo> >::iterator itInfoClassifierActivity; 01351 for(itOldInfoClassifierActivity = (*_pOldInfoClassifierActivity).begin(); 01352 itOldInfoClassifierActivity != (*_pOldInfoClassifierActivity).end(); 01353 itOldInfoClassifierActivity++ ) 01354 { 01355 TMotivation motivationName = (*itOldInfoClassifierActivity).first; 01356 std::map<TClassifierNumber, CClassifierActivityInfo>::iterator itClassifiers, itClassifiersBis; 01357 for (itClassifiers = (*itOldInfoClassifierActivity).second.begin(); itClassifiers != (*itOldInfoClassifierActivity).second.end(); itClassifiers++) 01358 { 01359 // std::set<TClassifierNumber>::iterator itClassifiersBisBis; 01360 // bool isStillActivable = false; 01361 TClassifierNumber classifierNumber = (*itClassifiers).first; 01362 bool wasActive = (*itClassifiers).second.IsActive; 01363 bool isActive = (*_pInfoClassifierActivity)[motivationName][classifierNumber].IsActive; 01364 if (wasActive && !isActive) 01365 { 01366 // Le classeur vient de finir son activité, je calcule sa nouvelle priorité. 01367 uint32 diffTime = _TemporaryPriority[motivationName][classifierNumber].TemporaryClassifierPriorityTime; 01368 if (diffTime >0) 01369 { 01370 _pMHiCSbase->learningUpdatePriorityValueClassifierTime(motivationName, classifierNumber, diffTime); 01371 // _TemporaryPriority[motivationName][classifierNumber].FixedStartTime = false; 01372 } 01373 } 01374 01375 // bool wasActivable = (*itClassifiers).second.IsActivable; 01376 // if (wasActivable) 01377 // { 01378 // itInfoClassifierActivity = (*_pInfoClassifierActivity).find(motivationName); 01379 // if (itInfoClassifierActivity != (*_pInfoClassifierActivity).end()) 01380 // { 01381 // itClassifiersBis = (*itInfoClassifierActivity).second.find(classifierNumber); 01382 // if ( itClassifiersBis != (*itInfoClassifierActivity).second.end() ) 01383 // { 01384 // isStillActivable = true; 01385 // } 01386 // } 01387 // if (isStillActivable) 01388 // { 01389 // // s'il est activable mais plus activé alors on met à jour son compteur de temps d'execution 01390 // bool estActif = (*_pInfoClassifierActivity)[motivationName][classifierNumber].IsActive; 01400 // if (!estActif) 01401 // { 01402 // std::map<TMotivation, std::set<TClassifierNumber> >::iterator itOldClassifierByMotivation = oldClassifierByMotivation.find(motivationName); 01403 // if (itOldClassifierByMotivation != oldClassifierByMotivation.end()) 01404 // { 01405 // itClassifiersBisBis = (*itOldClassifierByMotivation).second.find(classifierNumber); 01406 // if ( itClassifiersBisBis != (*itOldClassifierByMotivation).second.end() ) 01407 // { 01408 // // Le classeur vient de finir son activité, je calcule sa nouvelle priorité. 01409 // uint32 diffTime = _TemporaryPriority[motivationName][classifierNumber].TemporaryClassifierPriorityTime; 01410 // if (diffTime >0) 01411 // { 01412 // _pMHiCSbase->learningUpdatePriorityValueClassifierTime(motivationName, classifierNumber, diffTime); 01413 // _TemporaryPriority[motivationName][classifierNumber].FixedStartTime = false; 01414 // } 01415 // } 01416 // } 01417 // } 01418 // } 01419 // else 01420 // { 01421 // // Dans tous les cas on met à jour son temps d'activation s'il a été activé par le passé. 01422 // std::map<TMotivation, std::map<TClassifierNumber, CTemporaryPriority> >::iterator itTemporaryPriority = _TemporaryPriority.find(motivationName); 01423 // if (itTemporaryPriority != _TemporaryPriority.end()) 01424 // { 01425 // std::map<TClassifierNumber, CTemporaryPriority>::iterator itClassifiersTerce = (*itTemporaryPriority).second.find(classifierNumber); 01426 // if (itClassifiersTerce != (*itTemporaryPriority).second.end() ) 01427 // { 01428 // // Le classeur vient de finir son activité, je calcule sa nouvelle priorité. 01429 // uint32 diffTime = _TemporaryPriority[motivationName][classifierNumber].TemporaryClassifierPriorityTime; 01430 // if (diffTime >0) 01431 // { 01432 // _pMHiCSbase->learningUpdatePriorityValueClassifierTime(motivationName, classifierNumber, diffTime); 01433 // _TemporaryPriority[motivationName][classifierNumber].FixedStartTime = false; 01434 // } 01435 // } 01436 // } 01437 // 01438 // // S'il n'était pas activé (avant de n'être plus activable), on le retire de la liste des éligibles au T2S 01451 // _TemporaryPriority[motivationName][classifierNumber].FixedStartTime = false; 01453 // } 01454 // } 01455 } 01456 } 01457 01458 std::map<TClassifierNumber, CClassifierActivityInfo>::iterator itUnChtitClassifierNumberInfo; 01459 // On regarde quelles sont les nouveaux classeurs activés 01460 for(itInfoClassifierActivity = (*_pInfoClassifierActivity).begin(); 01461 itInfoClassifierActivity != (*_pInfoClassifierActivity).end(); 01462 itInfoClassifierActivity++) 01463 { 01464 TMotivation motivationName = (*itInfoClassifierActivity).first; 01465 01466 for(itUnChtitClassifierNumberInfo = (*itInfoClassifierActivity).second.begin(); 01467 itUnChtitClassifierNumberInfo != (*itInfoClassifierActivity).second.end(); 01468 itUnChtitClassifierNumberInfo++) 01469 { 01470 TClassifierNumber leNumberDuClasseur = (*itUnChtitClassifierNumberInfo).first; 01471 bool wasActive = (*_pOldInfoClassifierActivity)[motivationName][leNumberDuClasseur].IsActive; 01472 bool isActive = (*itUnChtitClassifierNumberInfo).second.IsActive; 01473 if (isActive) 01474 { 01475 if (!wasActive) 01476 { 01477 _TemporaryPriority[motivationName][leNumberDuClasseur].StartTime = newTime; 01478 _TemporaryPriority[motivationName][leNumberDuClasseur].LastTime = newTime; 01479 _TemporaryPriority[motivationName][leNumberDuClasseur].FixedStartTime = true; 01480 _TemporaryPriority[motivationName][leNumberDuClasseur].TemporaryClassifierPriorityTime = 0; 01481 } 01482 // Je fais progresser le timer 01483 uint32 lastTime = _TemporaryPriority[motivationName][leNumberDuClasseur].LastTime; 01484 if (lastTime > newTime) 01485 { 01486 newTime = lastTime; 01487 } 01488 uint32 diffTime = newTime - lastTime; 01489 _TemporaryPriority[motivationName][leNumberDuClasseur].LastTime = newTime; 01490 _TemporaryPriority[motivationName][leNumberDuClasseur].TemporaryClassifierPriorityTime += diffTime; 01491 } 01492 01493 // if (isActive) 01494 // { 01495 // // Si l'action n'avait pas de startTime fixé, on lui en donne un. 01496 // bool avaitUnFixedStartTime = false; 01497 // std::map<TMotivation, std::map<TClassifierNumber, CTemporaryPriority> >::iterator itTemporaryPriority = _TemporaryPriority.find(motivationName); 01498 // if (itTemporaryPriority != _TemporaryPriority.end() ) 01499 // { 01500 // std::map<TClassifierNumber, CTemporaryPriority>::iterator itClassifierAndPrio = (*itTemporaryPriority).second.find(leNumberDuClasseur); 01501 // if (itClassifierAndPrio != (*itTemporaryPriority).second.end() ) 01502 // { 01503 // avaitUnFixedStartTime = (*itClassifierAndPrio).second.FixedStartTime; 01504 // } 01505 // } 01506 // if (!avaitUnFixedStartTime) 01507 // { 01508 // _TemporaryPriority[motivationName][leNumberDuClasseur].StartTime = newTime; 01509 // _TemporaryPriority[motivationName][leNumberDuClasseur].FixedStartTime = true; 01510 // _TemporaryPriority[motivationName][leNumberDuClasseur].TemporaryClassifierPriorityTime = 0; 01511 // } 01512 // else 01513 // { 01514 // // Si elle avait un startime, on regarde si elle était active au tour précédent. 01515 // bool etaitActifJusteAvant = false; 01516 // std::map<TMotivation, std::set<TClassifierNumber> >::iterator itOldClassifierByMotivation = oldClassifierByMotivation.find(motivationName); 01517 // if (itOldClassifierByMotivation != oldClassifierByMotivation.end()) 01518 // { 01519 // std::set<TClassifierNumber>::iterator itClassifier = (*itOldClassifierByMotivation).second.find(leNumberDuClasseur); 01520 // if (itClassifier != (*itOldClassifierByMotivation).second.end() ) 01521 // { 01522 // etaitActifJusteAvant = true; 01523 // } 01524 // } 01525 // if (!etaitActifJusteAvant) 01526 // { 01527 // _TemporaryPriority[motivationName][leNumberDuClasseur].LastTime = newTime; 01529 // } 01530 // } 01531 // 01532 // // Je fais progresser le timer 01533 // uint32 lastTime = _TemporaryPriority[motivationName][leNumberDuClasseur].LastTime; 01534 // if (lastTime > newTime) 01535 // { 01536 // newTime = lastTime; 01537 // } 01538 // uint32 diffTime = newTime - lastTime; 01539 // _TemporaryPriority[motivationName][leNumberDuClasseur].LastTime = newTime; 01540 // _TemporaryPriority[motivationName][leNumberDuClasseur].TemporaryClassifierPriorityTime += diffTime; 01541 // } 01542 01543 } 01544 } 01545 } |
|
Definition at line 982 of file mhics.cpp. References _ClassifiersAndMotivationIntensity, _pMHiCSbase, _pSensorsValues, NLAINIMAT::Action_DoNothing, NLAINIMAT::CMHiCSbase::getActionPart(), NLAINIMAT::CMotivationEnergy::getSumValue(), NLAINIMAT::CMHiCSbase::selectBehavior(), NLAINIMAT::TAction, NLAINIMAT::TClassifierNumber, NLAINIMAT::TMotivation, and NLAINIMAT::TTargetId. Referenced by run().
00983 { 00984 TAction behav; 00985 00986 std::map<TMotivation, CMotivationEnergy>::iterator itClassifiersAndMotivationIntensity; 00987 00988 // On parcour toutes les motivations. 00989 for (itClassifiersAndMotivationIntensity = _ClassifiersAndMotivationIntensity.begin(); 00990 itClassifiersAndMotivationIntensity != _ClassifiersAndMotivationIntensity.end(); 00991 itClassifiersAndMotivationIntensity++) 00992 { 00993 CMotivationEnergy* pCSselection = &((*itClassifiersAndMotivationIntensity).second); 00994 TMotivation selectionName = (*itClassifiersAndMotivationIntensity).first; 00995 double energy = pCSselection->getSumValue(); 00996 // Si une motivation est active (une energie >0 ) on actionne ses règles. 00997 if (energy > 0) 00998 { 00999 // On fait calculer le CS 01000 std::multimap<CClassifierPriority, std::pair<TClassifierNumber, TTargetId> > mapActivableCS; 01001 std::multimap<CClassifierPriority, std::pair<TClassifierNumber, TTargetId> >::iterator itMapActivableCS; 01002 01003 // On fait la liste des classeurs activables. 01004 _pMHiCSbase->selectBehavior(selectionName,_pSensorsValues, mapActivableCS); 01005 01006 // Pour chaque classeur activable, on transmet la valeur de motivation à l'action selectionnée. 01007 for (itMapActivableCS = mapActivableCS.begin(); itMapActivableCS != mapActivableCS.end(); itMapActivableCS++) 01008 { 01009 TClassifierNumber selectedClassifierNumber = (*itMapActivableCS).second.first; 01010 TTargetId currentTargetId = (*itMapActivableCS).second.second; 01011 behav = _pMHiCSbase->getActionPart(selectionName, selectedClassifierNumber); 01012 01013 (*_pInfoClassifierActivity)[selectionName][selectedClassifierNumber].IsActivable = true; 01014 01015 // We add the current motivation energy to the selected action. 01016 if (behav != Action_DoNothing) 01017 { 01018 // std::map<TTargetId, std::map<TAction, CMotivationEnergy> >::const_iterator itOldActionsExecutionIntensityByTarget = (*_pOldActionsExecutionIntensityByTarget).find(currentTargetId); 01019 // if (itOldActionsExecutionIntensityByTarget != (*_pOldActionsExecutionIntensityByTarget).end() ) 01020 // { 01021 // std::map<TAction, CMotivationEnergy>::const_iterator itIntensityByTarget = (*itOldActionsExecutionIntensityByTarget).second.find(behav); 01022 // if (itIntensityByTarget != (*itOldActionsExecutionIntensityByTarget).second.end()) 01023 // { 01024 // (*_pActionsExecutionIntensityByTarget)[currentTargetId][behav].setWasPreviouslyActived(true); 01025 // } 01026 // } 01027 (*_pActionsExecutionIntensityByTarget)[currentTargetId][behav].setMHiCSagent(this); 01028 (*_pActionsExecutionIntensityByTarget)[currentTargetId][behav].addProvider(selectionName, selectedClassifierNumber); 01029 } 01030 } 01031 } 01032 } 01033 } |
|
* if (selectedClassifierNumber < 0)
Definition at line 1159 of file mhics.cpp. References _pActionsExecutionIntensityByTarget, _pInfoClassifierActivity, _pOldActionsExecutionIntensityByTarget, _pOldInfoClassifierActivity, and motivationCompute().
01160 { 01161 std::map<TTargetId, std::map<TAction, CMotivationEnergy> > *bibu = _pOldActionsExecutionIntensityByTarget; 01162 _pOldActionsExecutionIntensityByTarget = _pActionsExecutionIntensityByTarget; 01163 _pActionsExecutionIntensityByTarget = bibu; 01164 _pActionsExecutionIntensityByTarget->clear(); 01165 01166 std::map<TMotivation, std::map<TClassifierNumber, CClassifierActivityInfo> > *biba = _pOldInfoClassifierActivity; 01167 _pOldInfoClassifierActivity = _pInfoClassifierActivity; 01168 _pInfoClassifierActivity = biba; 01169 _pInfoClassifierActivity->clear(); 01170 01171 motivationCompute(); 01172 // virtualActionCompute(); 01173 } |
|
Return the Behavior that must be active.
Definition at line 1548 of file mhics.cpp. References _ClassifiersAndMotivationIntensity, _Learning, _OldClassifiersAndMotivationIntensity, _pActionsExecutionIntensityByTarget, _pMHiCSbase, NLAINIMAT::CActionResources::filterMyActions(), learningComputation(), nlassert, NLAINIMAT::CMHiCSbase::pActionResources, NLAINIMAT::TAction, and NLAINIMAT::TTargetId.
01549 { 01550 //We sort actions by priority 01551 double priority; 01552 TAction action; 01553 TTargetId target; 01554 std::multimap<double, std::pair<TTargetId,TAction> > actionsToRemove; 01555 01556 std::map<TTargetId, std::map<TAction, CMotivationEnergy> >::iterator itActionsExecutionIntensityByTarget; 01557 std::map<TAction, CMotivationEnergy>::const_iterator itMotiveByAction; 01558 for (itActionsExecutionIntensityByTarget = _pActionsExecutionIntensityByTarget->begin(); 01559 itActionsExecutionIntensityByTarget != _pActionsExecutionIntensityByTarget->end(); 01560 itActionsExecutionIntensityByTarget++) 01561 { 01562 for (itMotiveByAction = (*itActionsExecutionIntensityByTarget).second.begin(); 01563 itMotiveByAction != (*itActionsExecutionIntensityByTarget).second.end(); 01564 itMotiveByAction++) 01565 { 01566 priority = (*itMotiveByAction).second.getSumValue(); 01567 action = (*itMotiveByAction).first; 01568 target = (*itActionsExecutionIntensityByTarget).first; 01569 01570 // on rajoute du bruit sur les priorité afin d'avoir une diversité si des priorités sont proches 01571 // double randomeNumber = ((rand()%5)*priority)/100; 01572 // priority += randomeNumber; 01573 01574 actionsToRemove.insert(std::make_pair(priority, std::make_pair(target,action))); 01575 } 01576 } 01577 01578 _pMHiCSbase->pActionResources->filterMyActions(actionsToRemove); 01579 01580 std::multimap<double, std::pair<TTargetId,TAction> >::iterator itActionsToRemove; 01581 for (itActionsToRemove = actionsToRemove.begin(); 01582 itActionsToRemove != actionsToRemove.end(); 01583 itActionsToRemove++) 01584 { 01585 target = (*itActionsToRemove).second.first; 01586 action = (*itActionsToRemove).second.second; 01587 itActionsExecutionIntensityByTarget = _pActionsExecutionIntensityByTarget->find(target); 01588 nlassert (itActionsExecutionIntensityByTarget != _pActionsExecutionIntensityByTarget->end()); 01589 itMotiveByAction = (*itActionsExecutionIntensityByTarget).second.find(action); 01590 nlassert (itMotiveByAction != (*itActionsExecutionIntensityByTarget).second.end()); 01591 (*itActionsExecutionIntensityByTarget).second.erase(action); 01592 if ( (*itActionsExecutionIntensityByTarget).second.begin() == (*itActionsExecutionIntensityByTarget).second.end() ) 01593 { 01594 _pActionsExecutionIntensityByTarget->erase(target); 01595 } 01596 } 01597 01598 if (_Learning) 01599 { 01600 learningComputation(); 01601 01602 _OldClassifiersAndMotivationIntensity = _ClassifiersAndMotivationIntensity; 01603 } 01604 01605 return _pActionsExecutionIntensityByTarget; 01606 } |
|
Definition at line 1181 of file mhics.cpp. References _Learning.
01182 { 01183 _Learning = active; 01184 } |
|
Donne la Puissance Propre d'une Motivation.
Definition at line 780 of file mhics.cpp. References _ClassifiersAndMotivationIntensity.
00781 { 00782 _ClassifiersAndMotivationIntensity[motivationName].setMHiCSagent(this); 00783 _ClassifiersAndMotivationIntensity[motivationName].setMotivationPP(motivationName, PP); 00784 // spreadMotivationReckon(motivationName); 00785 } |
|
Fixe la valeur d'une motivation.
Definition at line 802 of file mhics.cpp. References _ClassifiersAndMotivationIntensity, and value.
00803 { 00804 // if (_Learning) 00805 // { 00806 // double lastMotiveValue = _ClassifiersAndMotivationIntensity[motivationName].getMotivationValue(motivationName); 00807 // // Si la valeur de motivation a diminuée, il est temps d'apprendre 00808 // if (lastMotiveValue > value) 00809 // { 00810 // learningComputationMotivationDecrease(motivationName); 00811 // } 00812 // } 00813 00814 std::map<TMotivation, CMotivationEnergy>::iterator itClassifiersAndMotivationIntensity = _ClassifiersAndMotivationIntensity.find(motivationName); 00815 if (itClassifiersAndMotivationIntensity == _ClassifiersAndMotivationIntensity.end()) 00816 { 00817 itClassifiersAndMotivationIntensity = _ClassifiersAndMotivationIntensity.insert(std::make_pair(motivationName,CMotivationEnergy())).first; 00818 00819 // On en profite pour mettre à zero la date de la première réponse positive d'une motivation 00820 // _TimeOfLastMotivationValueDecrease[motivationName] = NLMISC::CTime::getSecondsSince1970(); 00821 } 00822 (*itClassifiersAndMotivationIntensity).second.setMHiCSagent(this); 00823 (*itClassifiersAndMotivationIntensity).second.setMotivationValue(motivationName, value); 00824 // spreadMotivationReckon(motivationName); 00825 } |
|
Set the sensor source.
Definition at line 1176 of file mhics.cpp. References _pSensorsValues.
01177 { 01178 _pSensorsValues = psensorMap; 01179 } |
|
function used in debug to change a TTargetId in a string
Definition at line 691 of file mhics.cpp. References NLMISC::toString(), and NLAINIMAT::TTargetId. Referenced by getDebugString().
00692 { 00693 /* // Le format est celui pour afficher en debug le Nb comme dans Ryzom. 00694 uint32 aiBoteId = id; 00695 uint32 managerID = (aiBoteId>>(8+12))&( (1<<10)-1 ); 00696 uint32 groupeID = (aiBoteId>>8)&( (1<<12)-1 ); 00697 uint32 boteID = aiBoteId&( (1<<8)-1 ); 00698 char result[30]; 00699 sprintf(result,"AI:%04x:BOT:%04x:%04x:%04x",aiBoteId,managerID,groupeID,boteID); 00700 return result; 00701 */ 00702 std::string ret = NLMISC::toString(id); 00703 return ret; 00704 } |
|
Definition at line 1624 of file mhics.cpp. References _pOldInfoClassifierActivity, and NLAINIMAT::TClassifierNumber. Referenced by NLAINIMAT::CMotivationEnergy::computeMotivationValue().
01625 { 01626 bool wasPreviouslyActived = false; 01627 01628 std::map<TMotivation, std::map<TClassifierNumber, CClassifierActivityInfo> >::const_iterator itOldInfoClassifierActivity; 01629 itOldInfoClassifierActivity = (*_pOldInfoClassifierActivity).find(motivationName); 01630 if (itOldInfoClassifierActivity != _pOldInfoClassifierActivity->end()) 01631 { 01632 std::map<TClassifierNumber, CClassifierActivityInfo>::const_iterator itClassifierInfo = (*itOldInfoClassifierActivity).second.find(classifierNumber); 01633 if (itClassifierInfo != (*itOldInfoClassifierActivity).second.end() ) 01634 { 01635 wasPreviouslyActived = (*itClassifierInfo).second.IsActive; 01636 } 01637 } 01638 return wasPreviouslyActived; 01639 } |
|
Definition at line 294 of file mhics.h. Referenced by getDebugString(), getMotivationPP(), getMotivationValue(), learningComputation(), motivationCompute(), selectBehavior(), setMotivationPP(), and setMotivationValue(). |
|
Definition at line 300 of file mhics.h. Referenced by CMHiCSagent(), selectBehavior(), and setLearning(). |
|
Definition at line 295 of file mhics.h. Referenced by learningComputation(), and selectBehavior(). |
|
Definition at line 298 of file mhics.h. Referenced by CMHiCSagent(), getExecutionIntensity(), learningComputation(), run(), selectBehavior(), and ~CMHiCSagent(). |
|
Definition at line 304 of file mhics.h. Referenced by CMHiCSagent(), run(), and ~CMHiCSagent(). |
|
Definition at line 293 of file mhics.h. Referenced by CMHiCSagent(), getMHiCSbase(), learningComputation(), motivationCompute(), and selectBehavior(). |
|
Definition at line 299 of file mhics.h. Referenced by CMHiCSagent(), run(), and ~CMHiCSagent(). |
|
Definition at line 305 of file mhics.h. Referenced by CMHiCSagent(), run(), wasClassifierPreviouslyActive(), and ~CMHiCSagent(). |
|
Definition at line 297 of file mhics.h. Referenced by getDebugString(), motivationCompute(), and setSensors(). |
|
Definition at line 303 of file mhics.h. Referenced by getTemporaryClassifierPriorityTime(), and learningComputation(). |