Document 2721536

advertisement
При этом жесткость – это свойство тела, заключающееся в том, что любое его движение в пространстве является
тривиальным, то есть тело движется исключительно как «единое целое» и расстояние между любыми двумя его точками не
изменяется.
Целью работы является построение и программная реализация алгоритма нахождения всех минимально жестких графов с
заданным количеством вершин. То есть по заданному значению n – количеству вершин необходимо найти всевозможные
минимально жесткие графы, порожденные этими вершинами (рис. 1).
Рис. 1 – Постановка задачи
Построение ламановых графов может быть основано на теореме Ламана, согласно которой граф является минимально жестким
тогда и только тогда, когда выполнены два условия: 1) m = 2n–3 (m – количество ребер); 2) всякий набор из k вершин порождает не
более чем 2k–3 ребра.
Для описания алгоритма введем ряд понятий. Совокупность степеней всех вершин графа, упорядоченная по убыванию,
назовем степенной характеристикой этого графа. Расширенной степенной характеристикой графа будем называть множество из n
совокупностей чисел, где n – количество вершин. Каждая такая i-я совокупность характеризует некоторую j-ю вершину графа и
состоит из степеней вершин, соединенных с j-ой вершиной ребром (i,j=1,...,n). Элементы совокупности упорядочены по убыванию,
а сами совокупности внутри множества упорядочены по убыванию степеней вершин.
Итак, представляется следующий алгоритм нахождения матриц смежности для минимально жестких графов. По заданному n –
количеству вершин строим всевозможные степенные характеристики с условием, что степень каждой вершины больше единицы,
но меньше n, а также сумма всех степенных характеристик равна удвоенному количеству ребер. Количество ребер m находим из
первого условия теоремы Ламана. Затем для каждой степенной характеристики строим всевозможные матрицы смежности.
Каждую матрицу смежности проверяем на второе условие теоремы Ламана, и таким образом, получаем матрицы, соответствующие
минимально жестким графам. После чего исключаем одинаковые графы с точностью до переименования вершин, во-первых,
сравнивая расширенные степенные характеристики, во-вторых, проверяя матрицы смежности на изоморфность в случае, если
расширенные степенные характеристики получаются одинаковыми.
Для реализации данного алгоритма была написана компьютерная программа средствами Microsoft Visual Studio 2008 на языке
программирования C#.
Для построения всевозможных степенных характеристик по заданному количеству вершин n реализована рекурсивная
функция, в которую в качестве параметров передаются: количество вершин графа; массив для записи степеней вершин графа;
номер текущей позиции, из которой ведется заполнение следующей; заполняемое значение; сумма степеней вершин. Если сумма
степеней вершин положительна и не весь массив степенных характеристик заполнен, то есть может быть заполнена ячейка для
степени следующей вершины, тогда следующая за текущей ячейка заполняется переданным значением, и сумма степеней
уменьшается на это значение. Если дальнейшее заполнение оказывается невозможным, происходит возврат на шаг назад. Функция
рекурсивно вызывается для каждого возможного заполняемого значения (1 < zn < n-1), начиная с большего, чтобы степенная
характеристика была упорядочена по убыванию. Данная функция позволяет получить все степенные характеристика для заданного
числа n.
Функция отыскания матриц смежности требует в качестве входных данных степенную характеристику для заданного
количества вершин. Строка матрицы рекурсивно заполняется пока позволяет степень вершины единицами. Если на некотором шаге
матрица не выстраивается, происходит возврат к последней поставленной единице, она заменяется на ноль, и происходит
перестановка единицы на следующую позицию. Результат выводится при успешном заполнении матрицы до конца.
Функция проверки графа, заданного матрицей смежности, на второе условие теоремы Ламана, перебирает все наборы из k
вершин (k=4,…,n-1), считает количество порожденных ими ребер и сопоставляет с 2k–3.
Для того чтобы исключить одинаковые графы с точностью до переименования вершин, достаточно проверить матрицы
смежности на изоморфность, но для оптимизации программы сначала сравниваются расширенные степенные характеристики, что
позволяет сократить число производимых операций. Затем если
расширенные степенные характеристики получаются
одинаковыми, происходит проверка матриц смежности на изоморфность, для этого находятся всевозможные перестановки строк и
столбцов матриц.
Результатом работы программы является набор, включающий в себя все степенные характеристики и матрицы смежности для
найденных ламановых графов с заданным количеством вершин.
Литература
1. Панина Г.Ю. О шарнирных механизмах, пружинных графах и вывернутых наизнанку многогранниках [Электронный
ресурс] URL: http://www.mccme.ru/dubna/2008/notes/Panina/notes-2008.pdf (дата обращения 10.03.2013).
2. Руководство по программированию на C# [Электронный ресурс] URL:
http://msdn.microsoft.com/ruru/library/67ef8sbd.aspx (дата обращения 10.03.2013).
Степович-Цветкова Г.С.
Кандидат экономических наук, Ивановский государственный университет
ОСОБЕННОСТИ РЕАЛИЗАЦИИ ПЕРЕГРУЗКИ ОПЕРАЦИЙ В С++
Аннотация
В статье рассмотрены особенности реализации перегрузки операций на языке С++ различными способами, выявлены
основные различающие признаки и особенности программирования.
Ключевые слова: перегрузка операций, способы реализации, особенности.
Stepovitch-Tsvetkova G.S.
PhD in economic, Ivanovo State University
IMPLEMENTATION NOTES OF OPERATOR OVERLOADING IN C++
Abstract
The article considers the features of operator overloading in C++ in various ways, identified the main distinguishing features and
characteristics of programming.
Keywords: operator overloading, methods of implementation, features.
Перегрузка операций является мощным инструментарием языка С++, позволяющим программисту определять свои
полноценные типы данных, для которых возможно применение стандартных операций языка, но по своим правилам.
119
Программная реализация перегрузки операций может быть осуществлена несколькими способами. Во-первых, функция,
реализующая переопределяемую операцию, может быть методом класса, который описывает создаваемый программистом тип
данных. В этом случае отличие такой функции-метода от обычного метода класса заключается лишь в наличии ключевого слова
operator, которое здесь можно воспринимать как неотделимую часть имени метода. Тогда определение такого метода либо
располагается внутри описания класса непосредственно после заголовка метода, либо его определение выносится за рамки
описания класса с указанием имени класса с помощью операции доступа к области видимости (::), что позволяет
идентифицировать метод.
Например, рассмотрим перегрузку бинарной операции сложения в классе n-мерный вектор. Реализация с помощью метода
класса с определением метода внутри класса будет выглядеть следующим образом:
При вынесении определения метода за рамки класса, оставляя внутри класса лишь заголовок метода, реализация будет
выглядеть следующим образом:
Отметим, что первый операнд записывается в скрытый указатель this, поэтому методу передается только один формальный
параметр – второй операнд.
Вторым способом реализации перегрузки является написание дружественной функции. Такой подход может быть
оправданным, поскольку считается, что методами класса должны описываться некоторые свойства объектов класса, а операции
свойствами не являются. Так, например, стандартная операция вывода (<<) реализована в языке С++ в специальной библиотеке
iostream, осуществляющей потоковый ввод-вывод. В этом случае реализация перегрузки осуществляется вне описания класса, так
как это отдельная от класса функция, а внутри класса помещается заголовок этой функции с ключевым словом friend только для
того, чтобы предоставить этой функции доступ к скрытым полям класса, необходимым ей для работы.
Однако в данном случае количество формальных параметров функции уже увеличено до двух, поскольку дружественным
функция указатель this не передается, а, следовательно, оба операнда должны быть переданы в качестве параметров. Обратим
внимание, что внешне вторая реализация отличается от первой только лишь количеством параметров в функции, однако, это
принципиально иная реализация, и количество параметров – это вторичный показатель отличия этих двух способов реализации
перегрузки функций.
Тритим способом реализации перегрузки операций является написание простой функции, не только не являющейся методом
класса, но и даже не дружественной классу. В таком случае никакого упоминания о ней внутри класса не требуется. Однако как и в
предыдущем случае функции не передается указатель this, так как непосредственного отношения эта функция к классу не имеет и
вызывается сама по себе, а не через объект класса. Кроме того, для такой функции недоступны скрытые поля класса, в которых
записаны данные, необходимые для сложения. Поэтому необходимо наличие в классе открытых методов, предоставляющих доступ
к закрытым полям класса, а именно дополним класс методами get_n() и get_mas(), возвращающими значения полей данных, а также
методом prisv, заполняющим определенную координату вектора заданным значением:
120
Тогда функция, реализующая перегрузку оперции сложения для класса n-мерный вектор, будет выглядеть следующим
образом:
Таким образом, существует три различных способа реализации перегрузки операций в С++, каждый из которых имеет свои
особенности, отражающиеся на принципах программирования.
Литература
1. Лафоре Р. Объектно-ориентированное программирование в С++. – 4-е изд. – М. : Питер, 2004. – 923 с.
2. Шилдт Г. Искусство программирования на С++. – СПб. : БХВ-Петербург, 2005. – 496 с.
Филиппов А.Н.
Доцент, кандидат технических наук, Санкт-Петербургский национальный исследовательский университет информационных
технологий, механики и оптики
РАЗРАБОТКА КРИТЕРИЕВ ВЫБОРА ОКОНЧАТЕЛЬНОГО РЕШЕНИЯ ПРИ ПОИСКЕ ИНСТРУМЕНТА В
ЭКСПЕРТНОЙ СИСТЕМЕ ТЕХНОЛОГИЧЕСКОГО НАЗНАЧЕНИЯ
Аннотация
В статье описывается математическая модель оптимизации размещения инструментов по поверхностям для двух
критериев, и реализация модели, применяя метод “ветвей и границ” и генетический алгоритм.
Ключевые слова: автоматизация, генетический алгоритм, метод ветвей и границ.
Filippov A.N.
Associate Professor, candidate of technical Sciences, Saint-Petersburg national research University of information technologies,
mechanics and wholesale
DEVELOPMENT OF CRITERIA OF A CHOICE OF A FINAL SOLUTION WHEN SEARCHING FOR A TOOL IN THE
EXPERT SYSTEM OF TECHNOLOGICAL PURPOSE
Abstract
The article describes the mathematical model of optimization of placement of instruments on surfaces for two criteria, and
implementation of the model applying the method of branches and borders” and the genetic algorithm.
Keywords: automation, genetic algorithm, the method of branches and borders.
Задачей оптимизации в математике называется задача о нахождении экстремума (минимума или максимума) вещественной
функции в некоторой области. Как правило, рассматриваются области, принадлежащие
и заданные набором равенств и
неравенств.
Для того чтобы корректно поставить задачу оптимизации необходимо задать:
1. Допустимое множество
2.
Целевую функцию — отображение
3. Критерий поиска (max или min).
Существующие в настоящее время методы поиска можно разбить на три большие группы: детерминированные, случайные,
комбинаторные.
В случае с одним параметром задача оптимизации размещения [2] инструментов по поверхностям [3] выглядит так:
Минимизировать функцию:
при ограничениях:
= 0, если
для всех
= 1, в остальных случаях
где:
– стоимость обработки j-й поверхности i-м инструментом
– стойкость i-ого инструмента (фиксированная доплата)
n – количество инструментов
m – количество поверхностей
121
Download