Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/47: Рейтинг темы: голосов - 47, средняя оценка - 4.57
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4

Реализовать функцию для вычисления дерева решений

27.04.2022, 18:11. Показов 9717. Ответов 13

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, с чего начать решение задачи?


Нужно преобразовывать качественные переменные в числовые?

Спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.04.2022, 18:11
Ответы с готовыми решениями:

Реализовать функцию для вычисления дерева решений
Примеры результатов вычислений: main() = 3 main() = 5 main() = 6 main() = 4 main() = 10

Как реализовать функцию для вычисления дерева решений
Всем привет! Есть задача: Реализовать функцию для вычисления дерева решений. Кто знает как решить эту задачу? Заранее спасибо!

Реализовать класс, задающий конструкцию "бинарное дерево" и функцию вычисления высоты бинарного дерева
Выручайте, через 2 часа сдавать лабу... Суть самой лабы ниже... Реализовать класс, задающий конструкцию "бинарное дерево" и...

13
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
27.04.2022, 19:32
VistaSV30, тебе велосипед нужен? вроде есть же какие то решения через pandas и т.п.
0
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
27.04.2022, 19:44  [ТС]
eaa, я, пока вообще не могу понять по приведенным примерам, какая логика решения?
В целом я про дерево решений почитал. Но, пока конкретно про этот случай ничего не нашел.

Сначала я думал, что тут можно будет составить матрицу смежности. Но видимо теория графов здесь не применима
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
30.04.2022, 08:15
Здесь надо тупо много if-ов
0
enx
 Аватар для enx
1189 / 765 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
30.04.2022, 12:24
тут не нужно много if, тут нужен один json. Логику того, как формируются ответы не смотрел, ибо нет в условии.
0
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
30.04.2022, 14:25  [ТС]
enx, вот логику я понять и не могу. Задание здесь выложено полностью, как было в контрольной.
Судя по сложности других заданий должно решаться ну максимум в 20 - 25 строк кода.

Деревья решений - это же один из разделов Теории графов. Сначала я думал, что тут можно составить матрицу смежности, чтоб найти путь от корня к листу. Но пока не получается

Добавлено через 25 минут
А может быть такой вариант, что в функцию подаются "веса", а потом в функции нужно найти путь на котром есть именно эти "веса" или их наилучшее совпадение? Порядок передачи "весов" в функцию не важен.

Тогда должна сработать матрица смежности
0
enx
 Аватар для enx
1189 / 765 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
30.04.2022, 15:23
VistaSV30, да какая разница сколько строк, можно все в 1 написать. Посмотри 2 пример, подумай, почему вывод 8, проследи ветку от результата, станет понятнее что делать.
0
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
30.04.2022, 19:04  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
s = ({1996,'NIX',1961,1966},
{1996,'NIX',1961,2015},
{1996,'NIX',1961,1979},
{1996,'NIX',1981,2001},
{1996,'NIX',1981,2009},
{1996,'P4'},
{1996,'MESON',1961,2001},
{1996,'MESON',1961,2009},
{1996,'MESON',1981},
{2003,2001,1966},
{2003,2001,2015},
{2003,2001,1979},
{2003,2009})
 
def main(*r):
    s1 = set(r)
    mx = [len(i & s1) for i in s]
    print('Количество пересечений:', mx)
    return [i for i,j in enumerate(mx) if j == max(mx)]
        
print('Ответ:', *main(1961,2001,1996,'NIX',1966))
print('Ответ:', *main(1981,2009,1996,'MESON',1966))
Bash
1
2
3
4
Количество пересечений: [4, 3, 3, 3, 2, 1, 3, 2, 1, 2, 1, 1, 0]
Ответ: 0
Количество пересечений: [2, 1, 1, 2, 3, 1, 2, 3, 3, 1, 0, 0, 1]
Ответ: 4 7 8
По-моему, задание составлено некорректно. Во втором случае, возможны три варианта правильного ответа.

Добавлено через 6 минут
Возможно, надо добавить условие, чтобы путь был самый короткий
1
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
01.05.2022, 02:30
Вот так вроде бы работает:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
def main(lis):
    #x2
    if 1996 in lis:
        #x2 x3
        if 'NIX' in lis:
            #x2 x3 x0
            if 1961 in lis:
                #x2 x3 x0 x4
                if 1966 in lis:
                    return 0
                # x2 x3 x0 x4
                elif 2015 in lis:
                    return 1
                # x2 x3 x0 x4
                elif 1979 in list:
                    return 2
            # x2 x3 x0
            elif 1981 in lis:
                #x2 x3 x0 x1
                if 2001 in lis:
                    return 3
                # x2 x3 x0 x1
                elif 2009 in lis:
                    return 4
        #x2 x3
        elif 'P4' in lis:
            return 5
        #x2 x3
        elif 'MESON' in lis:
            #x2 x3 x0
            if 1961 in lis:
                #x2 x3 x0 x1
                if 2001 in lis:
                    return 6
                # x2 x3 x0 x1
                elif 2009 in lis:
                    return 7
            # x2 x3 x0
            elif 1981 in lis:
                return 8
    #x2
    elif 2003 in lis:
        #x2 x1
        if 2001 in lis:
            # x2 x1 x4
            if 1966 in lis:
                return 9
            # x2 x1 x4
            elif 2015 in lis:
                return 10
            # x2 x1 x4
            elif 1979 in lis:
                return 11
        # x2 x1
        elif 2009 in lis:
            return 12
#==============================================================================
print( main( [ 1961, 2001, 1996, 'NIX', 1966 ] ) )
print( main( [ 1981, 2009, 1996, 'MESON', 1966 ] ) )
Добавлено через 1 час 38 минут
Ну или в более читаемом виде:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
def main(lis):
    #==========================================================================
    def x_0(lis, pref):
        match pref:
            case [1996, 'MESON']:
                if 1961 in lis:
                    return x_1( lis, pref + [1961] )
                elif 1981 in lis:
                    return 8
            case [1996, 'NIX']:
                if 1961 in lis:
                    return x_4( lis, pref + [1961] )
                elif 1981 in lis:
                    return x_1( lis, pref + [1981] )
    # ==========================================================================
    def x_3( lis, pref ):
        if 'NIX' in lis:
            return x_0(lis, pref + ['NIX'])
        elif 'P4' in lis:
            return 5
        elif 'MESON' in lis:
            return x_0(lis, pref + ['MESON'])
    # ==========================================================================
    def x_4(lis, pref):
        match pref:
            case [2003, 2001]:
                if 1966 in lis:
                    return 9
                if 2015 in lis:
                    return 10
                if 1979 in lis:
                    return 11
            case [1996, 'NIX', 1961]:
                if 1966 in lis:
                    return 0
                if 2015 in lis:
                    return 1
                if 1979 in lis:
                    return 2
    # ==========================================================================
    def x_1(lis, pref):
        match pref:
            case [2003]:
                if 2001 in lis:
                    return x_4(lis, pref + [2001])
                elif 2009 in lis:
                    return 12
            case [1996, 'MESON', 1961]:
                if 2001 in lis:
                    return 6
                elif 2009 in lis:
                    return 7
            case [1996, 'NIX', 1981]:
                if 2001 in lis:
                    return 3
                elif 2009 in lis:
                    return 4
    # ==========================================================================
    def x_2(lis, pref):
        if 1996 in lis:
            return x_3(lis, pref + [1996])
        elif 2003 in lis:
            return x_1(lis, pref + [2003])
    # ==========================================================================
    return x_2(lis, [])
#==============================================================================
print( main( [ 1961, 2001, 1996, 'NIX', 1966 ] ) )
print( main( [ 1981, 2009, 1996, 'MESON', 1966 ] ) )
1
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
01.05.2022, 11:02  [ТС]
Докрутил
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
s = ({1996,'NIX',1961,1966},
{1996,'NIX',1961,2015},
{1996,'NIX',1961,1979},
{1996,'NIX',1981,2001},
{1996,'NIX',1981,2009},
{1996,'P4'},
{1996,'MESON',1961,2001},
{1996,'MESON',1961,2009},
{1996,'MESON',1981},
{2003,2001,1966},
{2003,2001,2015},
{2003,2001,1979},
{2003,2009})
 
def main(*r):
    s1 = set(r)
    mx = [len(i & s1) for i in s]
    a = [i for i,j in enumerate(mx) if j == max(mx)]
    mn = [len(s[i]) for i in a]
    return a[mn.index(min(mn))]
        
print('Ответ:', main(1961,2001,1996,'NIX',1966))
print('Ответ:', main(1981,2009,1996,'MESON',1966))
Добавлено через 16 минут
Кортеж множеств s получился после сокращения матрицы смежности нагруженного ориентированного графа, который и представляет собой дерево решений:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
col = ['x[2]','x[3]','x[1]','x[0]','x[0]_1','x[4]','x[4]','x[1]','x[1]_1','0','1','2','3','4','5','6','7','8','9','10','11','12']
lvl = [0,1,1,2,2,2,3,3,3]
a = [[0,1996,2003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,'NIX','MESON',0,0,0,0,0,0,0,0,0,'P4',0,0,0,0,0,0,0],
[0,0,0,0,0,2001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2009],
[0,0,0,0,0,0,1961,1981,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1961,0,0,0,0,0,0,0,0,1981,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1966,2015,1979,0],
[0,0,0,0,0,0,0,0,0,1966,2015,1979,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,2001,2009,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2001,2009,0,0,0,0,0]]
 
df = pd.DataFrame(a, columns=col)
df.insert(0, 'lvl', lvl)
df
0
Эксперт Python
8840 / 4492 / 1864
Регистрация: 27.03.2020
Сообщений: 7,312
01.05.2022, 19:42
Лучший ответ Сообщение было отмечено VistaSV30 как решение

Решение

VistaSV30, а так может быть? (Не хватает тестов...)
Python
1
2
3
4
def main(*r):
    s1 = set(r)
    return [i for i in range(len(s))
             if not(len(s[i] - s1))][0]
1
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
01.05.2022, 21:57  [ТС]
Gdez, работает!
Попробовал еще на этой задаче, там тоже сработало!

Python - просто чудесный язык программирования!

Добавлено через 27 минут
Интересно, Вы как пришли к этому решению? На основе свойств множества или как-то по другому? Какая была логическая последовательность выбора решения?
0
Эксперт Python
8840 / 4492 / 1864
Регистрация: 27.03.2020
Сообщений: 7,312
01.05.2022, 22:33
VistaSV30, множества. Это сразу видно из условия. Ждал еще каких-нибудь ограничений - ни пройденной теории, ни полного условия задачи у меня нет. Не дождался...
0
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
02.05.2022, 07:25  [ТС]
У меня тоже только фото задания и все. Автор фото больше на связь не выходил
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.05.2022, 07:25
Помогаю со студенческими работами здесь

Определить функцию для вычисления глубины бинарного дерева
Дано S-выражение, представляющее дерево вида «(РебенокЛевый Родитель РебенокПравый)». Определить функцию для вычисления глубины этого...

Определить функцию для вычисления глубины бинарного дерева
Вообщем вот такая задачка: Определить функцию для вычисления глубины бинарного дерева (глубина пустого дерева равна 0, глубина...

Определить функцию для вычисления глубины бинарного дерева
Здравствуйте, помогите пожалуйста с написанием программы на F# (visual studio 2010): Определить функцию для вычисления глубины бинарного...

Реализовать алгоритм С4.5 построения дерева решений. Вход — таблица.Выход — дерево
Здравствуйте, пожалуйста помогите с данной задачей. Нужно реализовать алгоритм С4.5 построения дерева решений. Вход — таблица.Выход —...

Создать класс дерева, содержащего числа. Реализовать функцию, определяющую количество уровней дерева
Нужна программа: Создать класс дерева, содержащего числа. Реализовать в этом классе функцию, определяющую количество уровней дерева, то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru