МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Інститут КНІТ
Кафедра ПЗ
ЗВІТ
До лабораторної роботи № 1
На тему: “Побудова і аналіз моделі знань у формі продукційних правил з нечіткими даними”
З дисципліни : "Системи штучного інтелекту"
Львів – 2010
Тема роботи: Побудова і аналіз моделі знань у формі продукційних правил з нечіткими даними.
Мета роботи: Розробити програмне забезпечення для задачі розпізнавання об’єкта на основі заданих характеристик об’єкта.
Завдання
Для заданого об’єкта розробити програмне забезпечення для задачі його розпізнавання на основі мережі правил , що об”єднує властивості та характеристики об”єктів.
Варіант 2:
Спорт(круглий м”яч, гра руками, висока сітка, середнє поле, овальний мяч, велике поле, гра руками, колективна гра).
Код програми
//---------------------------------------- Node.cs --------------------------------------//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AI_Lab1
{
class Node
{
public int koef;
public Node()
{
koef = 0;
}
public Node(int koef)
{
this.koef = koef;
}
public Node(Node nd)
{
koef = nd.koef;
}
public static Node Min(Node lop, Node rop)
{
if (lop.koef < rop.koef)
return lop;
else
return rop;
}
public static Node Max(Node lop, Node rop)
{
if (lop.koef > rop.koef)
return lop;
else
return rop;
}
public static Node operator &(Node lop, Node rop)
{
return new Node(Min(lop, rop));
}
public static Node operator |(Node lop, Node rop)
{
return new Node(Max(lop, rop));
}
public static Node operator ^(Node lop, Node rop)
{
return new Node(lop.koef + rop.koef - lop.koef * rop.koef / 100);
}
}
}
//------------------------------------------------------------------------------//
//------------------------------------- Form1.cs ----------------------------------------//
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Collections.Specialized;
using CustomListView;
namespace AI_Lab1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
lvwColumnSorter = new ListViewColumnSorter();
this.listView1.ListViewItemSorter = lvwColumnSorter;
}
Dictionary<string, string[]> features = new Dictionary<string, string[]>();
Dictionary<string, int> koefs = new Dictionary<string, int>();
Dictionary<string, Node> nodes = new Dictionary<string, Node>();
Dictionary<string, Node> sports = new Dictionary<string, Node>();
private ListViewColumnSorter lvwColumnSorter;
private ArrayList Peretyn(ArrayList al1, ArrayList al2)
{
ArrayList res = new ArrayList();
foreach (string sport in al1)
{
if (al2.Contains(sport) == true)
res.Add(sport);
}
return res;
}
void RefreshNodes()
{
nodes["Круглий"] = new Node();
nodes["Овальний"] = new Node();
nodes["Шайба"] = new Node();
nodes["Волан"] = new Node();
nodes["Велике"] = new Node();
nodes["Середнє"] = new Node();
nodes["Мале"] = new Node();
nodes["Висока"] = new Node();
nodes["Низька"] = new Node();
nodes["Руками"] = new Node();
nodes["Ногами"] = new Node();
nodes["Клюшкою"] = new Node();
nodes["Ракеткою"] = new Node();
nodes["Один-на-один"] = new Node();
nodes["Колективна гра"] = new Node();
}
void RefreshSports()
{
sports["Футбол"] = new Node();
sports["Гандбол"] = new Node();
sports["Бадмінтон"] = new Node();
sports["Теніс"] = new Node();
sports["Хокей"] = new Node();
sports["Волейбол"] = new Node();
sports["Баскетбол"] = new Node();
sports["Регбі"] = new Node();
}
private void Form1_Load(object sender, EventArgs e)
{
this.listViewMain.AddSubItem = true;
StringCollection SCballs = new StringCollection();
SCballs.AddRange(new string[] { "Круглий", "Овальний", "Шайба", "Волан"});
this.listViewMain.AddComboBoxCell(0, 1, SCballs);
StringCollection SCfield = new StringCollection();
SCfield.AddRange(new string[] { "Велике", "Середнє", "Мале"});
this.listViewMain.AddComboBoxCell(1, 1, SCfield);
StringCollection SCsitka = new StringCollection();
SCsitka.AddRange(new string[] { "Висока", "Низька"});
this.listViewMain.AddComboBoxCell(2, 1, SCsitka);
StringCollection SCgame = new StringCollection();
SCgame.AddRange(new string[] { "Руками", "Ногами", "Клюшкою", "Ракеткою" });
this.listViewMain.AddComboBoxCell(3, 1, SCgame);
StringCollection SCplayers = new StringCollection();
SCplayers.AddRange(new string[] { "Один-на-один", "Колективна гра"});
this.listViewMain.AddComboBoxCell(4, 1, SCplayers);
//////////////////////////////////////////////////////////////////////////
features.Add("Круглий", new string[] { "Футбол", "Гандбол", "Теніс", "Волейбол", "Баскетбол" });
features.Add("Овальний", new string[] { "Регбі" });
features.Add("Шайба", new string[] { "Хокей" });
features.Add("Волан", new string[] { "Бадмінтон" });
features.Add("Велике", new string[] { "Футбол", "Регбі" });
features.Add("Середнє", new string[] { "Гандбол", "Хокей", "Баскетбол" });
features.Add("Мале", new string[] { "Бадмінтон", "Теніс", "Волейбол" });
features.Add("Висока", new string[] { "Бадмінтон", "Волейбол" });
features.Add("Низька", new string[] { "Теніс" });
features.Add("Руками", new string[] { "Гандбол", "Волейбол", "Баскетбол", "Регбі" });
features.Add("Ногами", new string[] { "Футбол", "Регбі" });
features.Add("Клюшкою", new string[] { "Хокей" });
features.Add("Ракеткою", new string[] { "Бадмінтон", "Теніс" });
features.Add("Один-на-один", new string[] { "Бадмінтон", "Теніс" });
features.Add("Колективна гра", new string[] { "Футбол", "Гандбол", "Хокей", "Волейбол", "Баскетбол", "Регбі" });
//////////////////////////////////////////////////////////////////////////
koefs.Add("Круглий", 20);
koefs.Add("Овальний", 100);
koefs.Add("Шайба", 100);
koefs.Add("Волан", 100);
koefs.Add("Велике", 50);
koefs.Add("Середнє", 33);
koefs.Add("Мале", 33);
koefs.Add("Висока", 505);
koefs.Add("Низька", 100);
koefs.Add("Руками", 25);
koefs.Add("Ногами", 50);
koefs.Add("Клюшкою", 100);
koefs.Add("Ракеткою", 50);
koefs.Add("Один-на-один", 50);
koefs.Add("Колективна гра", 16);
//////////////////////////////////////////////////////////////////////////
nodes.Add("Круглий", new Node());
nodes.Add("Овальний", new Node());
nodes.Add("Шайба", new Node());
nodes.Add("Волан", new Node());
nodes.Add("Велике", new Node());
nodes.Add("Середнє", new Node());
nodes.Add("Мале", new Node());
nodes.Add("Висока", new Node());
nodes.Add("Низька", new Node());
nodes.Add("Руками", new Node());
nodes.Add("Ногами", new Node());
nodes.Add("Клюшкою", new Node());
nodes.Add("Ракеткою", new Node());
nodes.Add("Один-на-один", new Node());
nodes.Add("Колективна гра", new Node());
//////////////////////////////////////////////////////////////////////////
sports.Add("Футбол", new Node());
sports.Add("Гандбол", new Node());
sports.Add("Бадмінтон", new Node());
sports.Add("Теніс", new Node());
sports.Add("Хокей", new Node());
sports.Add("Волейбол", new Node());
sports.Add("Баскетбол", new Node());
sports.Add("Регбі", new Node());
}
Form2 form2;
private void button1_Click(object sender, EventArgs e)
{
form2 = new Form2();
RefreshNodes();
RefreshSports();
ArrayList arr1 = new ArrayList(new string[] {"Футбол", "Гандбол", "Бадмінтон", "Теніс", "Хокей", "Волейбол", "Баскетбол", "Регбі" });
ArrayList arr2 = new ArrayList();
for (int i = 0; i < 5; i++)
{
if (listViewMain.Items[i].Checked == true)
{
foreach (string sport in features[listViewMain.Items[i].SubItems[1].Text])
{
arr2.Add(sport);
}
arr1 = Peretyn(arr1, arr2);
arr2.Clear();
nodes[listViewMain.Items[i].SubItems[1].Text] = new Node(koefs[listViewMain.Items[i].SubItems[1].Text]);
}
}
foreach (string sport in arr1)
{
switch (sport)
{
case "Футбол":
sports[sport] = (nodes["Круглий"] ^ nodes["Ногами"] ^ nodes["Колективна гра"]) ^ (nodes["Велике"]);
form2.label1.Text = nodes["Круглий"].koef.ToString();
form2.label2.Text = nodes["Ногами"].koef.ToString();
form2.label3.Text = nodes["Колективна гра"].koef.ToString();
form2.label4.Text = nodes["Велике"].koef.ToString();
form2.label5.Text = (nodes["Круглий"] ^ nodes["Ногами"] ^ nodes["Колективна гра"]).koef.ToString();
form2.label6.Text = sports[sport].koef.ToString();
form2.football.BringToFront();
break;
case "Гандбол":
sports[sport] = (nodes["Круглий"] ^ nodes["Руками"] ^ nodes["Колективна гра"]) ^ (nodes["Середнє"]);
form2.label12.Text = nodes["Круглий"].koef.ToString();
form2.label11.Text = nodes["Руками"].koef.ToString();
form2.label10.Text = nodes["Колективна гра"].koef.ToString();
form2.label9.Text = nodes["Середнє"].koef.ToString();
form2.label8.Text = (nodes["Круглий"] ^ nodes["Руками"] ^ nodes["Колективна гра"]).koef.ToString();
form2.label7.Text = sports[sport].koef.ToString();
form2.handball.BringToFront();
break;
case "Бадмінтон":
sports[sport] = (nodes["Волан"] | (nodes["Ракеткою"] ^ nodes["Один-на-один"])) ^ (nodes["Мале"] ^ nodes["Висока"]);
form2.label18.Text = nodes["Волан"].koef.ToString();
form2.label17.Text = nodes["Ракеткою"].koef.ToString();
form2.label16.Text = nodes["Один-на-один"].koef.ToString();
form2.label21.Text = nodes["Мале"].koef.ToString();
form2.label15.Text = nodes["Висока"].koef.ToString();
form2.label14.Text = (nodes["Ракеткою"] ^ nodes["Один-на-один"]).koef.ToString();
form2.label19.Text = (nodes["Волан"] | (nodes["Ракеткою"] ^ nodes["Один-на-один"])).koef.ToString();
form2.label20.Text = (nodes["Мале"] ^ nodes["Висока"]).koef.ToString();
form2.label13.Text = sports[sport].koef.ToString();
form2.badminton.BringToFront();
break;
case "Теніс":
sports[sport] = (nodes["Круглий"] ^ nodes["Ракеткою"] ^ nodes["Один-на-один"]) ^ (nodes["Мале"] ^ nodes["Низька"]);
form2.label30.Text = nodes["Круглий"].koef.ToString();
form2.label29.Text = nodes["Ракеткою"].koef.ToString();
form2.label28.Text = nodes["Один-на-один"].koef.ToString();
form2.label22.Text = nodes["Мале"].koef.ToString();
form2.label27.Text = nodes["Низька"].koef.ToString();
form2.label24.Text = (nodes["Круглий"] ^ nodes["Ракеткою"] ^ nodes["Один-на-один"]).koef.ToString();
form2.label23.Text = (nodes["Мале"] ^ nodes["Низька"]).koef.ToString();
form2.label25.Text = sports[sport].koef.ToString();
form2.tenis.BringToFront();
break;
case "Хокей":
sports[sport] = (nodes["Шайба"] | nodes["Клюшкою"] | nodes["Колективна гра"]) ^ (nodes["Середнє"]);
form2.label37.Text = nodes["Шайба"].koef.ToString();
form2.label36.Text = nodes["Клюшкою"].koef.ToString();
form2.label35.Text = nodes["Колективна гра"].koef.ToString();
form2.label34.Text = nodes["Середнє"].koef.ToString();
form2.label32.Text = (nodes["Шайба"] | nodes["Клюшкою"] | nodes["Колективна гра"]).koef.ToString();
form2.label33.Text = sports[sport].koef.ToString();
form2.hockey.Visible = true;
form2.hockey.BringToFront();
break;
case "Волейбол":
sports[sport] = (nodes["Круглий"] ^ nodes["Руками"] ^ nodes["Колективна гра"]) ^ (nodes["Мале"] ^ nodes["Висока"]);
form2.label41.Text = nodes["Круглий"].koef.ToString();
form2.label40.Text = nodes["Руками"].koef.ToString();
form2.label39.Text = nodes["Колективна гра"].koef.ToString();
form2.label43.Text = nodes["Мале"].koef.ToString();
form2.label38.Text = nodes["Висока"].koef.ToString();
form2.label26.Text = (nodes["Круглий"] ^ nodes["Руками"] ^ nodes["Колективна гра"]).koef.ToString();
form2.label42.Text = (nodes["Мале"] ^ nodes["Висока"]).koef.ToString();
form2.label31.Text = sports[sport].koef.ToString();
form2.volleyball.BringToFront();
break;
case "Баскетбол":
sports[sport] = (nodes["Круглий"] ^ nodes["Руками"] ^ nodes["Колективна гра"]) ^ (nodes["Середнє"]);
form2.label51.Text = nodes["Круглий"].koef.ToString();
form2.label50.Text = nodes["Руками"].koef.ToString();
form2.label49.Text = nodes["Колективна гра"].koef.ToString();
form2.label48.Text = nodes["Середнє"].koef.ToString();
form2.label46.Text = (nodes["Круглий"] ^ nodes["Руками"] ^ nodes["Колективна гра"]).koef.ToString();
form2.label47.Text = sports[sport].koef.ToString();
form2.basketball.BringToFront();
break;
case "Регбі":
sports[sport] = (nodes["Овальний"] | ((nodes["Руками"] | nodes["Ногами"]) ^ nodes["Колективна гра"])) ^ (nodes["Велике"]);
form2.label55.Text = nodes["Овальний"].koef.ToString();
form2.label54.Text = nodes["Руками"].koef.ToString();
form2.label53.Text = nodes["Ногами"].koef.ToString();
form2.label52.Text = nodes["Велике"].koef.ToString();
form2.label44.Text = (nodes["Руками"] | nodes["Ногами"]).koef.ToString();
form2.label58.Text = nodes["Колективна гра"].koef.ToString();
form2.label57.Text = ((nodes["Руками"] | nodes["Ногами"]) ^ nodes["Колективна гра"]).koef.ToString();
form2.label56.Text = (nodes["Овальний"] | ((nodes["Руками"] | nodes["Ногами"]) ^ nodes["Колективна гра"])).koef.ToString();
form2.label45.Text = sports[sport].koef.ToString();
form2.rugby.BringToFront();
break;
}
}
for (int i = 0; i < 8; i++)
{
for (int j = 1; j < listView1.Items[i].SubItems.Count; j++)
listView1.Items[i].SubItems.Remove(listView1.Items[i].SubItems[j]);
listView1.Items[i].SubItems.Add(sports[listView1.Items[i].Text].koef.ToString());
}
lvwColumnSorter.SortColumn = 1;
lvwColumnSorter.Order = SortOrder.Descending;
listView1.Sort();
button2.Enabled = false;
if (arr1.Count > 1)
{
description.Text = "Заданим характеристикам відповідають одразу кілька видів спорту.";
sport_kind.Text = "";
}
else if (arr1.Count == 0)
{
description.Text = "Заданим характеристикам не відповідає жоден вид спорту.";
sport_kind.Text = "";
}
else if (arr1.Count == 1)
{
description.Text = "Заданим характеристикам відповідає:";
button2.Enabled = true;
sport_kind.Text = (string)arr1[0];
}
}
private void listViewMain_ItemChecked(object sender, ItemCheckedEventArgs e)
{
string[] arr = {"Круглий", "Велике", "Висока", "Руками", "Один-на-один"};
string[] arr2 = {"М\'яч", "Поле", "Сітка", "Гра", "К-сть гравців"};
if (e.Item.Checked == true)
listViewMain.Items[e.Item.Index].SubItems.Add(arr[e.Item.Index]);
else
{
listViewMain.Items[e.Item.Index].SubItems.Clear();
listViewMain.Items[e.Item.Index].Text = arr2[e.Item.Index];
}
button1.Enabled = false;
for (int i=0; i<5; i++)
if (listViewMain.Items[i].Checked == true)
{
button1.Enabled = true;
break;
}
}
private void button2_Click(object sender, EventArgs e)
{
form2.Show();
button2.Enabled = false;
}
}
}
//---------------------------------------------------------------------------------------//
Протокол роботи
Вибравши необхідні характеристики для потрібних категорій, після натиснення на кнопку „Визначити вид спорту” буде відображена таблиця з існуючими видами спорту та коефіцієнтами визначеності для кожного з них. Наприклад, нижче показано, що при заданні характеристик „круглий м’яч”, „велике поле” і „гра ногами” єдиним можливим видом спорту буде „футбол” з коефіцієнтом визначеності „80”.
Якщо ж буде недостатньо даних для визначення виду спорту, то буде виведене повідомлення, що „заданим характеристикам відповідають одразу кілька видів спорту”.
Можлива ситуація, коли певній сукупності характеристик не відповідає жоден вид спорту. У цьому випадку для всіх видів спорту коефіцієнти визначеності будуть становити „0”.
У разі якщо заданим характеристикам відповідає лише один вид спорту, то для цього виду спорту можна зобразити дерево, що є представленням семантичної мережі із заданими зв’язками. При цьому будуть відображені коефіцієнти визначеності для кожної із заданих характеристик, а також результуючий коефіцієнт визначеності для знайденого виду спорту.
Висновок
На цій лабораторній роботі я розробив програмне забезпечення для задачі розпізнавання об’єкта на основі заданих характеристик об’єкта. Розроблена програма дозволяє визначати вид спорту на основі заданих характеристик, таких як форма м’яча, розмір поля, висота сітки, кількість гравців на полі і т.п. В результаті для кожного виду спорту визначається результуючий коефіцієнт визначеності, що визначається із сукупності заданих характеристик і на основі цього коефіцієнту визначеності видається висновок щодо розпізнавання об’єкту.