00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef C_HIERARCHICBEHAVIOUR__H
00033 #define C_HIERARCHICBEHAVIOUR__H
00034
00035 #include "cagent.h"
00036 #include "crewardfunction.h"
00037 #include "caction.h"
00038 #include "cagentcontroller.h"
00039
00040
00041 class CRegion;
00042 class CStateProperties;
00043 class CStateCollection;
00044 class CState;
00045
00046
00047 class CSubGoalBehaviour : public CHierarchicalSemiMarkovDecisionProcess, public CStateReward
00048 {
00049 protected:
00050 std::map<CRegion *, std::pair<double, double> > *rewardFactors;
00051
00052 std::list<CRegion *> *targetRegions;
00053 std::list<CRegion *> *failRegions;
00054
00055 double standardReward;
00056
00057 CRegion *availableRegion;
00058 CStateProperties *modelProperties;
00059
00060 string subgoalName;
00061
00062 public:
00063 CSubGoalBehaviour(CStateProperties *modelProperties, CRegion *avialableRegion, char *subgoalName = "");
00064 virtual ~CSubGoalBehaviour();
00065
00066 virtual bool isFinished(CStateCollection *oldState, CStateCollection *newState);
00067 virtual bool isAvailable(CStateCollection *currentState);
00068
00069 virtual bool isInGoalRegion(CState *state);
00070 virtual bool isInFailRegion(CState *state);
00071
00072 virtual double getStateReward(CState *modelState);
00073 virtual void getInputDerivation(CState *modelState, ColumnVector *targetState);
00074
00075 virtual void addTargetRegion(CRegion *target, double rewardFactor = 1.0, double rewardTau = 10);
00076 virtual void addFailRegion(CRegion *target, double rewardFactor = - 1.0, double rewardTau = 10);
00077
00078 void setRewardFactor(CRegion *region, double rewardFactor);
00079 void setRewardTau(CRegion *region, double rewardTau);
00080
00081 void setStandardReward(double l_standardReward) {this->standardReward = l_standardReward;};
00082
00083 virtual CRegion *getAvailAbleRegion() {return availableRegion;};
00084
00085 virtual void sendNextStep(CAction *action);
00086
00087 string getSubGoalName() {return subgoalName;};
00088 };
00089
00090 class CSubGoalController : public CAgentController
00091 {
00092 protected:
00093 public:
00094 CSubGoalController(CActionSet *hierarchicActions);
00095
00096 virtual CAction *getNextAction(CStateCollection *state, CActionDataSet *data = NULL);
00097 };
00098
00099
00100 class CSubGoalOutput : public CSemiMDPListener
00101 {
00102 protected:
00103 CSubGoalBehaviour *lastAction;
00104 CAgentController *policy;
00105
00106 public:
00107 CSubGoalOutput(CAgentController *policy);
00108
00109 virtual void nextStep(CStateCollection *oldState, CAction *action, CStateCollection *newState);
00110 virtual void newEpisode();
00111 };
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 class CExtendedPrimitiveAction : public CExtendedAction
00131 {
00132 protected:
00133 CAction *primitiveAction;
00134 public:
00135 int extendedActionDuration;
00136
00137 CExtendedPrimitiveAction(CAction *primitiveAction, int extendedActionDuration);
00138
00139 virtual bool isFinished(CStateCollection *oldState, CStateCollection *newState);
00140
00141 virtual CAction* getNextHierarchyLevel(CStateCollection *state, CActionDataSet *actionDataSet = NULL);
00142
00143
00144 };
00145
00147
00153 class CPrimitiveActionStateChange : public CExtendedAction
00154 {
00155 protected:
00157 CStateProperties *stateToChange;
00158
00159 CPrimitiveAction *primitiveAction;
00160
00161 public:
00162 CPrimitiveActionStateChange(CPrimitiveAction *action, CStateProperties *stateToChange);
00163
00165 virtual CAction* getNextHierarchyLevel(CStateCollection *state, CActionDataSet *actionDataSet = NULL);
00166
00167
00168 virtual bool isFinished(CStateCollection *oldState, CStateCollection *newState);
00169
00170
00171 void setStateToChange(CStateProperties *stateToChange);
00172
00173 };
00174
00175
00176 #endif
00177