LesiaUKR / goit-algo-fp

Master's | Basic Algorithms & Data structures | Final Project

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

goit-algo-fp

Homework | Final project

Завдання 1. Структури даних. Сортування. Робота з однозв'язним списком

Для реалізації однозв'язного списку (приклад реалізації можна взяти з конспекту) необхідно:

  • написати функцію, яка реалізує реверсування однозв'язного списку, змінюючи посилання між вузлами;
  • розробити алгоритм сортування для однозв'язного списку, наприклад, сортування вставками або злиттям;
  • написати функцію, що об'єднує два відсортовані однозв'язні списки в один відсортований список.

Завдання 2. Рекурсія. Створення фрактала “дерево Піфагора” за допомогою рекурсії

Необхідно написати програму на Python, яка використовує рекурсію для створення фрактала “дерево Піфагора”. Програма має візуалізувати фрактал “дерево Піфагора”, і користувач повинен мати можливість вказати рівень рекурсії.

Screenshoot

Завдання 3. Дерева, алгоритм Дейкстри

Розробіть алгоритм Дейкстри для знаходження найкоротших шляхів у зваженому графі, використовуючи бінарну купу. Завдання включає створення графа, використання піраміди для оптимізації вибору вершин та обчислення найкоротших шляхів від початкової вершини до всіх інших.

Завдання 4. Візуалізація піраміди

Наступний код виконує побудову бінарних дерев. Виконайте аналіз коду, щоб зрозуміти, як він працює.

import uuid

import networkx as nx
import matplotlib.pyplot as plt

class Node:
def **init**(self, key, color="skyblue"):
self.left = None
self.right = None
self.val = key
self.color = color # Додатковий аргумент для зберігання кольору вузла
self.id = str(uuid.uuid4()) # Унікальний ідентифікатор для кожного вузла

def add_edges(graph, node, pos, x=0, y=0, layer=1):
if node is not None:
graph.add_node(node.id, color=node.color, label=node.val) # Використання id та збереження значення вузла
if node.left:
graph.add_edge(node.id, node.left.id)
l = x - 1 / 2 ** layer
pos[node.left.id] = (l, y - 1)
l = add_edges(graph, node.left, pos, x=l, y=y - 1, layer=layer + 1)
if node.right:
graph.add_edge(node.id, node.right.id)
r = x + 1 / 2 ** layer
pos[node.right.id] = (r, y - 1)
r = add_edges(graph, node.right, pos, x=r, y=y - 1, layer=layer + 1)
return graph

def draw_tree(tree_root):
tree = nx.DiGraph()
pos = {tree_root.id: (0, 0)}
tree = add_edges(tree, tree_root, pos)

colors = [node[1]['color'] for node in tree.nodes(data=True)]
labels = {node[0]: node[1]['label'] for node in tree.nodes(data=True)} # Використовуйте значення вузла для міток

plt.figure(figsize=(8, 5))
nx.draw(tree, pos=pos, labels=labels, arrows=False, node_size=2500, node_color=colors)
plt.show()

# Створення дерева

root = Node(0)
root.left = Node(4)
root.left.left = Node(5)
root.left.right = Node(10)
root.right = Node(1)
root.right.left = Node(3)

# Відображення дерева

draw_tree(root)

Screenshoot

Використовуючи як базу цей код, побудуйте функцію, що буде візуалізувати бінарну купу.

Note

👉🏻 Примітка. Суть завдання полягає у створенні дерева із купи.

Завдання 5. Візуалізація обходу бінарного дерева

Використовуючи код із завдання 4 для побудови бінарного дерева, необхідно створити програму на Python, яка візуалізує обходи дерева: у глибину та в ширину.

Вона повинна відображати кожен крок у вузлах з різними кольорами, використовуючи 16-систему RGB (приклад #1296F0). Кольори вузлів мають змінюватися від темних до світлих відтінків, залежно від послідовності обходу. Кожен вузол при його відвідуванні має отримувати унікальний колір, який візуально відображає порядок обходу.

Note

👉🏻 Примітка. Використовуйте стек та чергу, НЕ рекурсію

Завдання 6. Жадібні алгоритми та динамічне програмування

Необхідно написати програму на Python, яка використовує два підходи — жадібний алгоритм та алгоритм динамічного програмування для розв’язання задачі вибору їжі з найбільшою сумарною калорійністю в межах обмеженого бюджету.

Кожен вид їжі має вказану вартість і калорійність. Дані про їжу представлені у вигляді словника, де ключ — назва страви, а значення — це словник з вартістю та калорійністю.

items = {
"pizza": {"cost": 50, "calories": 300},
"hamburger": {"cost": 40, "calories": 250},
"hot-dog": {"cost": 30, "calories": 200},
"pepsi": {"cost": 10, "calories": 100},
"cola": {"cost": 15, "calories": 220},
"potato": {"cost": 25, "calories": 350}
}

Розробіть функцію greedy_algorithm жадібного алгоритму, яка вибирає страви, максимізуючи співвідношення калорій до вартості, не перевищуючи заданий бюджет.

Для реалізації алгоритму динамічного програмування створіть функцію dynamic_programming, яка обчислює оптимальний набір страв для максимізації калорійності при заданому бюджеті.

Завдання 7. Використання методу Монте-Карло

Необхідно написати програму на Python, яка імітує велику кількість кидків кубиків, обчислює суми чисел, які випадають на кубиках, і визначає ймовірність кожної можливої суми.

Створіть симуляцію, де два кубики кидаються велику кількість разів. Для кожного кидка визначте суму чисел, які випали на обох кубиках. Підрахуйте, скільки разів кожна можлива сума (від 2 до 12) з’являється у процесі симуляції. Використовуючи ці дані, обчисліть імовірність кожної суми.

На основі проведених імітацій створіть таблицю або графік, який відображає ймовірності кожної суми, виявлені за допомогою методу Монте-Карло.

Таблиця ймовірностей сум при киданні двох кубиків виглядає наступним чином.

Screenshoot

Порівняйте отримані за допомогою методу Монте-Карло результати з аналітичними розрахунками, наведеними в таблиці вище.

Критерії прийняття фiнального проєкту

Завдання 1:

  • Реалізовано функцію реверсування однозв'язного списку, яка змінює посилання між вузлами. Код виконується.
  • Програмно реалізовано алгоритм сортування (функцію) для однозв'язного списку. Код виконується.
  • Реалізовано функцію, що об'єднує два відсортовані однозв'язні списки в один відсортований список. Код виконується.

Завдання 2:

  • Код виконується. Програма візуалізує фрактал “дерево Піфагора”.
  • Користувач має можливість вказати рівень рекурсії.

Завдання 3:

  • Програмно реалізовано алгоритм Дейкстри для знаходження найкоротшого шляху у графі з використанням бінарної купи (піраміди).
  • У межах реалізації завдання створено граф, використано піраміду для оптимізації вибору вершин та виконано обчислення найкоротших шляхів від початкової вершини до всіх інших.

Завдання 4:

  • Код виконується. Функція візуалізує бінарну купу.

Завдання 5:

  • Програмно реалізовано алгоритми DFS і BFS для візуалізації обходу дерева в глибину та в ширину. Використано стек та чергу.
  • Кольори вузлів змінюються від темних до світлих відтінків залежно від порядку обходу.

Завдання 6:

  • Програмно реалізовано функцію, яка використовує принцип жадібного алгоритму. Код виконується і повертає назви страв, максимізуючи співвідношення калорій до вартості, не перевищуючи заданий бюджет.
  • Програмно реалізовано функцію, яка використовує принцип динамічного програмування. Код виконується і повертає оптимальний набір страв для максимізації калорійності при заданому бюджеті.

Завдання 7:

  • Програмно реалізовано алгоритм для моделювання кидання двох ігрових кубиків і побудови таблиці сум та їх імовірностей за допомогою методу Монте-Карло.
  • Код виконується та імітує велику кількість кидків кубиків, обчислює суми чисел, які випадають на кубиках, підраховує, скільки разів кожна можлива сума з’являється у процесі симуляції, і визначає ймовірність кожної можливої суми.
  • Створено таблицю або графік, який відображає ймовірності кожної суми, виявлені за допомогою методу Монте-Карло.
  • Зроблено висновки щодо правильності розрахунків шляхом порівняння отриманих за допомогою методу Монте-Карло результатів та результатів аналітичних розрахунків. Висновки оформлено у вигляді файлу readme.md фінального завдання.

Висновки

Завдання 1:

Screenshoot

Завдання 2:

Screenshoot

Screenshoot

Завдання 3:

Screenshoot

Таблиця відображає найкоротші відстані між кожним містом і всіма іншими містами за допомогою алгоритму Дейкстри

City Kyiv Kharkiv Odesa Dnipro Lviv
Kyiv (0) 0 477 475 477 540
Kharkiv (0) 477 0 659 213 1017
Odesa (0) 475 659 0 446 1015
Dnipro (0) 477 213 446 0 861
Lviv (0) 540 1017 1015 861 0

Завдання 4:

Код реалізує алгоритм побудови бінарного дерева з купи (піраміди) та його візуалізацію

Screenshoot

Завдання 5:

  • Код реалізує обхід дерева в ширину та в глибину.
  • Обходи виконуються за допомогою черги (для BFS) та стеку (для DFS)
  • Візуалізація дерева виконана за допомогою NetworkX та Matplotlib, що надає інтуїтивне уявлення про структуру дерева та порядок обходу вузлів.
  • Використання кольорів для відображення порядку обходу робить візуалізацію більш зрозумілою та легкою для аналізу.

Screenshoot

Завдання 6:

  • Код реалізує дві функції для вибору продуктів з максимальним вмістом калорій в межах заданого бюджету.
  • Це дві різні стратегії: жадібний алгоритм і алгоритм динамічного програмування.
  • Алгоритм динамічного програмування надає оптимальний набір страв, забезпечуючи максимальну калорійність в межах бюджету.

Screenshoot

Завдання 7:

Результати симуляцій близькі до аналітичних ймовірностей, що підтверджує коректність методу Монте-Карло для цієї задачі. Невеликі розбіжності можуть бути зумовлені випадковістю і кількістю ітерацій симуляцій.

Сума Монте-Карло (%) Аналітична ймовірність (%)
2 2.7822 2.78
3 5.5705 5.56
4 8.3171 8.33
5 11.0857 11.11
6 13.8897 13.89
7 16.6814 16.67
8 13.9222 13.89
9 11.1069 11.11
10 8.3335 8.33
11 5.5272 5.56
12 2.7836 2.78

Графік, побудований для симуляції ймовірностей сум при киданні двох кубиків, надає візуальне уявлення про розподіл ймовірностей кожної можливої суми від 2 до 12.

Screenshoot

About

Master's | Basic Algorithms & Data structures | Final Project


Languages

Language:Python 100.0%