Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/lesiaukr/goit-algo-fp
Master's | Basic Algorithms & Data structures | Final Project
https://github.com/lesiaukr/goit-algo-fp
algorithms breadth-first-search-algorithm data-structures deapth-first-search goit-algo-fp monte-carlo
Last synced: about 1 month ago
JSON representation
Master's | Basic Algorithms & Data structures | Final Project
- Host: GitHub
- URL: https://github.com/lesiaukr/goit-algo-fp
- Owner: LesiaUKR
- Created: 2024-07-15T09:36:08.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2024-07-28T18:25:42.000Z (6 months ago)
- Last Synced: 2024-07-28T20:14:14.437Z (6 months ago)
- Topics: algorithms, breadth-first-search-algorithm, data-structures, deapth-first-search, goit-algo-fp, monte-carlo
- Language: Python
- Homepage:
- Size: 373 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# goit-algo-fp
# Homework | Final project
## Завдання 1. Структури даних. Сортування. Робота з однозв'язним списком
Для реалізації однозв'язного списку (приклад реалізації можна взяти з конспекту) необхідно:
- написати функцію, яка реалізує реверсування однозв'язного списку, змінюючи посилання між вузлами;
- розробити алгоритм сортування для однозв'язного списку, наприклад, сортування вставками або злиттям;
- написати функцію, що об'єднує два відсортовані однозв'язні списки в один відсортований список.## Завдання 2. Рекурсія. Створення фрактала “дерево Піфагора” за допомогою рекурсії
Необхідно написати програму на Python, яка використовує рекурсію для створення фрактала “дерево Піфагора”. Програма має візуалізувати фрактал “дерево Піфагора”, і користувач повинен мати можливість вказати рівень рекурсії.
![Screenshoot](./assets/pythagoras_tree.png)
## Завдання 3. Дерева, алгоритм Дейкстри
Розробіть алгоритм Дейкстри для знаходження найкоротших шляхів у зваженому графі, використовуючи бінарну купу. Завдання включає створення графа, використання піраміди для оптимізації вибору вершин та обчислення найкоротших шляхів від початкової вершини до всіх інших.
## Завдання 4. Візуалізація піраміди
Наступний код виконує побудову бінарних дерев. Виконайте аналіз коду, щоб зрозуміти, як він працює.
```python
import uuidimport networkx as nx
import matplotlib.pyplot as pltclass 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 graphdef 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](./assets/binary_tree.png)
Використовуючи як базу цей код, побудуйте функцію, що буде візуалізувати бінарну купу.
> [!NOTE]
> 👉🏻 Примітка. Суть завдання полягає у створенні дерева із купи.## Завдання 5. Візуалізація обходу бінарного дерева
Використовуючи код із завдання 4 для побудови бінарного дерева, необхідно створити програму на Python, яка візуалізує обходи дерева: у глибину та в ширину.
Вона повинна відображати кожен крок у вузлах з різними кольорами, використовуючи 16-систему RGB (приклад `#1296F0`). Кольори вузлів мають змінюватися від темних до світлих відтінків, залежно від послідовності обходу. Кожен вузол при його відвідуванні має отримувати унікальний колір, який візуально відображає порядок обходу.
> [!NOTE]
> 👉🏻 Примітка. Використовуйте стек та чергу, НЕ рекурсію## Завдання 6. Жадібні алгоритми та динамічне програмування
Необхідно написати програму на Python, яка використовує два підходи — жадібний алгоритм та алгоритм динамічного програмування для розв’язання задачі вибору їжі з найбільшою сумарною калорійністю в межах обмеженого бюджету.
Кожен вид їжі має вказану вартість і калорійність. Дані про їжу представлені у вигляді словника, де ключ — назва страви, а значення — це словник з вартістю та калорійністю.
```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](./assets/table_of_sum_probabilities_playing_dice.png)
Порівняйте отримані за допомогою методу Монте-Карло результати з аналітичними розрахунками, наведеними в таблиці вище.
## Критерії прийняття фiнального проєкту
### Завдання 1:
- Реалізовано функцію реверсування однозв'язного списку, яка змінює посилання між вузлами. Код виконується.
- Програмно реалізовано алгоритм сортування (функцію) для однозв'язного списку. Код виконується.
- Реалізовано функцію, що об'єднує два відсортовані однозв'язні списки в один відсортований список. Код виконується.### Завдання 2:
- Код виконується. Програма візуалізує фрактал “дерево Піфагора”.
- Користувач має можливість вказати рівень рекурсії.### Завдання 3:
- Програмно реалізовано алгоритм Дейкстри для знаходження найкоротшого шляху у графі з використанням бінарної купи (піраміди).
- У межах реалізації завдання створено граф, використано піраміду для оптимізації вибору вершин та виконано обчислення найкоротших шляхів від початкової вершини до всіх інших.### Завдання 4:
- Код виконується. Функція візуалізує бінарну купу.
### Завдання 5:
- Програмно реалізовано алгоритми DFS і BFS для візуалізації обходу дерева в глибину та в ширину. Використано стек та чергу.
- Кольори вузлів змінюються від темних до світлих відтінків залежно від порядку обходу.### Завдання 6:
- Програмно реалізовано функцію, яка використовує принцип жадібного алгоритму. Код виконується і повертає назви страв, максимізуючи співвідношення калорій до вартості, не перевищуючи заданий бюджет.
- Програмно реалізовано функцію, яка використовує принцип динамічного
програмування. Код виконується і повертає оптимальний набір страв для максимізації калорійності при заданому бюджеті.### Завдання 7:
- Програмно реалізовано алгоритм для моделювання кидання двох ігрових кубиків і побудови таблиці сум та їх імовірностей за допомогою методу Монте-Карло.
- Код виконується та імітує велику кількість кидків кубиків, обчислює суми чисел, які випадають на кубиках, підраховує, скільки разів кожна можлива сума з’являється у процесі симуляції, і визначає ймовірність кожної можливої суми.
- Створено таблицю або графік, який відображає ймовірності кожної суми, виявлені за допомогою методу Монте-Карло.
- Зроблено висновки щодо правильності розрахунків шляхом порівняння отриманих за допомогою методу Монте-Карло результатів та результатів аналітичних розрахунків. Висновки оформлено у вигляді файлу `readme.md` фінального завдання.---
# Висновки
### Завдання 1:
![Screenshoot](./assets/task_1.jpg)### Завдання 2:
![Screenshoot](./assets/task_2_1.jpg)![Screenshoot](./assets/task_2.jpg)
### Завдання 3:
![Screenshoot](./assets/task_3.jpg)Таблиця відображає найкоротші відстані між кожним містом і всіма іншими містами за допомогою алгоритму Дейкстри
| 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](./assets/task_4.webp)
### Завдання 5:
- Код реалізує обхід дерева в ширину та в глибину.
- Обходи виконуються за допомогою черги (для BFS) та стеку (для DFS)
- Візуалізація дерева виконана за допомогою NetworkX та Matplotlib, що надає інтуїтивне уявлення про структуру дерева та порядок обходу вузлів.
- Використання кольорів для відображення порядку обходу робить візуалізацію більш зрозумілою та легкою для аналізу.![Screenshoot](./assets/task_5.webp)
### Завдання 6:
- Код реалізує дві функції для вибору продуктів з максимальним вмістом калорій в межах заданого бюджету.
- Це дві різні стратегії: жадібний алгоритм і алгоритм динамічного програмування.
- Алгоритм динамічного програмування надає оптимальний набір страв, забезпечуючи максимальну калорійність в межах бюджету.![Screenshoot](./assets/task_6.jpg)
### Завдання 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](./assets/task_7.webp)