отчет лаба 1 Роменчева
.docx
ФЕДЕРАЛЬНОЕ
АГЕНСТВО ВОЗДУШНОГО ТРАНСПОРТА
(РОСАВИАЦИЯ)
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)
Кафедра вычислительных машин, комплексов, сетей и систем.
Лабораторная работа защищена с оценкой ____________________
____________________
(подпись преподавателя, дата)
ЛАБОРАТОРНАЯ РАБОТА №1
по дисциплине «Системы искусственного интеллекта».
Вариант 16
Тема: «Разработка нечеткой модели прогнозирования.»
Выполнила студентка группы ИС3-1
Магальник Екатерина Борисовна
Руководитель: Романчева Нина Ивановна
МОСКВА – 2024
Дано:
В комнате находятся обезьяна, ящик и связка бананов, которая подвешена к потолку настолько высоко, что обезьяна может до нее дотянуться, только встав на ящик.
Нужно:
Найти последовательность действий, которая позволит обезьяне достать бананы
Предполагается:
обезьяна может ходить по комнате
двигать по полу ящик
взбираться на него
хватать бананы
Описание состояния этой задачи должно включать следующие
сведения:
местоположение обезьяны в комнате - в горизонтальной плоскости пола и по вертикали (т.е. на полу она или на ящике),
местоположение ящика на полу
наличие у обезьяны бананов
Это можно представить в виде четырехэлементного списка (ПолОб, ВертОб, ПолЯщ, Цель), где:
ПолЯщ - положение обезьяны и ящика на полу;
ПолОб - положение обезьяны на полу (это может быть двухэлементный вектор координат);
ВертОб - это константа П или Я в зависимости от того, где находится безьяна, на полу или на ящике;
Цель - это константа О или 1 в зависимости от того, достала ли обезьяна бананы или нет
Зафиксируем как константы три следующие точки в плоскости пола:
То - точка первоначального местоположения обезьяны;
Тя - точка первоначального расположения ящика;
Тб - точка пола, расположенная непосредственно под связкой бананов
Тогда начальное состояние задачи описывается списком (То, П, Тя, 0), а целевое состояние задается как любой список, последний элемент которого - 1.
Естественно определить операторы в этой задаче в соответствии с возможными действиями обезьяны:
Перейти (W) - переход обезьяны к точке W горизонтальной плоскости пола;
Передвинуть (V) - передвижение обезьяной ящика в точку V пола;
Взобраться - обезьяна взбирается на ящик;
Схватить - обезьяна хватает связку бананов
Условия применимости и действие этих операторов легко определить в виде правил продукций вида:
аргумент оператора -> результат оператора,
Причем X, Y, Z, W, V обозначают переменные:
Перейти (W): (X, П, Y, Z ) -> (W, П, Y, Z)
Передвинуть (V): (X, П, X, Z) -> (V, П, V, Z)
Взобраться: (X, П, X, Z) -> (X, Я, X, Z)
Схватить: (Т6, Я, Тб, 0) -> (Т6, Я, Тб, 1)
Будем считать, что для решения задачи значимы лишь вышеупомянутые точки пола То, Тя, Тб , получим пространство состояний задачи (рис). Это пространство содержит только 13 состояний, дуги графа-пространства промаркированы порядковым номером применяемого оператора Пространство содержит 4 цикла хождения обезьяны между 3 значимыми точками (с ящиком или без него).
В пространстве есть также 2 тупиковые ветви - когда обезьяна залезает на ящик, но не под связкой бананов.
Жирными дугами (стрелками) показан решающий путь, состоящий из четырех операторов:
Перейти (Тя);
Передвинуть(Тб);
Взобраться;
Схватить.
Листинг программы:
import numpy as np import matplotlib.pyplot as plt import networkx as nx class Obezjana: def __init__(self, polozenie): self.polozenie = polozenie self.banany = False def Perejti(self, novoe_polozenie): self.polozenie = novoe_polozenie def Peredvinut(self, novoe_polozenie): self.polozenie = novoe_polozenie def Vzobratsja(self): self.polozenie = (self.polozenie[0], 'Ja', self.polozenie[2]) def Shvatit(self): self.banany = True class Jascik: def __init__(self, polozenie): self.polozenie = polozenie def Peredvinut(self, novoe_polozenie): self.polozenie = novoe_polozenie class Prostranstvo: def __init__(self, To, Tja, Tb): self.To = To self.Tja = Tja self.Tb = Tb self.obezjana = Obezjana((self.To, 'P', self.Tja)) self.jascik = Jascik(self.Tja) def reshenie_zadachi(self): # Перейти к ящику self.obezjana.Perejti(self.Tja) # Передвинуть ящик к точке под связкой бананов self.jascik.Peredvinut(self.Tb) # Взобраться на ящик self.obezjana.Vzobratsja() # Схватить бананы self.obezjana.Shvatit() print(f"Обезьяна достала бананы: {self.obezjana.banany}") # Создание пространства и решение задачи To = np.array([0, 0, 0]) for i in range(0,2): for j in range(0,2): for k in range(0,2): Tja = np.array([i, j, k]) for q in range(0, 2): for w in range(0, 2): for e in range(0, 2): Tb = np.array([q, w, e]) print('Точка обезьяны:', To, 'Точка ящика:', Tja, 'Точка банана:', Tb) prostranstvo = Prostranstvo(To, Tja, Tb) prostranstvo.reshenie_zadachi() # Определяем начальное и целевое состояния initial_state = (0, 'П', 1, 0) # (ПолОб, ВертОб, ПолЯщ, Цель) goal_state = (0, 'Я', 0, 1) # Граф для хранения состояний и переходов G = nx.DiGraph() # Определение операций def move_to_point(X, W): return (W[0], 'П', X[2], X[3]) def move_box(X, V): return (X[0], 'П', V[0], X[3]) def climb(X): return (X[0], 'Я', X[2], X[3]) def grab(X): return (X[0], 'Я', X[2], 1) # Создаем граф состояний G.add_node(initial_state) # Переходы step1 = move_to_point(initial_state, (1, 'П')) G.add_edge(initial_state, step1, label='Перейти (Тя)') step2 = move_box(step1, (0, 'П')) G.add_edge(step1, step2, label='Передвинуть (Тб)') step3 = climb(step2) G.add_edge(step2, step3, label='Взобраться') step4 = grab(step3) G.add_edge(step3, step4, label='Схватить') # Добавляем целевое состояние G.add_node(goal_state) # Создаем графики pos = nx.spring_layout(G) nx.draw(G, pos, with_labels=True, node_size=2000) edge_labels = nx.get_edge_attributes(G, 'label') nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels) plt.title("Граф состояний (обезьяна и бананы)") plt.show()
Результат работы программы:
Точка обезьяны: [0 0 0] Точка ящика: [0 0 0] Точка банана: [0 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 0] Точка банана: [0 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 0] Точка банана: [0 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 0] Точка банана: [0 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 0] Точка банана: [1 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 0] Точка банана: [1 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 0] Точка банана: [1 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 0] Точка банана: [1 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 1] Точка банана: [0 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 1] Точка банана: [0 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 1] Точка банана: [0 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 1] Точка банана: [0 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 1] Точка банана: [1 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 1] Точка банана: [1 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 1] Точка банана: [1 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 0 1] Точка банана: [1 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 0] Точка банана: [0 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 0] Точка банана: [0 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 0] Точка банана: [0 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 0] Точка банана: [0 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 0] Точка банана: [1 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 0] Точка банана: [1 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 0] Точка банана: [1 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 0] Точка банана: [1 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 1] Точка банана: [0 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 1] Точка банана: [0 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 1] Точка банана: [0 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 1] Точка банана: [0 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 1] Точка банана: [1 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 1] Точка банана: [1 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 1] Точка банана: [1 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [0 1 1] Точка банана: [1 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 0] Точка банана: [0 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 0] Точка банана: [0 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 0] Точка банана: [0 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 0] Точка банана: [0 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 0] Точка банана: [1 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 0] Точка банана: [1 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 0] Точка банана: [1 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 0] Точка банана: [1 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 1] Точка банана: [0 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 1] Точка банана: [0 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 1] Точка банана: [0 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 1] Точка банана: [0 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 1] Точка банана: [1 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 1] Точка банана: [1 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 1] Точка банана: [1 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 0 1] Точка банана: [1 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 0] Точка банана: [0 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 0] Точка банана: [0 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 0] Точка банана: [0 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 0] Точка банана: [0 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 0] Точка банана: [1 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 0] Точка банана: [1 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 0] Точка банана: [1 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 0] Точка банана: [1 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 1] Точка банана: [0 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 1] Точка банана: [0 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 1] Точка банана: [0 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 1] Точка банана: [0 1 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 1] Точка банана: [1 0 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 1] Точка банана: [1 0 1]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 1] Точка банана: [1 1 0]
Обезьяна достала бананы: True
Точка обезьяны: [0 0 0] Точка ящика: [1 1 1] Точка банана: [1 1 1]
Обезьяна достала бананы: True
