Логическое дерево. Модель.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Aleksey Mavrin
2711
Aleksey Mavrin  

Многие знакомы со стандартной библиотекой, и таким классом CExpertSignal. Вкратце это корневой класс, потомки которого подают сигналы Лонг или Шорт вида -100..+100, и который позволяет собрать дерево-компоновщика из любых потомков.

Штука мощная, но есть недостатки, например сложно заложить сигналы "с правом вето" (возможно, но не совсем удобно и запутаться легко). Из-за этого (но не только) мне пришла идея написать логическое дерево компоновщика.

Если непонятно что это, краткое пояснение - то же дерево компоновщика, но каждый узел выдаёт сигнал true или false в зависимости от сигналов своих дочерних узлов, которые делятся на группы AND, OR, XOR, NOT.

Код вычисления сигнала узла в функции Compare. CompareSelf - это собственно какой сигнал выдает этот сам узел, виртуальная функция для переопределения в потомках:

class CTFModel: public CTimeFrameState
  {
protected:
public:
   CTFStateArray     ANDarr;
   CTFStateArray     ORarr;
   CTFStateArray     XORarr;
   CTFStateArray     NOTarr;
   bool              AND(CTFModel*model) {return ANDarr.Add(model);};
   bool              OR(CTFModel*model) {return ORarr.Add(model);};
   bool              XOR(CTFModel*model) {return XORarr.Add(model);};
   bool              NOT(CTFModel*model) {return NOTarr.Add(model);};
   virtual bool      CompareSelf(CTimeFrameState * obj) {return true;};
   virtual bool      Compare(CTimeFrameState * obj)
     {
      bool self, and, or, xor, not;
      bool res=false;
      xor=or=false;
      and= not=true;
      if(CheckPointer(obj) == POINTER_INVALID)
        {
         Print(__FUNCSIG__ ," Error Compare *obj");
         return res;
        }
      self=CompareSelf(obj);
      int i;
      for(i=0; i<ANDarr.Total(); i++)
        {
         if(ANDarr.At(i).Compare(obj)==false)
           {and=false; break;}
        }
      for(i=0; i<ORarr.Total(); i++)
        {
         if(ORarr.At(i).Compare(obj)==true)
           {or=true; break;}
        }
      for(i=0; i<XORarr.Total(); i++)
        {
         bool last=true;
         if(XORarr.At(i).Compare(obj)==true)
           {xor=true; break;}
        }
      for(i=0; i<NOTarr.Total(); i++)
        {
         if(NOTarr.At(i).Compare(obj)==true)
           {not=false; break;}
        }
      if((self!=xor && and && not) || or)
         res=true;
      return res;
     };
  };

Как продолжение темы вижу следующие: 1. Расширение функционала до нечёткой логики 2. Применение в МО для сбора в деревья элементарных предикторов. 

3. Естественно можно CExpertSignal обернуть в это дерево, чтобы пользоваться уже готовыми сигналами и помощью мастера конструктора экспертов (кто-то им вообще пользуется?). Замечу что можно часть дерева строить по логической схеме, часть по числовой. Мне это пока было не нужно.

Собственно интересует мнение опытных программеров и др. :

а) Может этот функционал ничего не даёт, и я бы мог его чем-то заменить?

б) Пользуется ли кто-то подобными моделями, поделитесь опытом?

в) Интересно ли продолжение развития темы и её обсуждение? 

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий