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

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

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

Да, конечно ты прав, полный граф на пяти вершинах. Я ошибся, звезда разводится элементарно. Поленился нарисовать, хотя были большие сомнения насчет звезды, а точную формулировку давно забыл.
...
Рейтинг: 0 / 0
08.04.2004, 16:56
    #32474129
Valer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СРОЧНО ПОМОГИТЕ С ГРАФОМ
есть готовая программ
NEATO
качается с сайта производителя
разраб Bell lab FREE + исходники + дока
на входе текст файл с описанием графа
на выходе графический файл
для бесплатного очень неплохо
...
Рейтинг: 0 / 0
19.05.2004, 16:32
    #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
20.05.2004, 11:20
    #32525528
Дмитрий Валуев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СРОЧНО ПОМОГИТЕ С ГРАФОМ
Купер
Спасибо за приглашение. Присоединяюсь
Если вести речь о более общей задаче - дать наглядное изображение графа на плоскости, то критерий минимума числа пересечений ребер является одной из возможных формализаций понятия "наглядности".
Возможны и другие. Например, минимум длины размещения в задаче вложения графа в целочисленную решетку. Вкратце: каждой вершине i графа поставить в соответствие точку с целочисленными координатами (xi,yi) так, что бы функционал
L=SUM((|xi-xj|+|yi-yj|)*Cij)
имел минимальное значение. Поскольку эту тему я знаю лучше, чем планарность, я решал бы так.
Но в некоторых случаях это действительно разные задачи, а не разные способы формализации одной. Например, в радиоэлектронике при проектировании многослойных схем следует стремиться к минимуму числа пересечений, так как это сокращает число слоев. А при проектировании схемы с проводными соединениями следует стремиться к минимуму суммарной длины соединений, так как это приводит к повышению помехоустойчивости.
Удачи
...
Рейтинг: 0 / 0
20.05.2004, 12:50
    #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]