Тестирование программы - Пензенский государственный

advertisement
Журнал «Теория и практика имитационного моделирования и создания тренажеров», выпуск 1, 2015
УДК 681.51.015
Люсев А.В., Щербань А.Б.
РЕАЛИЗАЦИЯ ВОЛНОВОГО АЛГОРИТМА ПОИСКА ИЗОМОРФНОГО
ОТОБРАЖЕНИЯ ГРАФОВ
Пензенский государственный технологический университет
Аннотация
Рассматривается программа реализации волнового алгоритма установления
эквивалентности структурной связности для решения задач IS-анализа. Приводятся
результаты тестирования программы.
Ключевые слова: структурная идентификация, изоморфизм, изоморфные графы,
идентификационно-структурный анализ.
Losev A.V., Shcherban A.B.
IMPLEMENTATION OF THE WAVE ALGORITHM FOR FINDING ISOMORPHIC
GRAPHS DISPLAY
Penza State Technological University
Abstract
Describes the program implementation of the wave algorithm for the equivalence of
structural connectivity to solve problems IS analysis. The results of the testing program.
Keywords: Structural identification, isomorphism, isomorphic graphs, identificationstructural analysis.
Структурный подход к формализации описания сложных систем предоставляет
возможности формализации процесса принятия целесообразных решений по
управлению на основе идентификации структурных моделей состояний систем в
пространстве структурных моделей управляющих воздействий (IS-анализ) [1-3,6,8].
Поэтому одной из важнейших задач стоящих на пути реализации структурного
подхода, наряду с задачей структурного моделирования, является задача формализации
понятия «эквивалентные структуры» и поиска эффективных формализованных
процедур установления «эквивалентности структурной связанности» [5,7].
Как показано в [4] модели IS-анализа формируются в терминах синтаксических
и семантических структурных моделей различных видов. Для обобщенной
формализации и анализа методов IS-анализа предлагаются графоаналитические модели,
являющиеся упрощенными вариантами синтаксических и семантических структурных
моделей. В терминах графоаналитических моделей задачи IS-анализа, в частности
задачи идентификации структурных моделей, могут быть сведены к задаче поиска
изоморфного отображения графов, реализация волнового алгоритма решения которой и
рассматривается в данной работе.
Обобщенное описание работы программы
Перед запуском и тестированием программы, необходимо составить матрицу
смежностей для графа «эталон» и для графа «эксперемент» и записать каждую в
Журнал «Теория и практика имитационного моделирования и создания тренажеров», выпуск 1, 2015
отдельный текстовый файл с произвольным названием (см. «Требования к файлам»).
Алгоритм идентификации работает со структурным представлением матриц
смежности графа. В программе описаны такие элементы как вершина и фигура. Фигура
представляет собой совокупность вершин. Вершина это структура со своим описанием
и связями (указателями) с другими вершинами этой фигуры.
Интерфейс программы представлен на рисунке 1. Имеющийся функционал:
 указание путей к файлам с матрицами смежности;
 выбор алгоритма сравнения;
 отчет о проведенном анализе.
С помощью кнопки «Обзор…» необходимо выбрать файлы эталонной и
экспериментальной матриц смежности графов, далее выбрать алгоритм сравнения
«полное совпадение» или «частичное совпадение» и нажать на кнопку «Сравнить»,
после чего программа выдаст сообщение о существовании изоморфного отображения
фигур (рисунок 2).
Рисунок 1 – Интерфейс программы
Журнал «Теория и практика имитационного моделирования и создания тренажеров», выпуск 1, 2015
Рисунок 2 – Сообщение о результате поиска изоморфного отображения
При выполнении алгоритма сравнения программа выдает информацию о графах
в окнах «Фигура эталона» и «Фигура эксперемента». В данных окнах, выводится
информация:
 имя фигуры;
 общее количество связей внутри фигуры;
 количество одинаковых вершин по степени связей, причем порядковому
номеру соответсвует колчиство связей вершины (например на рисунке представленно,
что фигура имеет 0 вершин с одной связью, 0 вершин с двумя связями и 8 вершин с 3мя связями).
В окне «результат сравнения» выводится информация о результате. Если выбран
алгоритм полного совпадения, то при условии полного совпадения, программа выдаст
какая вершина эталона в какаю вершину эксперемента отобразилась. Сам алгоритм
представляет из себя сравнение фронтов фигуры, относительно каждой вершины (см. р.
алгоритм сравнения).
При нажатии на кнопку «сравнить» происходят следующие операции:
1) Инициализация вершин из файла, причем 1 соответствует связи с i-й
вершиной, а 0 соответствует отсутствию связи с i-й вершиной.
2) Пстроение вектора индексов, в котором хранятся индексы одинаковых по
Журнал «Теория и практика имитационного моделирования и создания тренажеров», выпуск 1, 2015
связям первого уровня вершин фигуры, порядковому номре элемента вектора
соответствует количество связей первого уровня.
3) Сравнение фигур по количествую связей первого и второго уровня, если
хоть где-то не найдено совпадение вершин, на экран выдается сообщение о не
совпадение фигур, иначе, сообщение о совпадении фигур.
4) Сравнение фронтов фигуры для каждой вершины.
5) Если фигуры совпали, на диалоге появляется сообщение соответствия
вершин эталона, вершинам эксперементальной модели, а если фигуры не совпали,
сообщение «фигуры не совпали». При использовании алгоритма частичного
совпадения, в результат выводится количество совпавших волн для некоторых вершин
эатлона и эксперемента.
Описание алгоритма
Для наглядности описания алгоритма представлены рисунок 3 и 4. На них
показаны схемы составления фронта фигуры для одной вершины.
Рисунок 3 – Сообщение о результате поиска частично-изоморфного отображения
Журнал «Теория и практика имитационного моделирования и создания тренажеров», выпуск 1, 2015
Рисунок 4 – Фронт некоторой фигуры
Распишем волны начиная с первой вершины:
1) Из вершины 1 волна доходит до вершины 2, 4, 5, в сумме 3 вершины.
2) Из 2, 4, 5 в 3, 6, 7, что по количеству «зажженных» связей 6.
3) Из 3, 6, 7 в 8, что по количеству «зажженных» связей 3.
Таким образом фронт для вершины 1 фигуры представленной на рисунке 3
будет 3, 6, 3. Такие фронты составляются для каждой вершины фигуры и сравниваются
с каждым фронтом другой фигуры, для выявления полного совпадения, но для
выявления изоморфизма, достаточно совпадения по количеству вершин и совпадения
хотябы одного фронта.
Текст функции сравнения представлен ниже.
bool figure::ComparingAllFront(figure &temp_figure, std::vector<std::string> &vect_string)
{
// Сравнение индексов уровней
if (this->indexLevel.size() != temp_figure.indexLevel.size())
{
vect_string.push_back("Фигуры не совпали по колчеству одинаковых
вершин)");
return false;
}
for (int i = 0; i < indexLevel.size(); ++i)
{
if (this->indexLevel[i] != temp_figure.indexLevel[i])
{
vect_string.push_back("Фигуры
не
совпали
по
колчеству
одинаковых вершин)");
return false;
}
Журнал «Теория и практика имитационного моделирования и создания тренажеров», выпуск 1, 2015
}
std::string str, temp_str;
if (this -> peaksFigure.size() != temp_figure.peaksFigure.size())
{
vect_string.push_back("Фигуры не совпали по количеству вершин");
return false;
}
else
{
bool bSearch = false;
for (int i = 0; i < peaksFigure.size(); i++)
{
for (int j = 0; j < temp_figure.peaksFigure.size(); j++)
{
if
(SearchFront(this->peaksFigure[i],
temp_figure.peaksFigure[j]))
{
bSearch = true;
std::string str;
str = this->peaksFigure[i].namePeak;
str += "->";
str += temp_figure.peaksFigure[j].namePeak;
vect_string.push_back(str);
}
}
if (!bSearch)
{
vect_string.clear();
vect_string.push_back("Фигуры не совпали");
return false;
}
bSearch = false;
}
}
vect_string.push_back("Фигуры совпали!");
return true;
}
Текст функции создания фронта для фигуры из некоторой вершины:
void peak::CreateFront()
{
int volna = 0;
int front = 1;
this->frontValue = front;
std::vector<peak*> vectPeak, tempVectPeak;
vectPeak = this->connections;
while (!vectPeak.empty())
{
tempVectPeak = vectPeak;
Журнал «Теория и практика имитационного моделирования и создания тренажеров», выпуск 1, 2015
vectPeak.clear();
for (std::vector<peak*>::iterator iter = tempVectPeak.begin();
iter != tempVectPeak.end(); ++iter)
{
if ((*iter)->frontValue == 0 || (*iter)->frontValue == front)
{
if ((*iter)->frontValue == front)
{
volna++;
}
else
{
volna++;
(*iter)->frontValue = front;
for (std::vector<peak*>::iterator subIter = (*iter)>connections.begin();
subIter != (*iter)->connections.end(); ++subIter)
{
if ((*subIter)->frontValue == 0)
{
vectPeak.push_back(*subIter);
}
}
}
}
}
if (volna != 0)
{
this->vectFront.push_back(volna);
volna = 0;
}
front++;
}
}
Требования к файлам
1) В файле находится только матрица смежности.
2) Матрица смежности квадратная.
3) Значения вектора – строки отделены символом пробел.
4) Вектора – строки отделены друг от друга символом перехода на другую
строчку.
5) На главной диагонали матрицы находятся «0».
6) Матрица симметрична относительно главной диагонали.
Диаграмма классов
На рисунке 5 представлена диаграмма классов, в программе существует 2
класса(не считая интерфейса) оперируя которыми составлено ядро программы.
Описание переменных класса «peak»:
_name_peak – имя вершины
_connections – вектор указателей на вершины(это и есть связи)
_sovpadenie – флаг, для отбрасывания лишних итераций первого уровня
Журнал «Теория и практика имитационного моделирования и создания тренажеров», выпуск 1, 2015
_sovpadenie2 – флаг для отбрасывания лишних итераций второго уровня
_peak(void) – конструктор класса
_peak(std::string&) – конструктор класса с начальным именем
operator =(peak&) – перегрузка оператора «=» для адекватного присвоения
SovpadenieSbros() – функция сброса флага _sovpadenie2 во всех связях 2-го уровня этой
вершины
~peak(void) – деструктор класса (пустой)
Описание переменных класса «figure»
_name_figure – имя фигуры
_max_connections – максимальное количество связей в вершине данной фигуры
_peaks – вектор вершин фигуры (каждый элемент типа «peak»)
_index_level – вектор векторов индексов вершин в фигуре с одинаковыми связями
figure(void) – конструктор класса
figure(std::string&) – конструктор класса с указанием имени фигуры
Init(std::fstream&) – функция инициализации фигуры
Comparing(figure&, std::vector<&, std::string>&) – функция сравнения двух фигур
~figure – деструктор класса(пустой)
CreateIndexLevel() – функция создания вектора векторов индексов вершин с
одинаковыми значениями соединений первого уровня.
SearchPeak(peak&, std::vector<int>&, std::string&) – поиск вершины которая передается
первым параметром в данную функцию, искаться будет по индексам вектора который
передается вторым параметром, и в третий параметр будет записываться название
вершины если найдется такая вершина.
class Class Model
figure
peak
+
+
+
+
_index_level: std::vector<std::vector<int>>
_name_figure: std::string
_peaks: std::vector<peak>
_max_connections: int
+
+
+
+
+
-
figure(void)
figure(std::string&)
Init(std::fstream&) : void
Comparing(figure&, std::vector<std::string>&) : bool
~figure(void)
CreateIndexLevel() : void
SearchPeak(peak&, std::vector<int>&, std::string&) : bool
+
+
+
+
_name_peak: std::string
_connections: std::vector<peak*>
_sovpadenie: bool
_sovpadenie2: bool
+
+
+
+
+
peak(void)
peak(std::string&)
operator =(peak&) : void
SovpadenieSbros() : void
~peak(void)
Рисунок 5 – Диаграмма классов
Тестирование программы
Программа была протестирована на нескольких фигурах, представленных ниже
в картинках (рисунки 6). Самой проблемной фигурами являются конверты, которые
имеют одинаковое количество вершин, каждая из которых имеет одинаковое
количество связей. Ни одна из представленных ниже фигур не является изоморфной
другой представленной фигуре ниже. Для тестирования на существование изоморфного
отображения, были взяты те же фигуры, только матрица смежности строилась из
разных вершин, после чего программа выдавала соответствие вершин.
Журнал «Теория и практика имитационного моделирования и создания тренажеров», выпуск 1, 2015
Рисунок 6 – Тестирование программы на фигурах
Библиографический список
1. Михеев М.Ю., Щербань А.Б. Ситуационно-структурный подход к анализу
информационных объектов. Известия высших учебных заведений. Поволжский регион.
2006. № 6. С. 128.
2. Щербань А.Б. Структурно-синтаксический подход поиску альтернатив
управления сложными системами / А.Ф. Зубков, А.Б. Щербань, И.А.Семенов// Научно–
технические ведомости Санкт–Петербургского государственного политехнического
университета. Информатика. Телекоммуникации. Управление. 2010. № 3. С. 45.
3. Михеев М.Ю., Щербань А.Б. Концепция реализации принципа структурной
идентификации. Обозрение прикладной и промышленной математики. 2005. Т. 12. № 2.
С. 15.
4. Щербань А.Б. Классификация задач идентификационно-структурного
анализа. Известия высших учебных заведений. Поволжский регион. Технические
науки. 2010. № 2. С. 3-12.
5. Михеев М.Ю., Щербань А.Б. Формализация принципа ситуационноструктурного управления в пространстве IS-анализа. Обозрение прикладной и
промышленной математики. 2005. Т. 12. С. 442.
6. Тюрин М.В., Щербань А.Б., Соловьев В.В., Мурашкина Е.Н. Структурный
Журнал «Теория и практика имитационного моделирования и создания тренажеров», выпуск 1, 2015
подход к анализу состояний сложных систем. Современные информационные
технологии. 2011. № 14. С. 72-76.
7. Щербань А.Б., Бученкова Т.В. Постановка задачи оптимизации
функциональной структуры как задачи IS-анализа. Современные информационные
технологии. 2006. № 3. С. 51-53.
8. Щербань А.Б., Котякова В.А. Оптимизация бизнес-процессов с точки зрения
структурного подхода. Современные информационные технологии. 2010. № 11. С. 188190.
Download