Maby baby

This commit is contained in:
Ivan Kalivan 2024-05-22 21:49:42 +03:00
parent b83f2cf07b
commit 522f268e1b
13 changed files with 417 additions and 402 deletions

View File

@ -0,0 +1,223 @@
using ISEbd_11_CoursePaper_Dmitriev_Andrey.Storage;
namespace ISEbd_11_CoursePaper_Dmitriev_Andrey.Algoritm;
/// <summary>
/// Реализатор (Алгоритм Дейкстры)
/// </summary>
public class Realizer
{
/// <summary>
/// Бесконечность константа
/// (макс. знач. типа int)
/// </summary>
const int INF = int.MaxValue;
/// <summary>
/// Состояние
/// </summary>
public State state;
/// <summary>
/// Матрица смежности
/// </summary>
private List<List<int>> _abjacencyMatrix;
/// <summary>
/// Список вершин
/// </summary>
private List<int> _vertex;
/// <summary>
/// Число вершин
/// </summary>
private int _countVertex;
/// <summary>
/// Список минимально возможных растояний до вершин
/// 0 - начальная точка
/// </summary>
private List<int> _coust;
/// <summary>
/// Список вершин в которых были:
/// true - были
/// falsr - небыли
/// </summary>
private List<bool> _known;
/// <summary>
/// Список вершин из которых пришли в вершину индекса
/// -1 - начальная вершина или ещё не известно
/// </summary>
private List<int> _path;
/// <summary>
/// Стек для прохода по графу
/// </summary>
private Stack<int> _visitedStack;
/// <summary>
/// Текущий шаг цикла алгоритма
/// </summary>
private int _currentStep;
/// <summary>
/// Текущая вершина
/// </summary>
private int _currentVertex;
/// <summary>
/// Список текущих смежных вершин
/// </summary>
private List<int> _currentEdges;
/// <summary>
/// Индекс текущей смежной вершины
/// </summary>
private int _currentIndEdge;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="parameters">Параметры</param>
public Realizer(StartParameters parameters)
{
_abjacencyMatrix = parameters.abjacencyMatrix;
_vertex = parameters.vertex;
_countVertex = _vertex.Count;
_coust = parameters.coust;
_known = new List<bool>(Enumerable.Repeat(false, _countVertex)); // Заполняем весь список false-ами
_path = new List<int>(Enumerable.Repeat(-1, _countVertex)); // Заполняем весь список -1-ами
_visitedStack = new Stack<int>();
_currentStep = 1;
_currentVertex = -1;
}
/// <summary>
/// Шаг Алгоритма
/// </summary>
public void StepAlg()
{
switch (_currentStep)
{
case 1:
_countVertex = FindNextVertex(); // Получение текущей вершины
if (_countVertex == -1) _countVertex = _visitedStack.Pop(); // Если не нашли вершину то откатываемся назад по стеку
else _visitedStack.Push(_countVertex); // Если нашли - кладём в стек
_currentEdges = FindEdge(); // определяем смежные вершины к текущей
_currentIndEdge = 0;
_currentStep++;
break;
case 2:
if (!_known[_countVertex]) _known[_countVertex] = true; // Отображаем что мы были в этой вершине если в ней не были
else _currentStep = 1; // Возвращаемся к 1 шагу если мы уже были в этой вершие
_currentStep++;
break;
case 3:
// Проходимся по всем смежным вершинам и устанавливаем им соответсвующие значения
if (_currentIndEdge < _currentEdges.Count)
{
_path[_currentEdges[_currentIndEdge]] = _currentVertex;
_coust[_currentEdges[_currentIndEdge]] = _coust[_currentVertex] + _abjacencyMatrix[_currentVertex][_currentIndEdge];
_currentIndEdge++;
break;
}
// После прохода по вершинам возвращаемся к 1 шагу
_currentStep = 1;
break;
}
}
/// <summary>
/// Сохранение состояния
/// </summary>
public void SaveState()
{
// TODO Объявлять как новые списки все списки
state = new State(_abjacencyMatrix, _vertex, _coust, _known, _path, _visitedStack, _currentStep, _currentVertex, _currentEdges, _currentIndEdge);
}
/// <summary>
/// Загрузка состояния
/// </summary>
/// <param name="state">Статус</param>
public void LoadState(State state)
{
// TODO Объявлять как новые списки все списки
this.state = state;
_abjacencyMatrix = state.abjacencyMatrix;
_vertex = state.vertex;
_coust = state.coust;
_known = state.known;
_path = state.path;
_visitedStack = state.visitedStack;
_currentStep = state.currentStep;
_currentVertex = state.currentVertex;
_currentEdges = state.currentEdges;
_currentIndEdge = state.currentIndEdge;
}
/// <summary>
/// Поиск следующей вершины
/// </summary>
/// <returns>Следующую вершину с наименьшей длинной</returns>
private int FindNextVertex()
{
int ind = -1;
int value = INF;
// Поиск последующих элементов
if (_currentVertex != -1)
{
List<int> indsEdge = FindEdge();
List<int> weightEdge = _abjacencyMatrix[_currentVertex];
foreach (int i in indsEdge)
{
if (!_known[i] && weightEdge[i] < value)
{
ind = i;
value = _coust[i];
}
}
}
// Поиск начального элемента
else
{
for (int i = 0; i < _countVertex; i++)
{
if (value > _coust[i])
{
return i;
}
}
}
return ind;
}
/// <summary>
/// Поиск наименований смежных с текущей вершиной вершин
/// </summary>
/// <returns>Список смежных вершин</returns>
private List<int> FindEdge()
{
List<int> indsEdge = new List<int>();
List<int> edge = _abjacencyMatrix[_currentVertex];
for (int i = 0; i < _countVertex; i++)
{
if (edge[i] >= 0)
{
indsEdge.Add(i);
}
}
return indsEdge;
}
}

View File

@ -0,0 +1,36 @@

namespace ISEbd_11_CoursePaper_Dmitriev_Andrey.Algoritm;
/// <summary>
/// Стартовые параметры
/// </summary>
public class StartParameters
{
/// <summary>
/// Матрица смежности
/// </summary>
public List<List<int>> abjacencyMatrix;
/// <summary>
/// Список вершин
/// </summary>
public List<int> vertex;
/// <summary>
/// Список минимально возможных растояний до вершин
/// </summary>
public List<int> coust;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="abjacencyMatrix">Матрица смежности</param>
/// <param name="vertex">Список вершинparam>
/// <param name="coust">Список минимально возможных растояний до вершин</param>
public StartParameters(List<List<int>> abjacencyMatrix, List<int> vertex, List<int> coust)
{
this.abjacencyMatrix = abjacencyMatrix;
this.vertex = vertex;
this.coust = coust;
}
}

View File

@ -54,7 +54,7 @@ public partial class InsertParametresForm : Form
}
else if (i * j > i * i)
{
int k = random.Next(-1, 10);
int k = random.Next(-1, 3);
textBox.Text = (k == 0 ? -1 : k).ToString();
//textBox.Text = "1";
}
@ -84,31 +84,7 @@ public partial class InsertParametresForm : Form
}
private void buttonAccept_Click(object sender, EventArgs e)
{
int[][] arrayExp = new int[8][];
for (int i = 0; i < 8; i++)
{
arrayExp[i] = new int[8];
}
for (int i = 1; i < 9; i++)
{
for (int j=i; j < 9; j++)
{
arrayExp[i-1][j-1] = int.Parse(textBoxes[i, j].Text);
arrayExp[j-1][i-1] = int.Parse(textBoxes[i, j ].Text);
}
}
int[] ar = new int[8]
{
INF,INF, INF, INF, INF, INF,INF, INF
};
ar[(int)numericUpDownStV.Value - 1] = 0;
bool[] b = new bool[8]
{
false,false,false,false,false,false,false,false
};
delgateStpr.Invoke(new State(arrayExp , ar, b, (int)numericUpDownStV.Value - 1));
delgateStpr.Invoke(new State());
Close();
}

View File

@ -65,7 +65,6 @@
buttonBack.Size = new Size(57, 59);
buttonBack.TabIndex = 10;
buttonBack.UseVisualStyleBackColor = false;
buttonBack.Click += buttonBack_Click;
//
// buttonNext
//
@ -77,7 +76,6 @@
buttonNext.Size = new Size(62, 59);
buttonNext.TabIndex = 11;
buttonNext.UseVisualStyleBackColor = false;
buttonNext.Click += buttonNext_Click;
//
// buttonStart
//
@ -91,7 +89,6 @@
buttonStart.TabIndex = 12;
buttonStart.Text = "Старт";
buttonStart.UseVisualStyleBackColor = false;
buttonStart.Click += buttonStart_Click;
//
// buttonFullBack
//
@ -152,7 +149,6 @@
ToolStripMenuItemInfo.Name = "ToolStripMenuItemInfo";
ToolStripMenuItemInfo.Size = new Size(355, 32);
ToolStripMenuItemInfo.Text = "Информация об Алгоритме";
ToolStripMenuItemInfo.Click += ToolStripMenuItemInfo_Click;
//
// menuStrip
//

View File

@ -7,85 +7,8 @@ namespace ISEbd_11_CoursePaper_Dmitriev_Andrey;
public partial class MainForm : Form
{
private Visualizer Visualizer;
private State state;
private StateStorage statestorage;
private Manager manager;
private TextBox[] textBoxsWay;
private TextBox[] textBoxsWeight;
public MainForm()
{
InitializeComponent();
textBoxsWay = new TextBox[9];
textBoxsWeight = new TextBox[8];
Visualizer = new(pictureBoxDeiktsra);
}
private void CreateTable(int startInd, int[] Ways, int[] Weight)
{
tableLayoutPanelMinInf.Controls.Clear();
TextBox id = new TextBox();
id.Text = "id";
textBoxsWay[0] = new TextBox();
textBoxsWay[0].Text = (startInd+1).ToString();
TextBox w = new TextBox();
w.Text = "Weight";
tableLayoutPanelMinInf.Controls.Add(id, 0, 0);
tableLayoutPanelMinInf.Controls.Add(textBoxsWay[0], 1, 0);
tableLayoutPanelMinInf.Controls.Add(w, 2, 0);
for (int i = 1; i < 9; i++)
{
id = new TextBox();
id.Text = i.ToString();
textBoxsWay[i] = new TextBox();
textBoxsWay[i].Text = Ways[i - 1].ToString();
textBoxsWeight[i-1] = new TextBox();
textBoxsWeight[i-1].Text = Weight[i-1].ToString();
tableLayoutPanelMinInf.Controls.Add(id, 0, i);
tableLayoutPanelMinInf.Controls.Add(textBoxsWay[i], 1, i);
tableLayoutPanelMinInf.Controls.Add(textBoxsWeight[i - 1], 2, i);
}
}
private void SetStat(State state)
{
this.state = state;
Bitmap bitmap = new Bitmap(Width, Height);
Graphics g = Graphics.FromImage(bitmap);
Visualizer.DrawState(state, g);
CreateTable(state.id, state.Veretex[state.id], state.Weight);
pictureBoxDeiktsra.Image = bitmap;
statestorage = new StateStorage();
manager = new Manager(new StartParameters(state.Veretex, state.Weight, state.Visited, state.id));
}
private void buttonStart_Click(object sender, EventArgs e)
{
InsertParametresForm insertParametersForm = new InsertParametresForm();
insertParametersForm.AddEvent(SetStat);
insertParametersForm.Show();
}
private void ToolStripMenuItemInfo_Click(object sender, EventArgs e)
{
InformationForm inf = new InformationForm();
inf.ShowDialog();
}
private void buttonBack_Click(object sender, EventArgs e)
{
}
private void buttonNext_Click(object sender, EventArgs e)
{
statestorage = manager.MakeStep();
state = statestorage.GetStatus();
Bitmap bitmap = new Bitmap(Width, Height);
Graphics g = Graphics.FromImage(bitmap);
Visualizer.DrawState(state, g);
CreateTable(state.id, state.Veretex[state.id], state.Weight);
pictureBoxDeiktsra.Image = bitmap;
}
}

View File

@ -1,24 +0,0 @@
using System;
using System.Data.SqlTypes;
using System.Reflection.Metadata;
using System.Windows.Forms;
using ISEbd_11_CoursePaper_Dmitriev_Andrey.Storage;
namespace ISEbd_11_CoursePaper_Dmitriev_Andrey;
public class Manager
{
Realizer Realizer;
StateStorage Storage = new StateStorage();
public Manager(StartParameters startparametres)
{
Realizer = new(startparametres);
}
public StateStorage MakeStep()
{
Realizer.Step();
Realizer.SetState();
Storage.AddState(Realizer.state);
return Storage;
}
}

View File

@ -0,0 +1,44 @@

using ISEbd_11_CoursePaper_Dmitriev_Andrey.Algoritm;
using ISEbd_11_CoursePaper_Dmitriev_Andrey.Storage;
namespace ISEbd_11_CoursePaper_Dmitriev_Andrey.Menegment;
/// <summary>
/// Менеджер
/// </summary>
public class Manager
{
/// <summary>
/// Список состояний
/// </summary>
private StateStorage _storage = new();
/// <summary>
/// Реализатор
/// </summary>
private Realizer _dijkstra;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="parameters">Параметры</param>
public Manager(StartParameters parameters)
{
_dijkstra = new Realizer(parameters);
_dijkstra.SaveState();
_storage.AddState(_dijkstra.state);
}
/// <summary>
/// Логика шага и записи состояния в список
/// </summary>
/// <returns>Хранилище состояний</returns>
public StateStorage MakeStep()
{
_dijkstra.StepAlg();
_dijkstra.SaveState();
_storage.AddState(_dijkstra.state);
return _storage;
}
}

View File

@ -0,0 +1,11 @@

namespace ISEbd_11_CoursePaper_Dmitriev_Andrey.Menegment;
public class Visualizer
{
//int radius = 50;
//int centerX = pictureBox.Width / 2;
//int centerY = pictureBox.Height / 2;
//int x1 = centerX + 3 * (int)(Math.Cos(2 * Math.PI * j / state.Veretex.Length) * radius);
//int y1 = centerY + 3 * (int)(Math.Sin(2 * Math.PI * j / state.Veretex.Length) * radius);
}

View File

@ -1,109 +0,0 @@
using ISEbd_11_CoursePaper_Dmitriev_Andrey.Storage;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Text.Json;
using System.Windows.Forms;
namespace ISEbd_11_CoursePaper_Dmitriev_Andrey;
public class Realizer
{
public State state;
int[][] Veretex;
/// <summary>
/// Known
/// </summary>
bool[] Visited;
/// <summary>
/// Cost
/// </summary>
int[] Weight;
int id;
//public Realizer(int[][] vertex, int[] mass)
//{
// Veretex = vertex;
// state = state;
//}
public Realizer(StartParameters parametres)
{
Veretex = parametres.Vertex;
Weight = parametres.ints;
Visited = parametres.bools;
id = parametres.id;
}
public void SetState()
{
state = new State(Veretex, Weight, Visited, id);
}
public void ReturnState(State state)
{
this.state = state;
Veretex = state.Veretex;
Visited = state.Visited;
Weight = state.Weight;
}
public void Step()
{
int ind = FideIndMin(GetArrayDontVisited(Weight, Visited));
Visited[id] = true;
int[] way = Veretex[id];
for (int i = 0 ; i < way.Length; i++)
{
if (way[i] > 0)
{
if (Weight[id] + way[i] < Weight[i] && !Visited[i])
{
Weight[i] = way[i] + Weight[id];
}
}
}
id = ind;
}
private int FideIndMin(int[] list)
{
int id = 0;
int min = list[0];
for (int i = 0; i < list.Length; i++)
{
if (list[i] < min)
{
min = list[i];
id = i;
}
}
return id;
}
private int[] GetArrayDontVisited(int[] list, bool[] visit)
{
int[] ajens = Veretex[id];
int[] array = new int[list.Length];
for(int i = 0;i < list.Length;i++)
{
if (visit[i] || ajens[i] == -1)
{
array[i] = int.MaxValue;
}
else
{
array[i] = list[i];
}
}
return array;
}
}

View File

@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
namespace ISEbd_11_CoursePaper_Dmitriev_Andrey;
public class StartParameters
{
public int[][] Vertex;
public int[] ints;
public bool[] bools;
public int id;
public StartParameters(int[][] Vertex, int[] ints, bool[] bools, int id)
{
this.Vertex = Vertex;
this.ints = ints;
this.bools = bools;
this.id = id;
}
}

View File

@ -1,32 +1,95 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ISEbd_11_CoursePaper_Dmitriev_Andrey.Storage;
/// <summary>
/// Состояние работы алгоритма
/// </summary>
public class State
{
public int id { get; set; }
public int[][] Veretex { get; set; }
/// <summary>
/// Known
/// Матрица смежности
/// </summary>
public bool[] Visited { get; set; }
/// <summary>
/// Cost
/// </summary>
public int[] Weight { get; set; }
public List<List<int>> abjacencyMatrix;
public State(int[][] veretex, int[] Weight, bool[] Visited, int id)
/// <summary>
/// Список вершин
/// </summary>
public List<int> vertex;
/// <summary>
/// Число вершин
/// </summary>
public int countVertex;
/// <summary>
/// Список минимально возможных растояний до вершин
/// 0 - начальная точка
/// </summary>
public List<int> coust;
/// <summary>
/// Список вершин в которых были:
/// true - были
/// falsr - небыли
/// </summary>
public List<bool> known;
/// <summary>
/// Список вершин из которых пришли в вершину индекса
/// -1 - начальная вершина или ещё не известно
/// </summary>
public List<int> path;
/// <summary>
/// Стек для прохода по графу
/// </summary>
public Stack<int> visitedStack;
/// <summary>
/// Текущий шаг цикла алгоритма
/// </summary>
public int currentStep;
/// <summary>
/// Текущая вершина
/// </summary>
public int currentVertex;
/// <summary>
/// Список текущих смежных вершин
/// </summary>
public List<int> currentEdges;
/// <summary>
/// Индекс текущей смежной вершины
/// </summary>
public int currentIndEdge;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="abjacencyMatrix">Матрица смежности</param>
/// <param name="vertex">Список вершин</param>
/// <param name="coust">Список минимально возможных растояний до вершин</param>
/// <param name="known">Список вершин в которых были</param>
/// <param name="path">Список вершин из которых пришли в вершину индекса</param>
/// <param name="visitedStack">Стек для прохода по графу</param>
/// <param name="currentStep">Текущий шаг цикла алгоритма</param>
/// <param name="currentVertex">Текущая вершина</param>
/// <param name="currentEdges">Список текущих смежных вершин</param>
/// <param name="currentIndEdge">Индекс текущей смежной вершины</param>
public State(List<List<int>> abjacencyMatrix, List<int> vertex, List<int> coust, List<bool> known, List<int> path, Stack<int> visitedStack, int currentStep, int currentVertex, List<int> currentEdges, int currentIndEdge)
{
this.Veretex = veretex;
this.Weight = Weight;
this.Visited = Visited;
this.id = id;
this.abjacencyMatrix = abjacencyMatrix;
this.vertex = vertex;
this.countVertex = vertex.Count;
this.coust = coust;
this.known = known;
this.path = path;
this.visitedStack = visitedStack;
this.currentStep = currentStep;
this.currentVertex = currentVertex;
this.currentEdges = currentEdges;
this.currentIndEdge = currentIndEdge;
}
}

View File

@ -1,20 +1,28 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;

namespace ISEbd_11_CoursePaper_Dmitriev_Andrey.Storage;
/// <summary>
/// Хранилище состояний
/// </summary>
public class StateStorage
{
private List<State> states = new List<State>();
/// <summary>
/// Список состояний
/// </summary>
List<State> states = new List<State>();
/// <summary>
/// Индекс текущего состояния
/// </summary>
private int _currentStatus = -1;
/// <summary>
/// Добавление состояния в список
/// </summary>
/// <param name="state">Состояние</param>
public void AddState(State state)
{
states.Add(state);
_currentStatus++;
}
/// <summary>
@ -47,6 +55,7 @@ public class StateStorage
/// <summary>
/// Получить установленный статус
/// </summary>
/// <returns>Текущее состояние</returns>
public State GetStatus()
{
return states[_currentStatus];
@ -71,6 +80,4 @@ public class StateStorage
{
// TODO Сделать загрузку
}
}

View File

@ -1,110 +0,0 @@
using ISEbd_11_CoursePaper_Dmitriev_Andrey.Storage;
using System;
using System.Drawing;
using System.Windows.Forms;
namespace ISEbd_11_CoursePaper_Dmitriev_Andrey;
public class Visualizer
{
private Pen pen = new Pen(Color.White, 2);
private Pen penV = new Pen(Color.Red, 11);
private PictureBox pictureBox;
private List<int> lines = new List<int>();
public Visualizer(PictureBox pictureBox)
{
this.pictureBox = pictureBox;
this.pictureBox.Paint += PictureBox_Paint;
}
private void PictureBox_Paint(object sender, PaintEventArgs e)
{
if (pictureBox.Tag is State state)
{
DrawState(state, e.Graphics);
}
}
public void DrawState(State state, Graphics g)
{
lines.Add(state.id);
// Очищаем предыдущее изображение
g.Clear(pictureBox.BackColor);
// Параметры отрисовки
Brush brush = new SolidBrush(Color.White);
Font font = new Font("Arial", 15);
// Рассчитываем радиус и центр для кругов
int radius = 50;
int centerX = pictureBox.Width / 2;
int centerY = pictureBox.Height / 2;
// Отрисовываем круги в соответствии с текущим состоянием
for (int i = 0; i < state.Veretex.Length; i++)
{
int[] eges = state.Veretex[i];
// Вычисляем позицию для каждого круга
int x = centerX + 3* (int)(Math.Cos(2*Math.PI * i / state.Veretex.Length) * radius);
int y = centerY + 3* (int)(Math.Sin(2*Math.PI * i / state.Veretex.Length) * radius);
for (int j = 0; j < state.Veretex.Length; j++)
{
if (eges[j] != -1)
{
int x1 = centerX + 3 * (int)(Math.Cos(2 * Math.PI * j / state.Veretex.Length) * radius);
int y1 = centerY + 3 * (int)(Math.Sin(2 * Math.PI * j / state.Veretex.Length) * radius);
g.DrawLine(pen,x,y,x1,y1);
}
}
if(lines.Contains(i))
{
g.DrawEllipse(penV, x - radius / 2, y - radius / 2, radius, radius);
}
// Рисуем круг
g.FillEllipse(brush, x - radius / 2, y - radius / 2, radius, radius);
g.DrawEllipse(pen, x - radius / 2, y - radius / 2, radius, radius);
// Рисуем текст
string text = (i + 1).ToString();
SizeF textSize = g.MeasureString(text, font);
g.DrawString(text, font, Brushes.Black, x - textSize.Width / 2, y - textSize.Height / 2);
}
}
//public void DrawTable(int startInd, int[] Ways, int[] Weight, TextBox[] textBoxsWay, TextBox[] textBoxsWeight, TableLayoutPanel tableLayoutPanelMinInf)
//{
// TextBox id = new TextBox();
// id.Text = "id";
// textBoxsWay[0] = new TextBox();
// textBoxsWay[0].Text = (startInd + 1).ToString();
// TextBox w = new TextBox();
// w.Text = "Weight";
// tableLayoutPanelMinInf.Controls.Add(id, 0, 0);
// tableLayoutPanelMinInf.Controls.Add(textBoxsWay[0], 1, 0);
// tableLayoutPanelMinInf.Controls.Add(w, 2, 0);
// for (int i = 1; i < 9; i++)
// {
// id = new TextBox();
// id.Text = i.ToString();
// textBoxsWay[i] = new TextBox();
// textBoxsWay[i].Text = Ways[i - 1].ToString();
// textBoxsWeight[i - 1] = new TextBox();
// textBoxsWeight[i - 1].Text = Weight[i - 1].ToString();
// tableLayoutPanelMinInf.Controls.Add(id, 0, i);
// tableLayoutPanelMinInf.Controls.Add(textBoxsWay[i], 1, i);
// tableLayoutPanelMinInf.Controls.Add(textBoxsWeight[i - 1], 2, i);
// }
//}
public void UpdateVisualization(State state)
{
pictureBox.Tag = state;
pictureBox.Invalidate(); // Заставляем PictureBox перерисоваться
}
}