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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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