2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Создание программы, которая исследует заданный граф.
Сообщение24.12.2014, 02:16 


24/12/14
2
Здравствуйте!
Для дипломной работы нужна программа, которая по заданному графу выводила бы необходимую информацию о ней, например,
кратчайшие пути между вершинами, все циклы, компоненты связности и т.п.

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

Хотелось бы все это обернуть в красивое графическое приложение, которое может:
1) Задавать граф с помощью мышки (тыкаешь на поле, а там появляется вершина, тыкаешь на две вершины - прорисовывается ребро между ними)
2) Визуализировать результат:
а) например: есть список циклов, нажимаешь на один из них, тогда этот цикл рисуется на экран (например, окрашивается в другой цвет поверх самого графа)
b) выбираешь две вершины, нажимаешь на кнопку "Кратчайший Путь" и этот путь выводится на экран.
3) Редактировать граф - возможность добавить/удалить вершину/ребро
...

Вы, наверное, поняли что я хочу.
Предпочитаемый язык С++.
От Вас хочется совета, какие средства лучше всего справятся с данной задачкой?
Какая среда разработки, может, какие библиотеки, что угодно.
Жду Ваши мудрые ответы=)

 Профиль  
                  
 
 Re: Создание программы, которая исследует заданный граф.
Сообщение24.12.2014, 04:50 
Аватара пользователя


20/10/12
308
А диплом по матеметике или по программированию?

Если по математике, то программные трюки особенно не нужны. Графы можно нарисовать с использованием готовых средств визуализации или просто руками.

Если по программированию, то написать полноценную оконную программу к февралю не удастся. Такая программа должна обрабатывать уйму разных сообщений от пользователя и от системы. Например, пользователь решит изменить стандартные цвета, а система сообщит вам об этом. По-хорошему, надо внести изменения и перерисовать экран. А другой пользователь захочет вставить окно вашей программы в текстовый документ. И вот, на бедного программиста свалилась задача написания взаимодействия между двумя приложениями. Я даже не помню, как такое взаимодействие нынче называется.

Различные оконные библиотеки особенно не помогают. Понимать интерфейс низкого уровня нужно в любом случае. А если хочется написать что-нибудь переносимое между несколькими разными системами, то без щедрого использования оператора #if такие проекты пока не обходятся.

 Профиль  
                  
 
 Re: Создание программы, которая исследует заданный граф.
Сообщение24.12.2014, 14:25 
Аватара пользователя


22/09/09

1907
Я делал подобную программу на Delphi-7. В ней нет ничего сложного. Никакого низкого уровня не требуется, более чем достаточно стандартных компонентов Delphi. Для С++, думаю, будет достаточно стандартного набора из MS Visual Studio. Нужно запоминать координаты точки, соответствующей каждой вершине графа, и номер этой вершины. Приемы рисования есть в любом учебнике по программированию GUI. Неудобством для пользователя может быть отрисовка слишком большого графа - более 50 вершин. Если обойтись минимумом команд редактирования - добавить/удалить вершину/ребро, без изменения масштаба, поворотов и т.д., то 2-4 недели на такую программу вполне достаточно. Взаимодействие приложений по COM тоже нетрудно сделать, но ИМХО это будет излишество.

 Профиль  
                  
 
 Re: Создание программы, которая исследует заданный граф.
Сообщение24.12.2014, 21:48 


24/12/14
2
Sphinx Pinastri в сообщении #951442 писал(а):
А диплом по матеметике или по программированию?

Если по математике, то программные трюки особенно не нужны. Графы можно нарисовать с использованием готовых средств визуализации или просто руками.


По математике. Я на кафедре высшей математики.
Научник этого всего не требует, это моя собственная инициатива, создать такую программу.
Время есть, мне надо не к февралю, а к концу учебного года, в апреле-мае.

-- 24.12.2014, 21:56 --

bin в сообщении #951545 писал(а):
Неудобством для пользователя может быть отрисовка слишком большого графа - более 50 вершин. Если обойтись минимумом команд редактирования - добавить/удалить вершину/ребро, без изменения масштаба, поворотов и т.д., то 2-4 недели на такую программу вполне достаточно. Взаимодействие приложений по COM тоже нетрудно сделать, но ИМХО это будет излишество.


Насчет этого у меня есть идеи. В этом семестре был курс по цифровым обработкам изображений. Изучали opencv. Более-менее в нём ориентируюсь.
Хочу, чтобы по рисунку (от руки или уже готовое изображение) подпрограмма на opencv оцифровывала данный граф.
Думаю, это вполне можно реализовать. Тогда необходимости рисовать большие графы в самой программе не будет. Достаточно будет нарисовать на листочке данный граф,
сделать фото, потом загрузить это фото в программу, а он сам оцифрует этот граф.

Как думаете насчет Qt C++ ?
Может мне это подойдет?

 Профиль  
                  
 
 Re: Создание программы, которая исследует заданный граф.
Сообщение24.12.2014, 22:14 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
stepanovep в сообщении #951721 писал(а):
Тогда необходимости рисовать большие графы в самой программе не будет. Достаточно будет нарисовать на листочке данный граф, сделать фото, потом загрузить это фото в программу, а он сам оцифрует этот граф.
ИМХО, вы нацелились на что-то гораздо более крутое, чем полагали поначалу.

 Профиль  
                  
 
 Re: Создание программы, которая исследует заданный граф.
Сообщение25.12.2014, 00:41 
Аватара пользователя


22/09/09

1907
stepanovep в сообщении #951721 писал(а):
Хочу, чтобы по рисунку (от руки или уже готовое изображение) подпрограмма на opencv оцифровывала данный граф.
Думаю, это вполне можно реализовать. Тогда необходимости рисовать большие графы в самой программе не будет. Достаточно будет нарисовать на листочке данный граф,
сделать фото, потом загрузить это фото в программу, а он сам оцифрует этот граф.
Я сделал похожий плагин к своей программе для оцифровки типографских изображений графов. Рисунки от руки цифровать сложнее - ср. оцифровка печатного и рукописного текста, если, конечно, это не чертеж по линейке. Не по размеру, но по сложности разработки этот плагин сильно превосходит саму программу редактирования графов. Притом, что применяю известные и зарекомендовавшие себя алгоритмы распознавания - нпр., преобразование Хафа для отрезков прямых. Практика показывает, что на экране графы рисовать быстрее и удобнее, чем на бумаге. Я сказал, что граф в 50 и более вершин будет рисовать не просто, могу добавить, что на бумаге такой рисунок сделать еще сложнее. Для больших графов полезно менять масштаб, иметь неограниченный холст и т.д. Плагин распознавания графов я иногда применяю для задач типа: в статье приведена выборка из рисунков нескольких сотен графов. Распознать будет быстрее, чем перерисовать на экране. Возникают такие задачи нечасто, и я не советую реализовывать их в дипломной работе, т.к. многие ИМХО не поймут зачем такие излишества. Если осталось свободное время, лучше потратить его на всем понятное и впечатляющее. Реализуйте трудный по вычислительной сложности графовый алгоритм, нпр., поиск максимальной клики, и удивите тем, как быстро работает Ваша реализация. Выше Вы сказали:
stepanovep в сообщении #951434 писал(а):
Но я умею программировать только процедурно, максимум могу вывести информацию в txt файл или на консоль.
Вот и сделайте сначала простейший редактор. Нпр., Вы уже знаете как сделать?:
stepanovep в сообщении #951434 писал(а):
тыкаешь на поле, а там появляется вершина
и как сделать: "тыкаешь на ребро и оно удаляется"? ;-) Надо идти от простого к сложному, иначе никакого времени Вам может не хватить.

 Профиль  
                  
 
 Re: Создание программы, которая исследует заданный граф.
Сообщение11.01.2015, 20:22 


30/08/10
159
Советую взглянуть на "Граф друзей", или просто посмотреть, с помощью чего он сделан. Там тоже визуализируется граф. Платформа вроде JS или что-то другое, но браузерное. Узлы добавляются, удаляются, расталкиваются красиво. Думаю, что для описанной цели лучше найти готовую библиотеку, чем писать свою.

 Профиль  
                  
 
 Re: Создание программы, которая исследует заданный граф.
Сообщение12.01.2015, 11:15 


01/12/11

1047
Познакомьтесь, как подготавливаются для вывода графики в MathCad. Идея простая для реализации без привлечения сторонних программ. Выводимый на дисплей рисунок описывается матрицей рисунка. Элемент матрицы - пиксель. Задавая цвет пикселям, можно нарисовать любую картинку.
Например. Имеется матрица графа и координаты вершин. В матрице рисунка закрашиваем пиксели, соответсвующие координатам вершин. Координаты вершин соединяем закрашенными пикселями, образующими прямые. Добавив действия мышки, можно изменять конфигурацию графа.
Матрица рисунка соответствует формату $.bmp$.

 Профиль  
                  
 
 Re: Создание программы, которая исследует заданный граф.
Сообщение20.01.2015, 16:34 


11/12/14
893
В своё время в институте делал на дельфи подобное, работа тоже была с графами, вышел целый редактор.
Несмотря на то что в сущности простенький, несмотря на "формошлёпную" сущность Delphi, работа над этим редактором по части программирования вышла в разы больше, чем собственно решаемая мат-задача.
Однако да, всё писалось с нуля и было достаточно продвинутым, и потом еще служило весомым бонусом к программистской сущности специальности.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: mihaild


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group