More On Inference Engine in C++

Tulisan ini merupakan lanjut eksplorasi tentang inference engine seperti posting saya pada situs gamedev-Id tentang Simple Inference Engine in C++ dan di blog saya di pebbie.net. karena modul mesin inferensi ini digunakan pada tugas akhir saya tentang behavioral animation dengan menggunakan model berbasis kaidah (rule).

karena mesin inferensi pada artikel sebelumnya bersifat interaktif maka saya perlu melakukan modifikasi agar dapat diterapkan pada modul animasi. beberapa perubahan yang saya lakukan :
– representasi pengetahuan berupa simbol seperti pada logika proposisi.
– implementasi prioritas kaidah dan agenda untuk mengurutkan kaidah yang menjadi kandidat eksekusi
– struktur data tambahan seperti pada algoritma RETE untuk mempercepat pemilihan kandidat kaidah jika terjadi perubahan pada working memory

berikut ini definisi enumerasi yg digunakan:


enum ECOMP_FN{
  FN_EXISTS, //attribute of object exists in working memory
  FN_UNKNOWN, //attribute doesn't exists in working memory
  CMD_ASSERT, //assert new fact from working memory
  CMD_RETRACT, //retract fact from working memory
};

kelas CFact menggunakan template


template <class KR>
class CFact
{
  protected:
    int m_EvalFunc;
    KR m_Attr;
  public:
    CFact():m_EvalFunc(FN_EXISTS) {}
    CFact(KR kr):m_EvalFunc(FN_EXISTS), m_Attr(kr) {}
    CFact(KR kr, int Eval):m_EvalFunc(Eval), m_Attr(kr) {}
    virtual ~CFact() {}

    void SetEvalFunc(int fn) { m_EvalFunc = fn; }
    int GetEvalFunc() const { return m_EvalFunc; }

    void Set(KR kr) { m_Attr = kr; }
    KR Get() const { return m_Attr; }
};

begitu juga dengan CRule


template <class KR>
class CRule
{
  protected:
    int m_priority; //static priority : to be used in conflict resolution
    bool m_in_agenda;
    std::string m_name; //rule name
    std::string m_desc; //rule description

    std::list<CFact<KR>*> m_lhs;
    std::list<CFact<KR>*> m_rhs;


  public:
    CRule():m_priority(0), m_in_agenda(false) {}
    CRule(std::string name, std::string desc):m_priority(0), m_in_agenda(false), m_name(name), m_desc(desc) {}
    virtual ~CRule() {}

    void AddLHS(CFact<KR>* LHS) { m_lhs.push_back(LHS); }
    void AddRHS(CFact<KR>* RHS) { m_rhs.push_back(RHS); }

    void SetPriority(int prior) { m_priority = prior; }
    int GetPriority() const { return m_priority; }

    void SetName(std::string name) { m_name = name; }
    void SetDescription(std::string desc) { m_desc = desc; }

    std::string GetName() const { return m_name; }
    std::string GetDescription() const { return m_desc; }


    std::list*>& GetLHS() { return m_lhs; }//get a pointer to LHS
    std::list*>& GetRHS() { return m_rhs; }

    void SetInAgenda(bool bval) { m_in_agenda = bval; }
    bool InAgenda() { return m_in_agenda; }
};

beberapa helper class untuk implementasi listener


template <class KR>
class IFactListener
{
public:
  virtual void OnFactAssert(CFact<KR>* pFact) = 0;
  virtual void OnFactRetract(CFact<KR>* pFact) = 0;
  virtual void OnFactModify(CFact<KR>* pFact) = 0;
};

template <class KR>
class IRuleListener
{
public:
  virtual void OnRuleFired(CRule<KR>* pFiredRule) = 0;
};

untuk kelas CKnowledgeBase sengaja tidak ditulis di sini karena sangat panjang. bagi pembaca yang berminat bisa mengunduh di sini (6KB). modul ini menggunakan pustaka pendukung tinyxml walaupun sebenarnya dapat juga tanpa menggunakan modul tinyxml. Dalam berkas tersebut juga tersedia berkas driver untuk contoh kasus ada pada berkas rule.xml.

One comment

  1. Fajar · Juni 9, 2008

    Mas Makasih Mmas smoga ilmu ini bermanfaat bagi orang-orang yang membutuhkan trims

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s