5. Giới thiệu chương trình
5.1.2. Công cụ vẽ hình ảnh để mô phỏng
CanvasDrawing: Xây dựng toàn bộ đồ thị nền trước, trong và sau khi mô phỏng.
EdgeDrawing: vẽ cạnh trước, trong và sau khi thực hiện thuật toán mô phỏng.
EntityDrawing: Chuyển đổi 2 chế độ: chế độ cho phép người dùng nhập một đồ thị đầu vào và chế độ mô phỏng.
VertexDrawing: vẽ đỉnh trước, trong và sau khi thực hiện thuật toán mô phỏng, những thay đổi giá trị trên các đỉnh cũng được thể hiện trên hình vẽ.
5.1.3. Chức năng chi tiết của các công cụ hỗ trợ cho quá trình mô phỏng
public void AddEdgeDrawing(string
fromVertex, string toVertex, int
value)
Vẽ một cạnh
private void
RemoveVertexDrawing(VertexDrawing
vertexDrawing){} Vẽ đỉnh
public bool IsInShortestPath { get;
set; }
Chứa đựng thông tin về các cạnh trên đường đi ngắn nhất của thuật toán Dijkstra
public bool IsInSpanningTree { get;
set; }
Chứa đựng thông tin về các cạnh thuộc cây khung của thuật toán Prim
public bool IsInFindingPath { get;
set; }
Chứa đựng thông tin về các cạnh trên đường đi từ đỉnh xuất phát đến đỉnh kết thúc của thuật toán tìm kiếm DFS và BFS
private void
DrawAtDesignMode(DrawingContext
drawingContext)
Chế độ đồ họa trong khi xây dựng dữ liệu đầu vào
private void
DrawAtRunMode(DrawingContext
drawingContext)
Chế độ đồ họa trong khi thực hiện mô phỏng trên đồ thị đã cho public void AddEdgeDrawing(EdgeDrawing e) {} public void RemoveEdgeDrawing(EdgeDrawing e) {}
public void ReRender(){}
public void
RemoveAllEdgeDrawings(){}
Các công cụ hỗ trợ quá trình thiết kế dữ liệu đầu vào bằng hình vẽ và quá trình mô phỏng.
5.2. Giới thiệu các công cụ hỗ trợ mô phỏng do người dùng cài đặt
Như đã nói ở trên, chúng tôi dùng C# là ngôn ngữ cài đặt chương trình mô phỏng là để tận dụng các ưu điểm của nó. Việc mô phỏng trong chương trình được chia thành các module, các chức năng hỗ trợ việc mô phỏng lại được chia thành các module nhỏ hơn, đóng kín với các module khác. Các lớp độc lập nhau có thể coi như một kiểu dữ liệu để khai báo trong chương trình khi cần sử dụng.
7.3.1 Tìm kiếm:
Tìm kiếm theo mô hình DFS:
DFS mô phỏng: Module: GraphTool.Searching.DFSForm
DFS thực thi thuật toán và “lên” kịch bản: GraphTool.Model.DFS
Kiến trúc:
Chức năng: các công cụ và chức năng của chúng trong mô hình cài đặt
Các công cụ trong chương trình:
private Dictionary<string, string> _trace =new Dictionary<string, string>();
private Dictionary<string, bool> _free = new Dictionary<string, bool>(); public Graph Graph { get; set; }
public string VertexKeyStart {get; set;} public string VertexKeyEnd {get; set;} private BagStep _steps = new BagStep();
Công cụ thuật toán:các thuật toán trợ giúp cho thuật toán chính:
Thủ tục Chức năng
public void Execute() Thực thi thuật toán.
private void GetResult() Lấy kết quả và lưu trữ vào các bước cho vào túi.
public BagStep GetBagStep() Lấy túi đã đựng các bước để chuyển qua mô phỏng.
private void DfsAlgorithms(Vertex u)
Chương trình đệ quy thực hiện việc thăm theo mô hình DFS từ một đỉnh u tới các đỉnh kề với nó.
private void Initialize()
Khởi tạo các thông số đồ thị dựa trên mô hình đồ thị mà người dùng đưa vào trước khi thực hiện thuật toán.
Trả lại các bước thuật toán đã thực hiện trên bộ dữ liệu đầu vào để chương trình mô phỏng bắt đầu làm việc DFS mô phỏng: Module: GraphTool.Sear ching.DFSForm DFS thực thi thuật toán: GraphTool.Mo del.DFS Chuyển mô hình đồ thị mà người dùng đã chuẩn bị cho Module Model.DFS thực hiện thuật toán
private void UpdateTrace(string
after, string before) Thực hiện công việc truy vết.
private void UpdateInfoAtStepEnd()
Hoàn thiện thuật toán. Ghi nhận các cạnh đã đi qua theo mô hình DFS.
Các bước sẽ được lưu trữ trong túi.
public class StepStartDFS() Step kế thừa của lớp Step, khởi tạo đỉnh xuất phát
public class StepEndDFS : Step Ghi nhận những cạnh đã thăm trong quá trình thực hiện theo thuật toán DFS và truy vết.
public class DfsStep1 : Step public class DfsStep21 : Step public class DfsStep22 : Step public class DfsStep23 : Step public class DfsStep3 : Step
Các bước được làm mịn trong quá trình mô phỏng thuật toán DFS. Thừa kế từ lớp Step
Tìm kiếm theo mô hình BFS:
Chương trình con:
BFS mô phỏng: Module: GraphTool.Searching.BFSForm
BFS thực thi thuật toán: GraphTool.Model.BFS Kiến trúc:
Chức năng: các công cụ và chức năng của chúng trong mô hình cài đặt
Các công cụ sử dụng trong chương trình:
private Dictionary<string,string> _trace = new Dictionary<string,string>(); private Dictionary<string, bool> _free = new Dictionary<string, bool>(); public Graph Graph { get; set; }
private Queue<Vertex> _Q = new Queue<Vertex>(); public string VertexKeyStart { get; set; }
public string VertexKeyEnd { get; set; }
Trả lại các bước thuật toán đã thực hiện trên bộ dữ liệu đầu vào để chương trình mô phỏng bắt đầu làm việc BFS mô phỏng: Module: GraphTool.Sear ching.BFSForm BFS thực thi thuật toán: GraphTool.Mo del.BFS Chuyển mô hình đồ thị mà người dùng đã chuẩn bị cho Module Model.BFS thực hiện thuật toán
private BagStep _steps = new BagStep();
Các chương trình con và chức năng của chúng:
Thủ tục Chức năng
public void Execute() Thực thi thuật toán.
private void GetResult() Lấy kết quả và lưu trữ vào các bước cho vào túi.
public BagStep GetBagStep() Lấy túi đã đựng các bước để chuyển qua mô phỏng.
private void BfsAlgorithms(Vertex u)
Chương trình đệ quy thực hiện việc thăm theo mô hình BFS từ một đỉnh u tới các đỉnh kề với nó.
private void Initialize()
Khởi tạo các thông số đồ thị dựa trên mô hình đồ thị mà người dùng đưa vào trước khi thực hiện thuật toán.
private void UpdateTrace(string
after, string before) Thực hiện công việc truy vết.
private void
UpdateInfoAtStepEnd()
Hoàn thiện thuật toán. Ghi nhận các cạnh đã đi qua theo mô hình BFS.
Các bước sẽ được lưu trữ trong túi.
Public class StepStart1() Step kế thừa của lớp Step, khởi tạo đỉnh xuất phát
Public class StepEnd1 : Step Ghi nhận những cạnh đã thăm trong quá trình thực hiện theo thuật toán BFS và truy vết.
Public class BfsStep1 : Step Public class BfsStep21 : Step Public class BfsStep22 : Step Public class BfsStep23 : Step Public class BfsStep3 : Step
Các bước được làm mịn trong quá trình mô phỏng thuật toán BFS.
7.3.2 Dijsktra Chương trình con
Dijsktra mô phỏng: Module: GraphTool.Searching.dijkstraForm
Dijkstra thực thi thuật toán: GraphTool.Model.dijkstra: thực thi theo đúng thuật toán và lưu lại các bước đã thực hiện vào trong một cái túi (BagStep) dùng trong mô phỏng.
Chức năng: các công cụ và chức năng của chúng trong mô hình cài đặt
Công cụ sử dụng trong module:
private HashSet<Vertex> _vertexGone = new HashSet<Vertex>(); private HashSet<Vertex> _vertexGo = new HashSet<Vertex>();
private Dictionary<string, string> _trace = new Dictionary<string, string>();
private Dictionary<string, int> _distance = new Dictionary<string, int>(); private BagStep _steps = new BagStep();
public Graph Graph { get; set; }
public string VertexKeyStart { get; set; } public string VertexKeyEnd { get; set; } public BagStep GetBagStep()
Các chương trình con và chức năng của chúng:
Thủ tục Chức năng
public void Execute() Thực hiện thuật toán Dijkstra
public void Initialize();
Khởi tạo các thông số cần thiết cho thuật toán
private void UpdateEdgeGo(Vertex u)
Sửa nhãn cho tất cả các đỉnh chưa được chọn khi mới cố định đỉnh u Trả lại các bước thuật toán đã
thực hiện trên bộ dữ liệu đầu vào để chương trình mô phỏng bắt đầu làm việc Dijkstra mô phỏng: Module: GraphTool.Dijk tra.DijktraFor m Dijkstra thực thi thuật toán: GraphTool.Mo del.Dijkstra
Chuyển mô hình đồ thị mà người dùng đã chuẩn bị cho Module Model.Dijkstra thực hiện thuật toán
private void UpdateTrace(string after, string before)
Cập nhật vết cho đường đi trong khi thực hiện thuật toán
private void UpdateInfoAtStepEnd()
Ghi lại các thông số cuối cùng để dựng kịch bản cho mô phỏng
private void AddVertextToVertexGone(Vertex gone)
Kết nạp thêm một đỉnh vào tập S (các đỉnh đã cố định nhãn)
private void AddStepStart()
Ghi nhận bước đi đầu tiên của thuật toán Dijkstra trên đồ thị vừa chọn.
private void AddStepStart12(string key) private void AddStepUpdateVertexValue()
private void AddStepUpdateVertexValueStep11() private void AddStepUpdateVertexValueStep12() private void AddStepChooseVertexMin(string key)
private void AddStepAddVertex() private void AddStepEnd()
Cập nhật các bước để lên kịch bản mô phỏng
public class StepStart : Step {
public string VertexStart { get; set; } private Dictionary<string, int> _d = new Dictionary<string, int>();
public void
UpdateVertexValue(Dictionary<string, int> d) {
foreach (string key in d.Keys) {
_d.Add(key, d[key]); }
}
public Dictionary<string, int> GetDistanceInfomation()
{
return _d; }
Kịch bản cho mô phỏng:
Bước khởi đầu: Xây dựng các thông số ban đầu từ đồ thị do người dùng chuyển vào thành Input cho thuật toán.
public class StepEnd : Step {
private IList<string>
_edgesInShotestPath = new List<string>(); public void
UpdateEdgeInfosInShotestPath(Dictionary<string , string> trace,
string keyEnd, string keyStart) {
Bước cuối cùng: sau khi thực hiện thuật toán Dijkstra, lớp StepEnd lưu giữ lại toàn bộ thông số cần thiết để mô phỏng: các cạnh thuộc đường đi ngắn nhất, các đỉnh thuộc đường đi đó….
string key = keyEnd;
while (key != keyStart && key != string.Empty) { _edgesInShotestPath.Add(trace[key] + ">" + key); key = trace[key]; } if (key == string.Empty) _edgesInShotestPath = new List<string>(); } public IList<string> EdgesInShotestPath() { return _edgesInShotestPath; } } //step 1
public class StepUpdateVertexValue : Step {
private Dictionary<string, int> _d = new Dictionary<string, int>();
public void
UpdateVertexValue(Dictionary<string, int> d) {foreach (string key in d.Keys) {
_d.Add(key, d[key]); }
}
public Dictionary<string, int> GetDistanceInfomation()
{
return _d; }
}
Bước 1: Sửa nhãn cho tất cả các đỉnh
//step 2
public class StepChooseVertexMin : Step {
public string Min { get; set; } }
Bước 2: Chọn một đỉnh có nhãn nhỏ nhất để cố định.
//step3
public class StepAddVertex : Step {
private IList<string> _gones = new List<string>();
public IList<string> GetAddedVertex() {
return _gones; }
}
Bước 3: thêm đỉnh vừa chọn ở bước 2 vào tập các đỉnh đã được cố định nhãn.
7.3.3 Prim
Với thuật toán Prim – thuật toán tìm cây khung nhỏ nhất, đồ thị được lựa chọn chỉ là một: đồ thị vô hướng có trọng số và người dùng cũng chỉ cần lựa chọn đỉnh xuất phát. Từ đỉnh xuất phát đó, chương trình mô phỏng sẽ thực hiện đúng trình tự của thuật toán Prim để kết nạp dần các đỉnh vào cây khung. Thuật toán dừng khi hoặc đã dựng thành cây khung hoặc đồ thị đã cho không liên thông (không có nghiệm). Cũng giống như Dijkstra, chương trình mô phỏng thực hiện
Chương trình con:
Prim mô phỏng: Module: GraphTool.Prim.PrimForm
Prim thực thi thuật toán: GraphTool.Model.Prim Kiến trúc:
Chức năng: các công cụ và chức năng của chúng trong mô hình cài đặt
Thủ tục Chức năng
public void Execute() Thực hiện thuật toán Prim
public void Initialize(); Khởi tạo các thông số cần thiết cho
Trả lại các bước thuật toán đã thực hiện trên bộ dữ liệu đầu vào để chương trình mô phỏng bắt đầu làm việc Prim mô phỏng: Module: GraphTool.Pri m.PrimForm Prim thực thi thuật toán: GraphTool.Mo del.Prim Chuyển mô hình đồ thị mà người dùng đã chuẩn bị cho Module Model.Prim thực hiện thuật toán
thuật toán
private void UpdateEdgeGo(Vertex u)
Sửa nhãn cho tất cả các đỉnh chưa được chọn khi mới cố định đỉnh u
private void UpdateTrace(string after, string before)
Cập nhật các đỉnh và các cạnh thuộc cây khung trong khi thực hiện thuật toán
private void UpdateInfoAtStepEnd()
Ghi lại các thông số cuối cùng để dựng kịch bản cho mô phỏng
private void AddVertextToVertexGone(Vertex gone)
Kết nạp thêm một đỉnh vào cây khung
private void AddStepStartPrim()
Ghi nhận bước đi đầu tiên của thuật toán Prim trên đồ thị vừa chọn.
private void AddStepStartPrim(string key) private void AddStepUpdateVertexValuePrim() private void
AddStepUpdateVertexValueStep11Prim() private void
AddStepUpdateVertexValueStep12Prim()
private void AddStepChooseVertexMinPrim(string key)
private void AddStepAddVertexPrim() private void AddStepEndPrim()
Cập nhật các bước để lên kịch bản mô phỏng
Chương 4 KẾT LUẬN