Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 29.02.2016
Сообщений: 10

Анализ графа

29.02.2016, 15:18. Показов 651. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. В ходе решения одной задачи появилась небольшая проблема.
У нас имеется граф представленный матрицей смежности (Вообще говоря граф отображает цепь элементов).В графе имеется две точки In - входа, Out - выхода, а также некоторое количество элементов Ei(вершины), соединенных последовательно или параллельно. Элементы Ei обладают некоторой характеристикой pi. При последовательном соединение нескольких элементов суммарная характеристика участка цепи P вычисляется как P = p1 * p2 * ... * pk. При параллельном как P = 1 - (1 - p1) * (1 - p2) *...* (1 - pk). Необходимо собственно посчитать P для всей цепи начиная с элемента In, заканчивая Out (Для In и Out p можно принять за 1).
Первая мысль которая пришла в голову вычленять из графа цепочки последовательных или параллельных элементарных соединений, просчитывать для них P и тем самым упрощать вид графа заменяя просчитанные цепочки единичными элементами. Но сложность такого метода неприемлемо велика.
Вторая мысль заключалась в построении по графу выражения типа:
P = E1(*)[E3(+)E4](*)E6(+)E2(*)E5, где (*) - последовательное соединение, а (+) параллельное и последующем его парсинге, с помощью сортировочной станции. Но тут проблемы с понимание реализации.
Если кто-то уже сталкивался с подобным, прошу не поленится и помочь, изложив хотя бы наброски алгоритма.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.02.2016, 15:18
Ответы с готовыми решениями:

Нахождение фактора графа и остова графа для некоторого произвольного графа (5-6 вершин)
Форумчане прошу помощь в выполнение задания по деск. мат. Задание: Нахождение фактора графа и остова графа для некоторого произвольного...

Создание графа по матрице и поиск кратчайшего пути из одного графа в другой
Доброго времени суток. Задали задание по матрице составить граф и написать функции 1 функция находит количество путей из графа допустим...

По заданной матрице смежности простого графа построить каркас этого графа с использованием поиска в ширину
Задание: заданно матрицу смежности простого графа. Построить каркас этого графа с использованием поиска вширь. Помогите написать...

11
 Аватар для ProgJ
90 / 87 / 11
Регистрация: 20.11.2008
Сообщений: 724
29.02.2016, 16:54
я не понял, у вас граф или последовательность элементов?
нужны примеры ваших графов
0
0 / 0 / 0
Регистрация: 29.02.2016
Сообщений: 10
29.02.2016, 17:06  [ТС]
Как я уже писал, работаем с матрицей смежности. Типичное представление графа может быть таким:
IN | 1 2
1 | 3 4
2 | 5
3 | 6
4 | 6
5 | OUT
6 | OUT
По сути алгоритм должен выполнять расчет надежности цепи:
https://ru.wikipedia.org/wiki/... 1%82%D0%B8
0
 Аватар для ProgJ
90 / 87 / 11
Регистрация: 20.11.2008
Сообщений: 724
29.02.2016, 20:04
Для этого примера надежность такая?
1-(1-P2P5)(1-P1(1-(1-P3)(1-P4))P6)

Добавлено через 18 минут
Но что-то не могу понять, как посчитать надежность, если в вашем графе добавить ребро 5-6
0
0 / 0 / 0
Регистрация: 29.02.2016
Сообщений: 10
01.03.2016, 11:09  [ТС]
Для моего примера формула указана верно. Теперь хотелось бы услышать, как автоматизировать просчет для произвольной цепи.
PS Как я понимаю ребро 5-6 добавлять нельзя.
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24
01.03.2016, 11:43
Задачу бы по-строже сформулировать.
Пусть, скажем, подан на вход куб, где противоположные две вершины In и Out.
In | 1 2 3
1 | 4 5
2 | 5 6
3 | 6 4
4 5 6 | Out
Каков ответ?
0
0 / 0 / 0
Регистрация: 29.02.2016
Сообщений: 10
01.03.2016, 12:16  [ТС]
Согласен нужна более строгая формализация. Думаю достаточным условием будет следующее утверждение: цепь поддается расчету, тогда и только тогда когда после конечного числа элементарных преобразований, ее можно свести к цепи из одного элемента. Под элементарными преобразованиями понимаются 2 следующих действия:
а) нахождение двух элементов i, j (строго не In или Out) для которых участок матрицы смежности выглядит так:
A | i
i | j
j | B
Замена его на
A | (i,j)
(i,j) | B
И пересчет p для (i,j).
б) нахождение двух элементов i, j для которых участок матрицы смежности выглядит так:
A | i j l1 l2 l3 ... lN
i | B
j | B
и замена его на
A | (i,j) l1 l2 ... lN
(i,j) | B
пересчет p для (i,j).

С помощью такого определения я изначально и собирался писать алгоритм, но асимптотика, как я уже упоминал будет неприемлемой.
0
 Аватар для ProgJ
90 / 87 / 11
Регистрация: 20.11.2008
Сообщений: 724
01.03.2016, 12:19
По-моему, тут должно быть ограничение вроде такого:
если в узел x сигнал поступает из нескольких узлов, то эти несколько узлов не могут слать сигнал больше никуда, кроме узла x
0
0 / 0 / 0
Регистрация: 29.02.2016
Сообщений: 10
01.03.2016, 12:24  [ТС]
Да скорее всего это необходимое условие, но вот о достаточности не уверен. Полагаю, что предложенная мной формализация нагляднее отражает суть процесса.
0
 Аватар для ProgJ
90 / 87 / 11
Регистрация: 20.11.2008
Сообщений: 724
02.03.2016, 16:51
Посидел пару дней, вот, что получилось (на Lua)
Ruby
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
--  Расчёт надёжности цепи от [email]program48@gmail.com[/email]
--  [url]https://www.cyberforum.ru/algorithms/thread1673501.html[/url]
 
--  исходные данные
local data=[[
IN | 1 2
1 | 3 4
2 | 5
3 | 6
4 | 6
5 | OUT
6 | OUT
]]
 
local points={} --  узлы
 
local parallel=function(p1,p2)
    return (p1=='1' or p2=='1') and '1' or ('(1-(1-%s)*(1-%s))'):format(p1,p2)
end
 
local sequence=function(p1,p2)
    return p1=='1' and p2 or p2=='1' and p1 or p1..'*'..p2
end
 
--  Основная функция расчёта надёжности
--[[    a   --  узел
            P0  --  надёжность линии до узла a
            возвращаем надёжность до конца линии и следующий после линии узел (к которому соединяются другие параллельные линии)
]]
local function calcP(a,P0)
    P0=sequence(P0,a.P)
 
    if #a.outs==0 then  --  если у a нет выходов, то это OUT
        return P0
    end
 
    if #a.outs==1 then  --  если у a только один выход
        local bPointName=a.outs[1]
        local b=points[bPointName]
        if b.freeInCount==1 then    --  если у b только один вход (или уже все входы объеденены)
            return calcP(b,P0)
        else    --  если в b входит не только a, то линия окончена
            return P0,b
        end
    else    --  обработка ветвления
        local linesCount=#a.outs
 
        local linesByFinish={}  --  линии сгруппированные по узлам, в которые они входят
        --  каждый выход из a образует линию
        for id,outName in ipairs(a.outs) do
            local out=points[outName]
            linesByFinish[out]={
                P='1'--  Надёжность этой линии до узла out
            }
        end
 
        repeat
            local newLBF={}
            local calcWas
            --  продолжаем расчёт каждой линии отдельно
            for finish,lbf in pairs(linesByFinish) do
                local P
                if finish.freeInCount==1 then   --  продолжаем расчёт, только если у узла finish все другие входы реализованы
                    P,finish=calcP(finish,lbf.P)
                    calcWas=true
                else
                    assert(finish.freeInCount==0,'Такого не должно быть')
                    P=lbf.P
                end
                local newlbf=newLBF[finish]
                if newlbf then  --  если линия к узлу finish уже есть, то объединяем эти параллельные линии
                    finish.freeInCount=finish.freeInCount-1
                    newlbf.P=parallel(newlbf.P,P)
                    linesCount=linesCount-1
                else    --  иначе новая линия
                    newlbf={
                        P=P,
                    }
                    newLBF[finish]=newlbf
                end
            end
            linesByFinish=newLBF
 
            assert(calcWas,'не было расчета')
 
            --  если все линии свелись к одному элементу, выходим
            if linesCount==1 then
                local b,lbf=next(linesByFinish)
                P0=sequence(P0,lbf.P)
 
                if b.freeInCount==1 then    --  если у b только один вход или уже все входы объеденены (последовательное присоединение b)
                    return calcP(b,P0)
                else    --  если в b входит не только a, то линия окончена
                    return P0,b
                end
            end
        until false
    end
end
 
--  заполняем таблицу узлов, входы и выходы
for startTxt,finishTxt in data:gmatch'([^|\n]+)|([^|\n]+)' do
    for start in startTxt:gmatch'%S+' do
        if not points[start] then
            points[start]={ins={},outs={}}
        end
        for finish in finishTxt:gmatch'%S+' do
            if not points[finish] then
                points[finish]={ins={},outs={}}
            end
            table.insert(points[start].outs,finish)
            table.insert(points[finish].ins,start)
        end
    end
end
 
for name,point in pairs(points) do
    point.freeInCount=#point.ins    --  запоминаем количество нереализованных входов в каждый узел
    point.name=name
    point.P='P'..name
end
 
--  получаем ответ
print(calcP(points.IN,'1'))
1
0 / 0 / 0
Регистрация: 29.02.2016
Сообщений: 10
02.03.2016, 18:41  [ТС]
Спасибо, за проделанную работу. Сейчас изучаю ваш алгоритм и пока некоторые участки код не очень понятны (ввиду незнания синтаксиса, судя по всему). Буду рад, если поясните:
1) Тут непонятно почему происходит досрочный выход из функции и почему return возвращает 2 аргумента
Ruby
1
2
        else    --  если в b входит не только a, то линия окончена
            return P0,b
2) Тут опять же не совсем прозрачно, как работает цикл и в частности, как строится массив linesByFinish
Ruby
1
2
3
4
5
6
 for id,outName in ipairs(a.outs) do
            local out=points[outName]
            linesByFinish[out]={
                P='1',  --  Надёжность этой линии до узла out
            }
        end
Ну а остальное, полагаю, прояснится после того, как получу ответ на вопросы.
0
 Аватар для ProgJ
90 / 87 / 11
Регистрация: 20.11.2008
Сообщений: 724
03.03.2016, 09:17
Цитата Сообщение от chezare13 Посмотреть сообщение
1) Тут непонятно почему происходит досрочный выход из функции и почему return возвращает 2 аргумента
Выход, потому что линия кончилась, а функция вычисляет надёжность линии. Функция рекурсивная, и выход произойдёт в точку, где линия родилась, где началось ветвление. Здесь линии в конце концов объединяться, и тогда алгоритм обратится к узлу перед которым линия остановилась
В Lua можно возвращать несколько аргументов
Цитата Сообщение от chezare13 Посмотреть сообщение
как строится массив linesByFinish
По сути это набор пар (узел, надёжность до него). Тут можно было бы сделать короче
Ruby
1
linesByFinish[out]='1'  --  Надёжность этой линии до узла out
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2016, 09:17
Помогаю со студенческими работами здесь

Выполнить обход в ширину неориентрованного графа, начиная с заданной вершины. Способ представления графа – матрица инциденций
Буду очень благодарен, если поможете Выполнить обход в ширину неориентированного графа, начиная с заданной вершины. Способ...

Обход графа в ширину для определения всех вершин графа, находящихся на фиксированном расстоянии от данной вершины
Реализуйте обход графа в ширину для определения всех вершин графа, находящихся на фиксированном расстоянии d от данной вершины. HELP

Анализ ценных бумаг (построить Гистограмму и провести анализ)
Здравствуйте! Помогите пожалуйста разобраться с заданием. Для исходных данных нужно определить влияние даты покупки ценной бумаги...

Анализ сетевого трафика используя регрессионный анализ
Не знал, куда написать, MatLAb очень близок этому инструменту (Weka) Многие в курсе, что из сетевого пакета можно достать 41 атрибут для...

Найти все вершины графа, к которым существует путь заданной длины от выделенной вершины графа
Написать программу на prologuse на русском языке как на примере(Определить, является ли связным заданный граф.)


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru