powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / СРОЧНО ПОМОГИТЕ С ГРАФОМ
10 сообщений из 10, страница 1 из 1
СРОЧНО ПОМОГИТЕ С ГРАФОМ
    #32463129
trubicyn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди ничего не могу поделать с промблемой изображения графа на плоскости
Надо ЛЮБОЙ граф нарисовать с минимальным колвом пересечений ребер
Задача очень не простая кто хоть чем то может помочь сделайте это пожалуйста.
...
Рейтинг: 0 / 0
СРОЧНО ПОМОГИТЕ С ГРАФОМ
    #32463206
Дмитрий Валуев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это к RatTail
...
Рейтинг: 0 / 0
СРОЧНО ПОМОГИТЕ С ГРАФОМ
    #32464462
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то данная задача насколько я помне не имеет оптимального алгоритма и вычислительно очень сложная, а для больших графов и вовсе практически неразрешима :-(
...
Рейтинг: 0 / 0
СРОЧНО ПОМОГИТЕ С ГРАФОМ
    #32464778
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Граф укладывается на плоскость (без пересечений) тогда и только тогда, когда не имеет в качестве подграфов пятиконечной звезды или еще какого-то графа, сейчас не помню какого именно, что-то на шести вершинах по-моему, пусть он называется Z. Если их нет, то алгоритм полиномиальный, по-моему даже не кубический, и относительно простой в реализации, есть в большинстве книг по теории графов. По алгоритму понятно как именно строить граф на плоскости.

Если звезда или Z есть, то вопрос о минимизации пересечений может быть сложным, но это вряд ли, скорее громоздкий. Если достаточно приближеннго решения, то можно сначала постороить укладку графа с исключенными звездами и Z-ами, а потом добавить их, предварительно минимизировав пересечения внутри каждого.
...
Рейтинг: 0 / 0
СРОЧНО ПОМОГИТЕ С ГРАФОМ
    #32465581
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под "пятиконечной звездой" подразумевается полный 5-граф, т.е. 5 вершин, соединённые всеми возможными рёбрами.

Второй граф "три домика-три колодца", т.е. три вершины, связанные каждая с каждой из вторых трёх вершин.
...
Рейтинг: 0 / 0
СРОЧНО ПОМОГИТЕ С ГРАФОМ
    #32466267
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Ой Вэй

Да, конечно ты прав, полный граф на пяти вершинах. Я ошибся, звезда разводится элементарно. Поленился нарисовать, хотя были большие сомнения насчет звезды, а точную формулировку давно забыл.
...
Рейтинг: 0 / 0
СРОЧНО ПОМОГИТЕ С ГРАФОМ
    #32474129
Valer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть готовая программ
NEATO
качается с сайта производителя
разраб Bell lab FREE + исходники + дока
на входе текст файл с описанием графа
на выходе графический файл
для бесплатного очень неплохо
...
Рейтинг: 0 / 0
СРОЧНО ПОМОГИТЕ С ГРАФОМ
    #32524398
Фотография Купер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Валуев;

Я, кстати, тот ламерский подход (по поиску базовых циклов в плоском графе)
выбросил нах. Сделал, типа, по науке: сначала находим любое покрывающее
дерево, затем добавляем в дерево, по одному, каждое из не попавших в дерево
ребер и выделяем/записываем возникающий цикл; потом убираем взад это ребро
и добавляем к дереву следующее "висячее" ребро и т.д.

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

Впрочем, легко сказать - трудно сделать. Присоединяйся!

Код: plaintext
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.
if object_id('tempdb..#f')> 0  drop table #f
if object_id('tempdb..#g')> 0  drop table #g
if object_id('tempdb..#h')> 0  drop table #h
if object_id('tempdb..#t')> 0  drop table #t
GO
create table #f(n int, v1 int, v2 int)
GO
insert into #f (v1, v2)
select  1 ,  2  union all
select  1 ,  3  union all
select  1 ,  7  union all
select  2 ,  3  union all
select  2 ,  10  union all
select  3 ,  4  union all
select  3 ,  5  union all
select  4 ,  5  union all
select  4 ,  6  union all
select  5 ,  8  union all
select  5 ,  10  union all
select  6 ,  7  union all
select  6 ,  8  union all
select  7 ,  9  union all
select  8 ,  9  union all
select  8 ,  10  union all
select  9 ,  10 
GO
update #f set n=(select count(*) from #f f
where (f.v1=#f.v1 and f.v2<=#f.v2) or f.v1<#f.v1)
GO
select * into #g from #f where n= 1 
delete from #f where n= 1 
select i=null, * into #h from #f where  0 = 1 
select * into #t from #f where  0 = 1 
GO
declare @i int, @j int, @n int, @s varchar( 800 )

while  0 = 0 
begin
select @n=min(n) from #f where
(v1 in (select v1 from #g union all select v2 from #g) and
v2 not in (select v1 from #g union all select v2 from #g))
or
(v2 in (select v1 from #g union all select v2 from #g) and
v1 not in (select v1 from #g union all select v2 from #g))
if @n is null break
insert into #g select * from #f where n=@n
delete from #f where n=@n
end

set @i= 1 
while  0 = 0 
begin
truncate table #t
insert into #t select * from #f where n=(select min(n) from #f)
if @@rowcount= 0  break
insert into #t select * from #g
delete from #f where n=(select min(n) from #f)
while  0 = 0 
begin
delete from #t where v1 in
(select v from (select v=v1 from #t union all select v2 from #t)z
group by v having count(*)= 1 )
or v2 in
(select v from (select v=v1 from #t union all select v2 from #t)z
group by v having count(*)= 1 )
if @@rowcount= 0  break
end
insert into #h select @i, n, v1, v2 from #t
set @i=@i+ 1 
end

set @j= 1 
while @j<=@i- 1 
begin
set @s=''
select @s=@s+'('+cast(v1 as varchar( 2 ))+' '+cast(v2 as varchar( 2 ))+')'
from #h where i=@j
print cast(@j as char( 4 ))+@s
set @j=@j+ 1 
end

 1    ( 2   3 )( 1   3 )( 1   2 )
 2    ( 4   5 )( 3   4 )( 3   5 )
 3    ( 5   10 )( 1   3 )( 2   10 )( 3   5 )( 1   2 )
 4    ( 6   7 )( 1   3 )( 1   7 )( 3   4 )( 4   6 )
 5    ( 6   8 )( 3   4 )( 3   5 )( 4   6 )( 5   8 )
 6    ( 8   9 )( 1   3 )( 1   7 )( 3   5 )( 5   8 )( 7   9 )
 7    ( 8   10 )( 1   3 )( 2   10 )( 3   5 )( 5   8 )( 1   2 )
 8    ( 9   10 )( 1   7 )( 2   10 )( 1   2 )( 7   9 )
...
Рейтинг: 0 / 0
СРОЧНО ПОМОГИТЕ С ГРАФОМ
    #32525528
Дмитрий Валуев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Купер
Спасибо за приглашение. Присоединяюсь
Если вести речь о более общей задаче - дать наглядное изображение графа на плоскости, то критерий минимума числа пересечений ребер является одной из возможных формализаций понятия "наглядности".
Возможны и другие. Например, минимум длины размещения в задаче вложения графа в целочисленную решетку. Вкратце: каждой вершине i графа поставить в соответствие точку с целочисленными координатами (xi,yi) так, что бы функционал
L=SUM((|xi-xj|+|yi-yj|)*Cij)
имел минимальное значение. Поскольку эту тему я знаю лучше, чем планарность, я решал бы так.
Но в некоторых случаях это действительно разные задачи, а не разные способы формализации одной. Например, в радиоэлектронике при проектировании многослойных схем следует стремиться к минимуму числа пересечений, так как это сокращает число слоев. А при проектировании схемы с проводными соединениями следует стремиться к минимуму суммарной длины соединений, так как это приводит к повышению помехоустойчивости.
Удачи
...
Рейтинг: 0 / 0
СРОЧНО ПОМОГИТЕ С ГРАФОМ
    #32525826
Фотография Купер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дим,
Короче, на сверх-общие случаи замахиваться, видимо, не стоит (типа,
нарисовать "понагляднее" проекцию на плоскость всяких там "октаэдров" и т.п.).

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

Но, я думаю, надо сначала научиться рисовать дерево. Я мыслю это дело так:
берем любое ребро дерева и рисуем его как палочку длиной 100 (и любой ориентации);
потом смотрим: от конца А этого ребра отходит 3 других ребра;
значит, теперь рисуем 3 палочки, но уже каждую длиной 10 и с углами между ними,
равными 360гр./3=120гр.
и т.д. и т.д.; тока надо следить, чтобы эти палочки нигде не пересекались с соседями.

Вот такие у меня мысли a la Манилов-программизд.......
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / СРОЧНО ПОМОГИТЕ С ГРАФОМ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]