1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

A bit more metamagic for expert system.

This commit is contained in:
DjWarmonger 2010-11-12 15:20:44 +00:00
parent 6da5c8ee56
commit e2f4a60c4b
2 changed files with 45 additions and 14 deletions

View File

@ -1,5 +1,6 @@
#include "GeneralAI.h" #include "GeneralAI.h"
#include "../../CCallback.h" #include "../../CCallback.h"
#include "ExpertSystem.h"
/* /*
* ExpertSystem.cpp, part of VCMI engine * ExpertSystem.cpp, part of VCMI engine
@ -11,3 +12,15 @@
* *
*/ */
template <typename ruleType, typename facts> void ExpertSystemShell<ruleType, facts>::DataDrivenReasoning(runType type)
{
switch (type)
{
case ANY_GOAL: //first produced decision ends reasoning
{
for (std::list<typename facts>::iterator it = factList.begin(); it != factList.end(); it++)
{};
}
break;
}
}

View File

@ -1,6 +1,7 @@
#include "../vcmi/global.h" #include "../vcmi/global.h"
#include "../vcmi/CCallback.h" #include "../vcmi/CCallback.h"
#include "HeroBonus.h" #include "../vcmi/lib/HeroBonus.h"
#include <boost/bind.hpp>
#include <set> #include <set>
/* /*
@ -12,19 +13,33 @@
* Full text of license available in license.txt file, in main folder * Full text of license available in license.txt file, in main folder
* *
*/ */
struct Bonus;
template <typename input, typename output> class Rule;
typedef Rule<Bonus, Bonus> BRule;
template <typename ruleType, typename facts> class ExpertSystemShell template <typename ruleType, typename facts> class ExpertSystemShell
{ {
enum runType {ANY_GOAL, TRESHOLD, FULL};
private: private:
ICallback* m_cb; ICallback* m_cb;
protected: protected:
template std::set<typename ruleType> knowledge; std::set<ruleType> knowledge;
ui16 goalCounter; //count / evaluate achieved goals for runType
public: public:
template std::set<typename facts> facts; ExpertSystemShell(){goalCounter = 0;};
std::list<facts> factList;
template <typename t1> void getKnowledge(const t1 &a1){}; template <typename t1> void getKnowledge(const t1 &a1){};
template <typename ruleType> void getNextRule(){}; template <typename ruleType> void getNextRule(){};
template <typename t2> void returnGoals(const t2 &a2){}; template <typename t2> void returnGoals(const t2 &a2){};
virtual void DataDrivenReasoning(runType type);
};
template <typename ruleType, typename facts> class Blackboard : public ExpertSystemShell <ruleType, facts>
//handle Bonus info coming from different sections of the game
{
public:
Blackboard(){this->goalCounter = 0;};
std::vector<ExpertSystemShell*> experts; //modules responsible for different tasks
}; };
template <typename input> class condition template <typename input> class condition
@ -36,34 +51,37 @@ public:
conditionType conType; conditionType conType;
}; };
template <typename &input, typename &output> class Rule template <typename input, typename output> class Rule
{ {
friend class ExpertSystemShell; friend class ExpertSystemShell <input, output>;
public: public:
fired; //if conditions of rule were met and it produces some output bool fired; //if conditions of rule were met and it produces some output
protected: protected:
std::set<typename input> conditions; std::set<input*> conditions;
output decision;
virtual void canBeFired(); //if this data makes any sense for rule virtual void canBeFired(); //if this data makes any sense for rule
virtual void fireRule(); virtual void fireRule();
public: public:
template <typename &givenInput> bool matchesInput() //if condition and data match type template <typename givenInput> bool matchesInput() //if condition and data match type
{return dynamic_cast<input*>(givenInput);}; {return dynamic_cast<input*>(&givenInput);};
}; };
template <typename &input, typename &output> class Goal : public Rule template <typename input, typename output> class Goal : public Rule <input, output>
{ {
protected:
boost::function<void(output)> decision(); //do something with AI eventually
public: public:
void fireTule(){}; void fireRule(){};
}; };
template <typename &input, typename &output> class Weight : public Rule template <typename input, typename output> class Weight : public Rule <input, output>
{ {
public: public:
float value; //multiply input by value and return to output float value; //multiply input by value and return to output
void fireTule(){}; void fireTule(){};
}; };
template <typename RuleType> class BonusSystemExpert : public ExpertSystemShell <typename RuleType, Bonus> class BonusSystemExpert : public ExpertSystemShell <BRule, Bonus>
{ { //TODO: less templates?
enum effectType {POSITIVE=1, NEGATIVE=2, EXCLUDING=4, ENEMY=8, ALLY=16}; //what is the influencce of bonus and for who enum effectType {POSITIVE=1, NEGATIVE=2, EXCLUDING=4, ENEMY=8, ALLY=16}; //what is the influencce of bonus and for who
}; };