Функция чтения из файла для реализации дерева решений в C ++ - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно создать дерево решений в C ++, которое может работать с различными наборами данных в зависимости от входных данных из файла. Функции, которые мне нужно реализовать, - это чтение из файла, печать списка переменных, печать (структурированного) дерева, вставка / удаление / изменение узлов, «сделать прогноз на основе входных данных из файла» и «сделать предсказание, вставляющее значения одно за другим '.

Прямо сейчас я пытаюсь повторно использовать некоторый код, который я уже написал, для создания дерева с указателями на первого потомка следующего ребенка, и мне понадобится некоторая помощь с функциями чтения и печати. ​​

Вот формат ввода:

root 
root nodo1 cond1 nodo2 cond2 nodo3 cond3 
nodo1 nodo4 cond4 nodo5 cond5 nodo6 cond6 ....... 
nodo2 nodo7 cond7 nodo8 cond8 nodo9 cond9 .......

А вот код для функции чтения, которую я реализовал:

Tree readFromStream(istream& str)
{
    Tree t = createEmpty();
    string line;
    Label rootLabel, fatherLabel, childLabel;
    getline(str, line);
    istringstream instream;            
    instream.clear();
    instream.str(line);
    instream >> rootLabel;             // the first element in the file is the root
    addElem(emptyLabel, rootLabel, t); // the tree in initially empty so it has no father
    getline(str, line);                // start reading the other lines
    instream.clear();
    instream.str(line);
    while (!str.eof())
        {
    instream >> fatherLabel; // on each line, the first element is the fatherLabel and the others are the children's labels 
        removeBlanksAndLower(fatherLabel); // function to normalize the fatherLabel
        while (!instream.eof())            // as long as the line isn't finished
            {
            instream >> childLabel;              // read the next label
            removeBlanksAndLower(childLabel);    // normalize it
            addElem(fatherLabel, childLabel, t); // attach it to the father
            }
        getline(str, line);
        instream.clear();
        instream.str(line);
        }
    str.clear();
    return t;
}

Моя проблема заключается в том, что условия cond1, cond2, cond3... - это не дочерние метки, а метки, представляющие переменные: они могут быть целыми числами (условия «возраста») или строками (то есть «типом автомобиля»). Все условия должны быть представлены одним из этих символов: =, <, <=, >, >=, !=. Вот возможный входной файл, на котором мне нужно будет построить дерево решений:

Age_1 
Age_1 Risk_1 <=23 TypeOfVehicle_1 >23 
Risk_1 END_1 =A 
TypeOfVehicle_1 Risk_2 =Sportscar Risk_3 =Autocarro Risk_4 =Citycar
Risk_2 END_2 =A 
Risk_3 END_3 =B 
Risk_4 END_4 =B

И функция printDecisionTree выдаст:

Age_1 
--(TypeOfVehicle_1, >23) 
----(rischio_5, =CityCar) 
------(end_5, =B) 
----(rischio_4, =Autocarro) 
------(end_4, =B) 
----(rischio_3, =SportsCar) 
------(end_3, =A) 
--(rischio_2, <23) 
----(end_2, =A) 
--(rischio_1, =23) 
----(end_1, =A)

Как я могу изменить свою функцию, чтобы правильно прочитать метку переменных, представляющих условия?

...