C++ хранилище дерева решений

У меня есть дерево решений. Я передаю этому дереву решений некоторые входные значения. Дерево решений затем возвращает значение.

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

Это дерево решений (при преобразовании в оператор if-then) будет выглядеть так:

int i=0;

if (ownedHouses==0)
{
    if (numberOfChildren==4)
    {
        if (ageFather==39)
        {
            if (incomeFamily==40000)
            {
                if (carsAlreadyCrashed==1)
                {
                    i=3;
                }
                else
                {
                    if (carsAlreadyCrashed==2)
                    {
                        if (insurancePaysForCrashes==1)
                        {
                            i=5;
                        }
                      }
                      else
                      {
                            i=4;
                        }
                    }
                    else
                    {
                        i=11;
                    }
                }
            }
            else
            {
                i=2;
            }
        }
        else
        {
            i=9;
        }
    }
    else
    {
        i=22;
    }
else
{
    i=8;
}

Это всего лишь пример. На самом деле, итоговое утверждение if-then будет абсолютно огромным. Хотя я могу анализировать данные и создавать из них такое if-then, я не смог использовать такой большой цикл if-then-loop в своем программном обеспечении.

Поэтому я ищу другой способ интеграции дерева решений в мое программное обеспечение.

Я видел подходы, в которых данные дерева решений (в какой бы форме они ни предоставлялись...) анализировались во время выполнения, а затем из него создавались классы с корнем, узлами и листьями.

Для моих целей это не достаточно быстро.

У кого-нибудь есть другая идея?

Спасибо вам за помощь.

Изменить: я изменил некоторые значения на реальные значения, чтобы сделать смысл более ясным.

1 ответ

Самая быстрая реализация, которую я знаю, реализована в ALGLIB. Дерево решений хранится в виде массива двойников.

  • Конечный узел - два значения {-1, данные}.
  • Нелистовой узел - три значения {input_value_index, threshold, right_branch_offset}.

Вы можете найти реализацию этого подхода в dforest.dfprocessinternal

Другие вопросы по тегам