Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
17.12.2023
Размер:
714.25 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное

учреждение высшего образования

«Сочинский государственный университет»

Кафедра Информационных технологий

ОТЧЁТ

по лабораторной работе № 4

«УПРАВЛЕНИЕ ОБЪЕКТАМИ НА ОСНОВЕ НЕЧЕТКИХ И ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ»

Выполнила: студентка группы 20-ПИ

Кольцова Адриана Андреевна

Дата: 11.10.2023

Проверил: д.т.н. проф. Попов Д.И.

Дата: _______________

Сочи 2023

ЗАДАНИЕ №1. «РЕШЕНИЕ ЗАДАЧ УПРАВЛЕНИЯ И НАБЛЮДЕНИЯ

МЕТОДАМИ НЕЧЕТКОЙ ЛОГИКИ»

Целью работы является ознакомление с инструментальным средством FisPro (бесплатную версию можно скачать тут - (https://www.fispro.org/en/install/install-on-windows/), а также изучение основ проектирования нечетких систем управления с помощью данного программного средства.

Пример 1. (процесс подачи тепла в зависимости от измеренного значения температуры)

Пример 2. (x и y)

Задания к работе (движение автомобиля по трассе)

Задание (контроль уровня воды в баке)

ЗАДАНИЕ № 2 «РАЗРАБОТКА ГЕНЕТИЧЕСКОГО АЛГОРИТМА

ПОИСКА ЭКСТРЕМУМА ФУНКЦИИ»

Реализовать на языке программирования программу поиска оптимума (максимума/минимума) функции F(X) на интервале [A,B] с использованием генетического алгоритма.

F(x) = sin(x)+x/3

import random

import math

import matplotlib.pyplot as plt

from deap import base, creator, tools, algorithms

# Определение функции инициализации популяции

def init_individual(icls, attr_float):

    return icls([attr_float()])

# Определение переменных A и B

A = float(input("Введите значение A: "))

B = float(input("Введите значение B: "))

# Определение функции F(X)

def func_to_optimize(x):

    return math.sin(x) + x / 3

# Создание инструментов DEAP

creator.create("FitnessMax", base.Fitness, weights=(1.0,))

creator.create("Individual", list, fitness=creator.FitnessMax)

toolbox = base.Toolbox()

toolbox.register("attr_float", random.uniform, A, B)

toolbox.register("individual", init_individual, creator.Individual, toolbox.attr_float)

toolbox.register("population", tools.initRepeat, list, toolbox.individual)

# Определение функции оценки (фитнес-функции)

def evaluate(individual):

    return (func_to_optimize(individual[0]),)

toolbox.register("evaluate", evaluate)

toolbox.register("mate", tools.cxBlend, alpha=0.5)

toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=0.2, indpb=0.2)

toolbox.register("select", tools.selTournament, tournsize=3)

# Настройка параметров

POP_SIZE = 50

NGEN = 100

CXPB = 0.7

MUTPB = 0.3

# Создание популяции и запуск генетического алгоритма

pop = toolbox.population(n=POP_SIZE)

fitnesses = list(map(toolbox.evaluate, pop))

for ind, fit in zip(pop, fitnesses):

    ind.fitness.values = fit

logbook = tools.Logbook()

logbook.header = ["gen", "nevals"]

for gen in range(NGEN):

    offspring = algorithms.varAnd(pop, toolbox, cxpb=CXPB, mutpb=MUTPB)

    fitnesses = list(map(toolbox.evaluate, offspring))

    for ind, fit in zip(offspring, fitnesses):

        ind.fitness.values = fit

    pop[:] = offspring

    record = logbook.record(gen=gen, nevals=len(offspring))

    print(logbook.stream)

best_ind = tools.selBest(pop, 1)[0]

print("Лучший индивид:", best_ind)

print("Лучшее значение:", best_ind.fitness.values[0])

# Отображение результатов

x = [ind[0] for ind in pop]

y = [func_to_optimize(ind[0]) for ind in pop]

plt.figure(figsize=(12, 6))

plt.plot(x, y, 'ro', markersize=5, label='Популяция')

plt.plot(best_ind[0], best_ind.fitness.values[0], 'go', markersize=8, label='Лучший индивид')

x_vals = [A + i * 0.01 for i in range(int((B - A) / 0.01))]

y_vals = [func_to_optimize(x_val) for x_val in x_vals]

plt.plot(x_vals, y_vals, 'b-', label='F(X) = sin(X) + X/3')

plt.xlabel('X')

plt.ylabel('F(X)')

plt.title('Поиск оптимума функции F(X)')

plt.legend()

plt.grid(True)

plt.show()