Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Генерация кубических графов / 6 сообщений из 6, страница 1 из 1
25.02.2011, 20:43
    #37136874
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация кубических графов
Гуглил, гуглил, нашел только на англицком Гуннара Брикмана и его соавтора статью - очень конспективно + в англицком не силен. Хочется более подробно на русском + не мешело бы какой-нить исходник программы (не важно на каком языке)

Спасибо
...
Рейтинг: 0 / 0
25.02.2011, 21:40
    #37136939
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация кубических графов
kmaw,

Представь себе обыкновенное пятимерное пространство. Потом уменьши до 3х-мерного )))

Преобразования/упрощения схемы нетривиальны. А само представление - чепуха.
...
Рейтинг: 0 / 0
26.02.2011, 03:24
    #37137162
Algol36
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация кубических графов
kmaw,

Код: 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.
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.
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication67
{
    class Program
    {
        static void Main(string[] args)
        {
            //число вершин
            int size = 8;
            //необходимое число единиц в врехнем треугольнике матрицы смежности
            int count = size * 3 / 2;
            //создаем матрицу смежности
            SymmetricalMatrix matrix = new SymmetricalMatrix(size);
            //находим всевозможные кубические графы
            int matrixCount = 0;
            foreach (SymmetricalMatrix m in Build(count, -1, matrix))
            {
                matrixCount++;
                Console.WriteLine("Matrix #"+matrixCount + ": ");
                Console.WriteLine(m);
            }
            //
            Console.WriteLine("Found "+ matrixCount+" graphs");
            Console.ReadLine();
        }

        static IEnumerable<SymmetricalMatrix> Build(int count, int prev, SymmetricalMatrix m)
        {
            if (count <= 0)
            {
                //матрица корректна ?
                if (m.IsCubicGraphMatrix())
                    yield return m;
            }
            else
            {
                for (int i = prev + 1; i <= m.data.Length - count; i++)
                {
                    //ставим единицу в позицию i
                    m.data[i] = 1;
                    //идем к следующему столбцу
                    foreach (var next in Build(count - 1, i, m))
                        yield return next;
                    //удаляем единицу из позиции i
                    m.data[i] = 0;
                }
            }
        }
    }

    //симметричная бинарная матрица, с нулями по диагонали
    public class SymmetricalMatrix
    {
        public readonly int size;
        //верхний треугольник
        public readonly byte[] data;        

        public SymmetricalMatrix(int size)
        {
            this.size = size;
            data = new byte[(size*size - size)/2];
        }

        public int indicesToDataIndex(int i, int j)
        {
            int k = i + 1;
            int l = (k * k + k) / 2;
            return i*size + j - l;
        }

        byte this[int i, int j]
        {
            get{
                if (i == j)
                    return 0;
                
                if(i<j)
                    return data[indicesToDataIndex(i, j)];
                else
                    return data[indicesToDataIndex(j, i)];
            }
        }

        //это действительно корректная матрица смежности для кубического графа ?
        public bool IsCubicGraphMatrix()
        {
            //считаем суммы по столбцам, они должны быть все равны 3
            for(int i=0;i<size;i++)
            {
                int sum = 0;
                for(int j=0;j<size;j++)
                {
                    if(this[i, j]!=0)
                        sum++;
                }
                if(sum!=3) return false;
            }

            return true;
        }

        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < size; j++)
            {
                for (int i = 0; i < size; i++)
                    sb.Append(this[i, j]);
                sb.AppendLine();
            }
            return sb.ToString();
        }
    }
}
...
Рейтинг: 0 / 0
26.02.2011, 09:27
    #37137197
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация кубических графов
спасибо!
...
Рейтинг: 0 / 0
26.02.2011, 12:19
    #37137295
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация кубических графов
но это полный перебор всех графов. а можно более целенаправленную генерацию? чтобы по построению граф был кубическим?
...
Рейтинг: 0 / 0
26.02.2011, 12:22
    #37137297
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация кубических графов
Siemarglkmaw,

Представь себе обыкновенное пятимерное пространство. Потом уменьши до 3х-мерного )))

Преобразования/упрощения схемы нетривиальны. А само представление - чепуха.

я не настолько гуд знаю математику, чтобы понять ваше высказывание без доп. комментариев - можно для чайника, попроще?
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Генерация кубических графов / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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