Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Тестирование и руководство для пользователя ⇐ ПредыдущаяСтр 3 из 3
После запуска приложения пользователь увидит главное окно приложения на рисунке 4.2. Рис 4.2 – Главное окно Пользователь должен подготовить персептрон, нажав кнопку «Создать A и L» или «Готовые A и L» и загрузить базу изображений, с которыми будет в дальнейшем работать генетический алгоритм и персептрон. Результат выполнения приведен на рисунке 4.3.
Рис 4.3 – Изображения загружены в главное окно
Далее необходимо ввести следующие параметры: промежуток для весовых коэффициентов, количество особей при отборе, количество особей в 1-ой популяции, количество поколений и коэффициент мутации. После этого можно создать первое поколение, нажав кнопку «Создать». Затем можно выполнять последовательное нажатие кнопок: Отбор, Скрещивание, Мутация и Новое поколение. Но можно выполнить все автоматически, нажав кнопку «Автоматически». Результат выполнения приведен на рисунке 4.4.
Рис 4.4 – Результат автоматического выполнения Теперь пользователь может выбрать любую особь для распознавания изображений, дважды нажав по хромосоме. Весовые коэффициенты автоматически будут загружены в персептрон и можно производить их тестирование. Результат выполнения приведен на рисунке 4.5.
Рис 4.5 – Результат распознавания
ЗАКЛЮЧЕНИЕ В процессе работы над курсовым проектом были опробованы различные методы для оптимизации проектных решений, рассмотрены их отличия. Было разработано приложение под OS Windows с помощью среды разработки Visual Studio 2015 на объектно-ориентированном языке программирования C#. Проанализировав полученные результаты, можно сделать вывод о том, что данная программа позволяет оптимизировать весовые коэффициенты персептрона. Тестирование приложения позволило сделать следующие выводы: 1. Алгоритм обучения персептрона без учета правильности ответа дает 100% распознавание изображений. 2. Оптимизация весовых коэффициентов с помощью генетического алгоритма дает не очень хороший результат. В данном курсовом проекте результат оптимизации весовых коэффициентов полностью зависел от функции приспособленности и генетических операторов, таких как скрещивание и мутация, в которых применено слишком много случайных операций, что негативно сказалось на результате оптимизации.
ЛИТЕРАТУРА - Конспект лекций по дисциплине «Оптимизация проектных решений». Ковалёва И.Л., 2016 г. - Конспект лекций по дисциплине «Методы распознавания образов». Ковалёва И.Л., 2015 г. -Методические указания к лабораторным работам «ПЕРСЕПТРОННЫЕ НЕЙРОСЕТИ» Ковалёва И.Л., 2009 г. - Рутковская Д., Пилиньский М., Рутковский Л. Нейронные сети, генетические алгоритмы и нечеткие системы, 2006 г.
Рис. 1 – Схема IDEF (первый уровень)
Рис. 2 – Схема IDEF (второй уровень) Рис. 3 — UML диаграмма классов
Приложение 2. Исходный код класса Genetic public class Genetic {
private List< Person> _naturesList = new List< Person> (); private readonly List< Person> _naturesList2Gth = new List< Person> (); private readonly List< Person> _naturesListCrossed = new List< Person> (); private readonly List< Person> _naturesListMutated = new List< Person> ();
private int LeftLimit; private int RightLimit; private int CountNatures1Gth; private int CountNaturesForSelection; private double CoeffMutation; private int _numberOfGeneration = 1; private Random _rnd = new Random(); private DataGridView _currentData;
public Genetic(string count, string Lx1, string Rx1, string naturesForSelect, string coeffMutation) { int.TryParse(count, out CountNatures1Gth); int.TryParse(Lx1, out LeftLimit); int.TryParse(Rx1, out RightLimit); int.TryParse(naturesForSelect, out CountNaturesForSelection); CoeffMutation = double.Parse(coeffMutation, System.Globalization.CultureInfo.InvariantCulture); }
public void Dispose() { _naturesList.Clear(); _naturesList2Gth.Clear(); _naturesListCrossed.Clear(); _naturesListMutated.Clear(); _currentData.Rows.Clear(); CountNatures1Gth = 0; Person.Count = 0; } public void GetChromosoma(DataGridView data, DataGridView table3, int row) {…} public void Create1Gth(DataGridView data, Bitmap[] bmp, int[][] A) {…} public int[][] GetRandomNumber(int minimum, int maximum, Random rnd) {…} public void DisplayNaturesDefault() {…} public void Selection() {…} private void Crossing(Bitmap[] bmp, int[][] A) {…} public void ManyPointedCrossing(Bitmap[] bmp, int[][] A) {…} private void CrossingTwoNaturesDouble(Person rhsNature, Person lhsNature, Bitmap[] bmp, int[][] A, out Person changedNature1, out Person changedNature2) {…} public void DoMutation(Bitmap[] bmp, int[][] A) {…} } Приложение 3. Исходный код класса Person public class Person { public static int Count { get; set; }
public int Number { get; set; } public int[][] Lambda { get; set; } public string Сhromosome { get; set; } public double ResultOfFunc { get; set; } public double RouletteValue { get; set; }
public Person(Bitmap[] bmp, int[][] A, string chr) { Lambda = CreateLambda(chr); ResultOfFunc = GetResultOfFunc(bmp, A); Сhromosome = chr; Number = Count; Count++; }
public Person(Bitmap[] bmp, int[][] A, int[][] L) { Lambda = L; ResultOfFunc = GetResultOfFunc(bmp, A); Сhromosome = CreateСhromosome(L); Number = Count; Count++; }
private int[][] CreateLambda(string chr) { string[] temp = chr.Split(' '); int[][] L = new int[5][]; int k = 0;
for (int i = 0; i < 5; i++) { L[i] = new int[50]; for (int j = 0; j < 50; j++) { L[i][j] = Convert.ToInt32(temp[k]); k++; } }
return L; }
private string CreateСhromosome(int[][] L) { string chromosoma = " ";
foreach (var item in L) { foreach (var it in item) { chromosoma += it.ToString() + " "; } } return chromosoma; }
private double GetResultOfFunc(Bitmap[] bmp, int[][] A) { return FitnessFunction.GetResult(bmp, A, Lambda); } } Приложение 4. Исходный код класса FitnessFunction public class FitnessFunction { private const int LA = 50; private static Random rnd = new Random();
public static double GetResult(Bitmap[] bmp, int[][] Ael, int[][] Lel) { int[] A = YesNo(bmp[rnd.Next(0, 9)], Ael, Lel); int[] B = YesNo(bmp[rnd.Next(10, 19)], Ael, Lel); int[] C = YesNo(bmp[rnd.Next(20, 29)], Ael, Lel); int[] D = YesNo(bmp[rnd.Next(30, 39)], Ael, Lel); int[] E = YesNo(bmp[rnd.Next(40, 49)], Ael, Lel);
int FA = (A[0] - A[1]) + (A[0] - A[2]) + (A[0] - A[3]) + (A[0] - A[4]); int FB = (B[1] - B[0]) + (B[1] - B[2]) + (B[1] - B[3]) + (B[1] - B[4]); int FC = (C[2] - C[0]) + (C[2] - C[1]) + (C[2] - C[3]) + (C[2] - C[4]); int FD = (D[3] - D[0]) + (D[3] - D[1]) + (D[3] - D[2]) + (D[3] - D[4]); int FE = (E[4] - E[0]) + (E[4] - E[1]) + (E[4] - E[2]) + (E[4] - E[3]);
return FA + FB + FC + FD + FE; }
private static int[] YesNo(Bitmap bmp, int[][] A, int[][] L) { int p = 0; int[] temp = new int[400]; for (byte i = 0; i < bmp.Height; i++) { for (byte j = 0; j < bmp.Width; j++) { if (bmp.GetPixel(i, j).R == 0) { temp[j + p] = 1; } else { temp[j + p] = 0; } } p += 20; } for (int i = 0; i < LA; i++) { int summ = 0; for (int j = 0; j < 400; j++) summ += temp[j] * A[j][i]; A[405][i] = summ; if (summ > = 1) A[406][i] = 1; else A[406][i] = 0; } int[] summs = new int[5]; for (int i = 0; i < LA; i++) summs[0] += L[0][i] * A[406][i]; for (int i = 0; i < LA; i++) summs[1] += L[1][i] * A[406][i]; for (int i = 0; i < LA; i++) summs[2] += L[2][i] * A[406][i]; for (int i = 0; i < LA; i++) summs[3] += L[3][i] * A[406][i]; for (int i = 0; i < LA; i++) summs[4] += L[4][i] * A[406][i]; return summs; } }
Популярное:
|
Последнее изменение этой страницы: 2016-07-14; Просмотров: 464; Нарушение авторского права страницы