Skip to content
This repository has been archived by the owner on Dec 28, 2023. It is now read-only.

[task_03] Add solution #369

Open
wants to merge 21 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
59b74cb
add doc in task_03
Pozitivchikkk3 Dec 14, 2023
da80196
add src in task_03
Pozitivchikkk3 Dec 14, 2023
370be8b
Merge branch 'main' into task--3
Pozitivchikkk3 Dec 15, 2023
5fc3ff5
Merge branch 'main' into task--3
Ghokury Dec 15, 2023
fd279cf
Update readme.md
Pozitivchikkk3 Dec 15, 2023
e80730d
Changes made: Removed unnecessary imports (simpledialog was not used…
Pozitivchikkk3 Dec 16, 2023
a5242d5
Now, the labels for "Add Edge," "Choose Color," and "Shortest Path" a…
Pozitivchikkk3 Dec 16, 2023
828d7b9
Merge branch 'main' into task--3
Pozitivchikkk3 Dec 16, 2023
c9c6bd8
Codacy Static Code Analysis потребовал добавить 2 пустые строки после…
Pozitivchikkk3 Dec 17, 2023
8c8602a
Merge branch 'task--3' of https://github.com/Pozitivchikkk3/OTIS-2023…
Pozitivchikkk3 Dec 17, 2023
06bc715
Merge branch 'main' into task--3
VolkogonNikita Dec 18, 2023
8954c6d
Merge branch 'main' into task--3
Pozitivchikkk3 Dec 19, 2023
6ebfa2b
Merge branch 'main' into task--3
VolkogonNikita Dec 20, 2023
1ca6697
Update readme.md
Pozitivchikkk3 Dec 21, 2023
6ab267a
Merge branch 'main' into task--3
VolkogonNikita Dec 21, 2023
5ea16b6
Merge branch 'main' into task--3
alkurash Dec 22, 2023
bc12177
Merge branch 'main' into task--3
VolkogonNikita Dec 24, 2023
7d88458
Merge branch 'main' into task--3
VolkogonNikita Dec 25, 2023
ec533d6
Merge branch 'main' into task--3
VolkogonNikita Dec 27, 2023
753cb79
Merge branch 'main' into task--3
VolkogonNikita Dec 27, 2023
6fdb9cc
Merge branch 'main' into task--3
alkurash Dec 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions trunk/ii02404/task_03/SRC/3labOTIS.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#include <iostream>
#include <cstdlib>

int main() {
// Замените "path/to/your/script.py" на путь к вашему Python-скрипту
std::string command = "python W:/projects/helloworld/main.py";

// Выполнение команды с использованием subprocess
int result = std::system(command.c_str());

if (result == 0) {
std::cout << "Python script executed successfully." << std::endl;
} else {
std::cerr << "Error executing Python script." << std::endl;
}

return 0;
}


7 changes: 7 additions & 0 deletions trunk/ii02404/task_03/SRC/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 3.6)

project(helloworld)

set(SOURCES 3labOTIS.cpp)

add_executable(MExecutable ${SOURCES})
92 changes: 92 additions & 0 deletions trunk/ii02404/task_03/SRC/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import tkinter as tk
from tkinter import simpledialog, colorchooser, messagebox
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

class GraphEditor:
ADD_EDGE_LABEL = "Add Edge"
CHOOSE_COLOR_LABEL = "Choose Color"
SHORTEST_PATH_LABEL = "Shortest Path"

def __init__(self, root):
self.root = root
self.root.title("Graph Editor")

self.graph = nx.Graph()
self.node_colors = {} # Dictionary to store node colors
self.figure, self.ax = plt.subplots()
self.canvas = FigureCanvasTkAgg(self.figure, master=root)
self.canvas_widget = self.canvas.get_tk_widget()
self.canvas_widget.pack(side=tk.TOP, fill=tk.BOTH, expand=1)

self.menu = tk.Menu(root)
root.config(menu=self.menu)

self.graph_menu = tk.Menu(self.menu, tearoff=0)
self.menu.add_cascade(label="Graph", menu=self.graph_menu)
self.graph_menu.add_command(label="Add Vertex", command=self.add_vertex)
self.graph_menu.add_command(label=self.ADD_EDGE_LABEL, command=self.add_edge)

self.color_menu = tk.Menu(self.menu, tearoff=0)
self.menu.add_cascade(label="Node Color", menu=self.color_menu)
self.color_menu.add_command(label=self.CHOOSE_COLOR_LABEL, command=self.choose_color)

self.algorithm_menu = tk.Menu(self.menu, tearoff=0)
self.menu.add_cascade(label="Algorithms", menu=self.algorithm_menu)
self.algorithm_menu.add_command(label=self.SHORTEST_PATH_LABEL, command=self.shortest_path)
self.algorithm_menu.add_command(label="Eulerian Path", command=self.eulerian_path)

def add_vertex(self):
vertex = simpledialog.askstring("Add Vertex", "Enter Vertex Label:")
if vertex:
self.graph.add_node(vertex)
self.node_colors[vertex] = "skyblue" # Default color
self.draw_graph()

def add_edge(self):
edge_start = simpledialog.askstring(self.ADD_EDGE_LABEL, "Enter Start Vertex Label:")
edge_end = simpledialog.askstring(self.ADD_EDGE_LABEL, "Enter End Vertex Label:")
edge_length = simpledialog.askfloat(self.ADD_EDGE_LABEL, "Enter Edge Length:")
if edge_start and edge_end and edge_length:
self.graph.add_edge(edge_start, edge_end, length=edge_length)
self.draw_graph()

def choose_color(self):
selected_vertex = simpledialog.askstring(self.CHOOSE_COLOR_LABEL, "Enter Vertex Label:")
if selected_vertex:
color = colorchooser.askcolor(title=self.CHOOSE_COLOR_LABEL)[1]
self.node_colors[selected_vertex] = color
self.draw_graph()

def draw_graph(self):
self.ax.clear()
pos = nx.spring_layout(self.graph)
node_colors = [self.node_colors[node] for node in self.graph.nodes]
nx.draw(self.graph, pos, with_labels=True, ax=self.ax, node_size=700, node_color=node_colors)
labels = nx.get_edge_attributes(self.graph, "length")
nx.draw_networkx_edge_labels(self.graph, pos, edge_labels=labels, ax=self.ax)
self.canvas.draw()

def shortest_path(self):
try:
start_vertex = simpledialog.askstring(self.SHORTEST_PATH_LABEL, "Enter Start Vertex Label:")
end_vertex = simpledialog.askstring(self.SHORTEST_PATH_LABEL, "Enter End Vertex Label:")
path = nx.shortest_path(self.graph, source=start_vertex, target=end_vertex, weight="length")
length = nx.shortest_path_length(self.graph, source=start_vertex, target=end_vertex, weight="length")
messagebox.showinfo(self.SHORTEST_PATH_LABEL, f"Shortest Path: {path}\nLength: {length}")
except nx.NetworkXNoPath:
messagebox.showerror("Error", "No path found between the specified vertices.")

def eulerian_path(self):
try:
path = nx.eulerian_circuit(self.graph)
messagebox.showinfo("Eulerian Path", f"Eulerian Path: {list(path)}")
except nx.NetworkXError:
messagebox.showerror("Error", "No Eulerian path found in the graph.")


if __name__ == "__main__":
root = tk.Tk()
app = GraphEditor(root)
root.mainloop()
Binary file added trunk/ii02404/task_03/doc/i1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added trunk/ii02404/task_03/doc/i2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added trunk/ii02404/task_03/doc/i3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added trunk/ii02404/task_03/doc/i4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added trunk/ii02404/task_03/doc/i5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added trunk/ii02404/task_03/doc/i6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added trunk/ii02404/task_03/doc/i7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added trunk/ii02404/task_03/doc/i8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added trunk/ii02404/task_03/doc/i9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
64 changes: 64 additions & 0 deletions trunk/ii02404/task_03/doc/report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<p align="center"> Министерство образования Республики Беларусь</p>
<p align="center">Учреждение образования</p>
<p align="center">“Брестский Государственный технический университет”</p>
<p align="center">Кафедра ИИТ</p>
<br><br><br><br><br><br><br>
<p align="center">Лабораторная работа №3</p>
<p align="center">По дисциплине “Общая теория интеллектуальных систем”</p>
<p align="center">Тема: “Разработка редакторов графов”</p>
<br><br><br><br><br>
<p align="right">Выполнил:</p>
<p align="right">Студент 2 курса</p>
<p align="right">Группы ИИ-24</p>
<p align="right">Капуза Н. А.</p>
<p align="right">Проверил:</p>
<p align="right">Иванюк Д. С.</p>
<br><br><br><br><br>
<p align="center">Брест 2023</p>

---

# Задание
1. Разработать и реализовать программный продукт позволяющий редактировать графовые конструкции различных видов и производить над ними различные действия. Язык программирования - любой.

2. Редактор должен позволять :
a) одновременно работать с несколькими графами (MDI);
c) задавать имена графам;
d) сохранять и восстанавливать граф во внутреннем формате программы;
e) экспортировать и импортировать граф в текстовый формат (описание см. ниже);
f) создавать, удалять, именовать, переименовывать, перемещать узлы;
g) создавать ориентированные и неориентированные дуги, удалять дуги;
h) добавлять, удалять и редактировать содержимое узла (содержимое в виде текста и ссылки на файл);
i) задавать цвет дуги и узла, образ узла;


3. Программный продукт должен позволять выполнять следующие операции:
b) поиск всех путей (маршрутов) между двумя узлами и кратчайших;
c) вычисление расстояния между двумя узлами;
d) вычисление диаметра, радиуса, центра графа;
g) нахождения эйлеровых циклов;

4. Формат текстового представления графа: <ГРАФ> ::= <ИМЯ ГРАФА> : UNORIENT | ORIENT ; <ОПИСАНИЕ УЗЛОВ> ; <ОПИСАНИЕ СВЯЗЕЙ> . <ИМЯ ГРАФА> ::= <ИДЕНТИФИКАТОР> <ОПИСАНИЕ УЗЛОВ> ::= <ИМЯ УЗЛА> [ , <ИМЯ УЗЛА> …] <ИМЯ УЗЛА> ::= <ИДЕНТИФИКАТОР> <ОПИСАНИЕ СВЯЗЕЙ> ::= <ИМЯ УЗЛА> -> <ИМЯ УЗЛА> [ , <ИМЯ УЗЛА> …] ; [<ОПИСАНИЕ СВЯЗЕЙ> …]

5. Написать отчет по выполненной лабораторной работе в .md формате (readme.md). Разместить его в следующем каталоге: trunk\ii0xxyy\task_03\doc (где xx - номер группы, yy - номер студента, например ii02404).

6. Исходный код разработанной программы разместить в каталоге: trunk\ii0xxyy\task_03\src.

# Рабочее окно:
![](i1.png)
# Добавление вершин:
![](i2.png)
# Cоединение вершин ребрами:
![](img3.png)
# Перемещение вершин:
![](i4.png)
# Изменение веса ребер:
![](i5.png)
# Изменение цвета вершин, ребер:
![](i6.png)
# Удаление ребер и вершин:
![](i7.png)
# Кратчайший путь:
![](i8.png)
# Эйлеров путь:
![](i9.png)