💀
Второй курс РПО
Разработка программных модулей
Разработка программных модулей
  • Модели разработки
  • Ошибки и отладка программ
  • Средства разработки алгоритмов
    • Основные принципы и стадии тестирования
  • Сложностные классы
  • Эмуляторы операционных систем
  • Сложность сортировки
  • Уровни тестирования
  • Задание №1
  • Регрессионное тестирование
  • Тестирование «белым ящиком»
  • Как делать оценку сложности?
  • Алгоритмы и сложность
  • Тестирование "белым ящиком" №2
  • Сложность алгоритмов
  • Тестирование "белым ящиком" №3
  • Тестирование "Чёрным ящиком»" №1
  • Тестирование "Черным ящиком" №2
  • Оценка сложности эвристических алгоритмов
  • Принципы ООП
  • Тестирование "Черным ящиком" №3
  • КТ - В3
  • Модульное тестирование
    • С кодами
  • Модульное тестирование
  • Абстрактные классы и интерфейсы в Python
  • Структуры в Python по аналогии с C++
    • Диалоги гениев
  • Делегаты в Python
    • Ещё более не смешные диалоги
  • Регулярные выражения в Python от простого к сложному
  • Python: Коллекции
  • Параметризованные классы (шаблоны)
  • Указатели и операции со списками в Python
  • Интеграционное тестирование
  • Работа с классами. Перегрузка методов
  • Определение операций в классе.
  • Создание наследованных классов
  • Интеграционное тестирование
  • Работа с объектами через интерфейсы
  • Использование стандартных интерфейсов
  • Работа с типом данных "Структура"
  • Коллекции. Параметризованные классы
  • Использование регулярных выражений
  • Операции со списками
  • Что такое паттерны проектирования?
  • Шпаргалка по шаблонам проектирования
    • [Habr] Шпаргалка
  • UML-диаграммы проектирования
  • Использование основных шаблонов.
  • Использование каких то там шаблонов
  • 15-я Практическая
  • 16-я Практическая
  • Graphviz Online
  • 17-я Практическая
  • Введение в теорию программирования: Объектно-ориентированный подход
  • Документирование софта и стандарты
  • C# Ввод и вывод
  • Оптимизация кода: просто о главном
  • Автоматизация разработки технической документации
  • Автоматизированное документирование и первичные данные
  • ADO.NET что это?
Powered by GitBook
On this page
  • Основные аспекты оценки сложности
  • Пример: Жадный алгоритм
  • Эвристические методы и их сложность

Оценка сложности эвристических алгоритмов

11.12.2024

используются для решения сложных задач, где точное решение найти затруднительно или невозможно за разумное время.

Эвристические алгоритмы ищут достаточно хорошие решения сложных задач, где точный ответ найти сложно или долго. Они используют упрощения и правила, чтобы быстрее достичь результата.

Основные цели оценки сложности

  • Понять эффективность алгоритма

  • Выявить узкие места в производительности

  • Оценить пригодность алгоритма для реальных задач

Основные аспекты оценки сложности

  1. Временная сложность:

    • Это показатель, отражающий, как изменяется время выполнения алгоритма в зависимости от увеличения размера входных данных.

    • Типичные формы временной сложности:

      • Линейная O(n)O(n)O(n): время выполнения растёт пропорционально количеству входных данных.

      • Квадратичная O(n2)O(n^2)O(n2): время выполнения увеличивается в квадрате с ростом входных данных.

      • Логарифмическая O(log⁡n)O(\log n)O(logn): время выполнения растёт медленно даже при значительном увеличении входных данных.

  2. Пространственная сложность:

    • Показывает, сколько памяти требуется для выполнения алгоритма.

    • Пример: при использовании динамического программирования может потребоваться таблица размером n×mn \times mn×m, где nnn и mmm — размеры задачи.

Пример: Жадный алгоритм

Жадные алгоритмы принимают на каждом шаге локально оптимальное решение, надеясь, что оно приведёт к глобально оптимальному результату.

Формула оценки времени:

T(n)=∑i=1nCiT(n) = \sum_{i=1}^{n} C_iT(n)=i=1∑n​Ci​

Где:

  • T(n)T(n)T(n) — общее время выполнения,

  • CiC_iCi​ — стоимость выполнения iii-й операции.

Таблица: Пример оценки временной сложности

Размер входа
Шаги выполнения
Время выполнения (ms)

10

10

5

100

100

50

1000

1000

500

Пример реализации жадного алгоритма

Предположим, требуется минимальное количество монет для сдачи.

python
# Номиналы монет
coins = [1, 5, 10, 25, 50]

# Функция для подсчёта минимального количества монет
def min_coins(amount):
    result = []  # Список для хранения выбранных монет
    for coin in sorted(coins, reverse=True):
        while amount >= coin:
            amount -= coin  # Уменьшаем сумму
            result.append(coin)  # Добавляем монету в результат
    return result

# Пример использования
print(min_coins(63))  # Вывод: [50, 10, 1, 1, 1]

Этот алгоритм работает быстро, так как на каждом шаге выбирается максимально крупная доступная монета.

Эвристические методы и их сложность

  1. Генетические алгоритмы:

    • Используются для поиска приближённых решений сложных задач.

    • Временная сложность: O(g×n×m)O(g \times n \times m)O(g×n×m), где:

      • ggg: количество поколений,

      • nnn: размер популяции,

      • mmm: количество параметров в задаче.

    Пример реализации генетического алгоритма

    Решим задачу максимизации функции f(x)=x2f(x) = x^2f(x)=x2:

python
import random

# Целевая функция
def fitness_function(x):
    return x**2

# Генетический алгоритм
def genetic_algorithm():
    population = [random.randint(0, 100) for _ in range(10)]  # Начальная популяция
    for generation in range(100):
        population = sorted(population, key=fitness_function, reverse=True)  # Сортируем по пригодности
        next_generation = population[:5]  # Отбираем лучших
        while len(next_generation) < 10:
            parent1, parent2 = random.sample(next_generation, 2)  # Скрещиваем
            child = (parent1 + parent2) // 2
            next_generation.append(child)
        population = next_generation
    return max(population, key=fitness_function)

# Пример использования
print(genetic_algorithm())
  1. Муравьиный алгоритм:

    • Этот метод имитирует поведение муравьёв при поиске кратчайшего пути между точками.

    • Временная сложность: O(n2×m)O(n^2 \times m)O(n2×m), где:

      • nnn: количество узлов (точек),

      • mmm: количество муравьёв.

    Пример реализации муравьиного алгоритма

    Решим задачу коммивояжёра (поиск кратчайшего пути):

python
import numpy as np

# Матрица расстояний
distance_matrix = np.array([
    [0, 2, 9, 10],
    [1, 0, 6, 4],
    [15, 7, 0, 8],
    [6, 3, 12, 0]
])

# Функция для поиска пути
def ant_colony_optimization():
    num_nodes = len(distance_matrix)
    best_path = None
    best_cost = float('inf')

    # Простая реализация
    for _ in range(100):
        path = np.random.permutation(num_nodes)  # Случайный путь
        cost = sum(distance_matrix[path[i], path[i + 1]] for i in range(num_nodes - 1))
        cost += distance_matrix[path[-1], path[0]]  # Возврат к начальной точке
        if cost < best_cost:
            best_cost = cost
            best_path = path

    return best_path, best_cost

# Пример использования
print(ant_colony_optimization())

Этот метод полезен для задач оптимизации, где требуется учитывать множество факторов.

  • Эвристические алгоритмы не всегда дают оптимальное решение, но позволяют найти хорошие приближённые результаты за разумное время.

  • Анализ временной и пространственной сложности помогает определить, насколько подходящим является алгоритм для конкретной задачи.

PreviousТестирование "Черным ящиком" №2NextПринципы ООП

Last updated 5 months ago