close

Вход

Забыли?

вход по аккаунту

?

ИИ лаб1

код для вставкиСкачать
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение высшего профессионального образования
"Дальневосточный федеральный университет"
ШКОЛА ЕСТЕСТВЕННЫХ НАУК
Кафедра информационных систем управления
ОТЧЕТ по лабораторной работе № 1
Метод масок
Выполнили студенты гр. С-8527 _______________ Дронов А.Г.
_______________ Бурмистров В.М.
_______________ Лисенков В.О.Проверил доцент
_______________ Москаленко Ю.С.
_______________________ (оценка)
г. Владивосток
2013
Содержание
Краткая теория3
Метод масок3
Программная реализация4
Вывод7
Приложение8
Краткая теория
Метод масок
Метрика: RH - мера расстояния, R'H - мера сходства
P' - порог различия,P'' - порог сходства
Расстояние по Хеммингу:
P^'=P^''=n/2+n/4+...+ (1)
Нахождение масок
Первой маской назначается первая строка
Поиск других масок. Принцип поиска - фиксируется последняя найденная маска и по отношению к ней ищется следующая маска по принципу:
она должна различаться от первой маски не менее чем по Р' признакам (столбцам)
строка кандидат не должна совпадать с предыдущими масками по Р'' и более признакам
Фиксируется найденная маска и ищется следующая
Кодом строки называется двоичное слово, длина которого равна количеству найденных масок. Единица фиксируется, если i - строка сходна с маской не менее чем P'' признакам.
Нахождение решения: строки, имеющие одинаковые коды образуют один кластер.
Результат решения зависит от трех параметров: P',P'', k - номер первой строки.
Программная реализация
Программа реализована на языке C#. При запуске ее появляется окно для ввода значений (рисунок 1). При нажатии кнопки "Задать параметры" появляется дополнительное окно (рисунок 2) для их ввода: количество объектов (количество строк) и количество атрибутов (количество столбцов). После этого таблица перестраивается под заданные значения. Также необходимо скорректировать три параметра : P', P'', "Номер первой маски" - от их значений зависит результат решения задачи. После того как таблица была заполнена (рисунок 3), а параметры были уточнены - можно приступать к решения задачи, а именно нажать на кнопку "Решить задачу", после чего решение отобразится в текущем окне (рисунок 4). Для анализа задачи, а именно подбора устойчивого решения необходимо нажать кнопку анализ, после чего появится новое окно с результатом анализа (рисунок 5).
Рисунок 1 - Главное окно программы
Рисунок 2 - Выбор параметров задачи
Рисунок 3 - Ввод данных
Рисунок 4 - Получение результата
Рисунок 5 - Анализ задачи
Вывод
В ходе выполнения лабораторной работы был изучен метод масок и программно реализован.
Приложение
using System;
using System.Collections.Generic;
using System.Linq;
namespace AI_labs
{
public class MaskResult
{
public MaskResult(List<int> MaskList, int[,] MaskMassive, List<List<int>> Clusters, int P1, int P2)
{
this.MaskList = MaskList;
this.MaskMassive = MaskMassive;
this.Clusters = Clusters;
this.Differences = P1;
this.Similarities = P2;
}
public int[,] MaskMassive { get; set; }
public List<int> MaskList { get; set; }
public List<List<int>> Clusters { get; set; }
public int Differences { get; private set; }
public int Similarities { get; private set; }
public bool Compare(object obj)
{
if (obj == null || !(obj is MaskResult)) return false;
MaskResult mr = (MaskResult)obj;
return CompareMaskList(mr.MaskList) && CompareMaskMassive(mr.MaskMassive);
}
private bool CompareMaskMassive(int[,] MaskMassive)
{
if (this.MaskMassive.GetLength(0) != MaskMassive.GetLength(0) || this.MaskMassive.GetLength(1) != MaskMassive.GetLength(1))
return false;
for (int i = 0; i < MaskMassive.GetLength(0); i++)
{
for (int j = 0; j < MaskMassive.GetLength(1); j++)
{
if (this.MaskMassive[i, j] != MaskMassive[i, j]) return false;
}
}
return true;
}
private bool CompareMaskList(List<int> MaskList)
{
if (this.MaskList.Count == MaskList.Count) return false;
this.MaskList.Sort();
MaskList.Sort();
for (int i = 0; i < MaskList.Count; i++)
{
if (this.MaskList[i] != MaskList[i]) return false;
}
return true;
}
public string ClustersToStr()
{
string strClusters = "";
int ROWS = MaskMassive.GetLength(0);
List<int> ReserveList = new List<int>();
for (int i = 0; i < ROWS; i++)
{
if (ReserveList.Contains(i)) continue;
ReserveList.Add(i);
strClusters += "a" + (i + 1);
for (int k = i + 1; k < ROWS; k++)
{
if (ReserveList.Contains(k)) continue;
int count = 0;
for (int j = 0; j < MaskMassive.GetLength(1); j++)
{
if (MaskMassive[i, j] == MaskMassive[k, j])
count++;
}
if (count == MaskMassive.GetLength(1))
{
strClusters += "a" + (k + 1);
ReserveList.Add(k);
}
}
strClusters += ", ";
}
strClusters = strClusters.Substring(0, strClusters.Length - 2);
return strClusters;
}
public string[] MaskMassiveToStr()
{
string[] Result = new string[MaskMassive.GetLength(0)];
for (int i = 0; i < MaskMassive.GetLength(0); i++)
{
//Result[i] += (i + 1) + "| ";
for (int j = 0; j < MaskMassive.GetLength(1); j++)
{
Result[i] += MaskMassive[i, j] + " ";
}
}
return Result;
}
}
public class ScanResult
{
public ScanResult(List<string> ClusterList, List<int> CountList)
{
this.ClusterList = ClusterList;
this.CountList = CountList;
}
public string[] GetStringLines()
{
if (ClusterList == null && CountList == null) return null;
int MaxIndex = CountList.IndexOf(CountList.Max());
int MaxLength = ("Количество совпадений: " + CountList[MaxIndex]).Length;
string[] Lines = new string[CountList.Count];
for (int i = 0; i < CountList.Count; i++)
{
string left_half = "Количество совпадений: " + CountList[i];
string right_half = "Кластеры: [" + ClusterList[i] + "]" + (i == MaxIndex ? " << Максимум" : "");
string between = new string(' ', MaxLength - left_half.Length + 2);
Lines[i] = left_half + between + right_half;
}
return Lines;
}
public List<string> ClusterList { get; private set; }
public List<int> CountList { get; private set; }
}
public static class Lab1
{
public static MaskResult MaskMethod_n(object[] Matrix, int FirstMask, int Differences, int Similarities)
{
List<int> MaskList = new List<int>();
int[,] MaskMassive = null;
List<List<int>> Clusters = new List<List<int>>();
int ROWS = (Matrix[0] as Array).Length;
int COLUMNS = Matrix.Length;
MaskList = DefineMasks(Matrix, FirstMask, Differences, Similarities);
MaskMassive = DefineMaskMassive(Matrix, MaskList, Similarities);
Clusters = DefineClusters(MaskMassive);
MaskResult Result = new MaskResult(MaskList, MaskMassive, Clusters, Differences, Similarities);
return Result;
}
public static ScanResult Scan(object[] Matrix)
{
int ROWS = (Matrix[0] as Array).Length;
int COLUMNS = Matrix.Length;
int P_interval = COLUMNS / 2;
List<string> strClustersList = new List<string>();
List<int> countList = new List<int>();
for (int FirstMask = 0; FirstMask < ROWS; FirstMask++)
{
for (int P1 = P_interval; P1 <= COLUMNS; P1++)
{
for (int P2 = P_interval; P2 <= COLUMNS; P2++)
{
MaskResult mr = MaskMethod_n(Matrix, FirstMask, P1, P2);
string str_Clusters = mr.ClustersToStr();
if (!strClustersList.Contains(str_Clusters))
{
strClustersList.Add(str_Clusters);
countList.Add(1);
}
else
{
int index = strClustersList.IndexOf(str_Clusters);
countList[index]++;
}
}
}
}
ScanResult scanResult = new ScanResult(strClustersList, countList);
return scanResult;
}
static List<int> DefineMasks(object[] Matrix, int FirstMask, int Differences, int Similarities)
{
int ROWS = (Matrix[0] as Array).Length;
int COLUMNS = Matrix.Length;
List<int> Masks = new List<int>();
//Result.maskNumb = new List<int>(COLUMNS / 2);
Masks.Add(FirstMask);
for (int i = 0; i < ROWS; i++)
{
if (Masks.Contains(i)) continue;
int CountP2 = 0;
int CountP1 = 0;
for (int j = 0; j < COLUMNS; j++)
{
switch (Matrix[j].GetType().Name)
{
case "String[]":
if ((Matrix[j] as string[])[i] != (Matrix[j] as string[])[Masks[Masks.Count - 1]])
CountP1++;
break;
case "Int32[]":
int iA = (Matrix[j] as int[])[i];
int iB = (Matrix[j] as int[])[Masks[Masks.Count - 1]];
if (iB != iA)
CountP1++;
break;
case "Single[]":
float fA = (Matrix[j] as float[])[i];
float fB = (Matrix[j] as float[])[Masks[Masks.Count - 1]];
if (fB != fA)
CountP1++;
break;
default:
break;
}
}
if (CountP1 < Differences)
break;
for (int k = 0; k < Masks.Count - 1; k++)
{
for (int j = 0; j < COLUMNS; j++)
{
switch (Matrix[j].GetType().Name)
{
case "String[]":
if ((Matrix[j] as string[])[i] == (Matrix[j] as string[])[k])
CountP2++;
break;
case "Int32[]":
int iA = (Matrix[j] as int[])[i];
int iB = (Matrix[j] as int[])[k];
if (iB == iA)
CountP2++;
break;
case "Single[]":
float fA = (Matrix[j] as float[])[i];
float fB = (Matrix[j] as float[])[k];
if (fB == fA)
CountP2++;
break;
default:
break;
}
}
if (CountP2 >= Similarities)
break;
}
if (CountP1 >= Differences && CountP2 < Similarities)
Masks.Add(i);
}
Masks.Sort();
return Masks;
}
static int[,] DefineMaskMassive(object[] Matrix, List<int> MaskList, int Similarities)
{
int ROWS = (Matrix[0] as Array).Length;
int COLUMNS = Matrix.Length;
int[,] Result = new int[ROWS, MaskList.Count];
for (int i = 0; i < ROWS; i++)
{
int Count = new int();
for (int k = 0; k < MaskList.Count; k++)
{
Count = 0;
for (int j = 0; j < COLUMNS; j++)
{
switch (Matrix[j].GetType().Name)
{
case "String[]":
if ((Matrix[j] as string[])[i] == (Matrix[j] as string[])[MaskList[k]])
Count++;
break;
case "Int32[]":
if ((Matrix[j] as int[])[i] == (Matrix[j] as int[])[MaskList[k]])
Count++;
break;
case "Single[]":
if ((Matrix[j] as float[])[i] == (Matrix[j] as float[])[MaskList[k]])
Count++;
break;
default:
break;
}
}
if (Count >= Similarities)
Result[i, k] = 1;
}
}
return Result;
}
static List<List<int>> DefineClusters(int[,] MaskMassive)
{
int ROWS = MaskMassive.GetLength(0);
List<int> ReserveList = new List<int>();
List<List<int>> Result = new List<List<int>>();
for (int i = 0; i < ROWS; i++)
{
if (ReserveList.Contains(i)) continue;
ReserveList.Add(i);
Result.Add(new List<int>());
Result[Result.Count - 1].Add(i + 1);
for (int k = i + 1; k < ROWS; k++)
{
if (ReserveList.Contains(k)) continue;
int count = 0;
for (int j = 0; j < MaskMassive.GetLength(1); j++)
{
if (MaskMassive[i, j] == MaskMassive[k, j])
count++;
}
if (count == MaskMassive.GetLength(1))
{
Result[Result.Count - 1].Add(k + 1);
ReserveList.Add(k);
}
}
}
return Result;
}
}
}
Документ
Категория
Рефераты
Просмотров
16
Размер файла
247 Кб
Теги
лаб1
1/--страниц
Пожаловаться на содержимое документа