Trong thiết kế mạch điện, cần thiết phải cú một số cỏc phớch cắm cho cỏc thiết bị điện tử tương ứng. Để kết nối một tập n phớch cắm, ta cú thể sử dụng n-1 dõy điện, mỗi dõy nối hai phớch cắm với nhaụ Cú nhiều cỏch nối cỏc phớch
điện với nhau, và cỏch tối ưu nhất là cỏch sử dụng ớt dõy điện nhất.
Ta cú thể mụ hỡnh húa bài toỏn này bằng một đồ thị liờn thụng vụ hướng G=(V,E), trong đú V là tập cỏc phớch điện, E là tập cỏc khả năng cú thể
kết nối giữa cỏc phớch điện với nhau, và mỗi cạnh (u,v) thuộc E, ta cú một trọng số w(u,v) là lượng dõy cần thiết để nối u và v với nhaụ Yờu cầu của bài toỏn là tỡm T là một tập con của E, nối tất cả cỏc đỉnh và cú tổng trọng số cỏc
cạnh trong T là nhỏ nhất. Do T là khụng chứa chu trỡnh và kết nối tất cả cỏc
đỉnh với nhau, nờn T phải cú dạng cõy, và được gọi là cõy bao trựm của đồ thị
G. Bài toỏn cần tỡm T được gọi là bài toỏn cõy bao trựm nhỏ nhất. Hỡnh 4.3
đưa ra một vớ dụ vềđồ thị liờn thụng vụ hướng và cõy bao trựm nhỏ nhất của nú.
Hỡnh 4-3 Cõy bao trựm nhỏ nhất của một đồ thị vụ hướng. Trờn mỗi cạnh của đồ thịđều cú trọng số, và cỏc cạnh thuộc cõy bao trựm nhỏ nhất được tụ đậm. Tổng trọng số của cõy là 37. Cõy bao trựm nhỏ
nhất khụng phải là tồn tại duy nhất, nếu ta thay thế cạnh (b,c) bằng cạnh (a,h), ta nhận được một cõy bao trựm nhỏ nhất cú cựng tổng trọng số là 37.
4.2.2 Phõn tớch và cài đặt ạChương trỡnh logic DLV
Chia dữ liệu vào DLV thành nhiều nguồn khỏc nhaụ Cơ sở dữ liệu mở rộng EDB của chương trỡnh được lưu trong file MST.inp, mụ tả một đồ thị liờn thụng vụ hướng. Cơ sở dữ liệu cơ bản IDB của chương trỡnh được lưu trong file MST.dl, là cỏc tập luật và ràng buộc để mụ tả bài toỏn.
Khai bỏo:
- quyết định một đỉnh là gốc của cõy, đõy cũng đồng thời là đỉnh xuất phỏt trong quỏ trỡnh liệt kờ cỏc trường hợp cú thể là cõy bao trựm của
đồ thị.
- xỏc định (X,Y, C) là cạnh của đồ thị khi (X, Y, C) hoặc (Y, X, C) thuộc cơ sở dữ liệu mở rộng của chương trỡnh, tức là thuộc file MST.inp.
is_edge(X, Y, C) :- edge(X, Y, C). is_edge(X, Y, C) :-
edge(Y, X, C).
Liệt kờ:
- Liệt kờ tất cả cỏc trường hợp là cõy bao trựm của đồ thị, với mỗi trường hợp, xỏc định một cạnh của đồ thị cú thuộc cõy hay khụng thuộc cõy bằng luật phõn biệt sau:
in_tree(X, Y, C) v out_tree(X, Y) :- is_edge(X, Y, C),
reached(X).
- Vỡ cần xõy dựng một cõy bao trựm của đồ thị cho trước, nờn ta cần phải biểu diễn tớnh chất khụng chứa chu trỡnh của cõy bao trựm bằng ràng buộc sau:
:- in_tree(X, Y, _), has_path(X, Y). has_path(X, Y) :- in_tree(X, Z, _), in_tree(Z, Y, _), X != Z, Z != Ỵ has_path(X, Y) :- in_tree(X, Z, _), have_path(Z, Y), X != Z, Z != Ỵ Tức là sẽ khụng thể tồn tại đồng thời một cạnh (X,Y) và một đường đi khỏc từ X đến Ỵ
- Đảm bảo tất cả cỏc đỉnh phải được duyệt tới trong mọi trường hợp của cõy bao trựm:
reached(X) :- root(X). reached(Y) :-
reached(X),
in_tree(X, Y, C).
:- node(X), not reached(X).
Loại bỏ: Tối ưu húa cõy bao trựm bằng ràng buộc yếu để nhận được kết quả
là cõy bao trựm nhỏ nhất:
:~ in_tree(X, Y, C). [C:1]
Kết quả chạy của chương trỡnh trong DLV:
Hỡnh 4-4 Tập trả lời là cỏc cạnh thuộc cõy bao trựm nhỏ nhất cú tổng trọng số là 12
Và cuối cựng, ta cú thể chạy thử chương trỡnh này với cỏc thụng số về mức độ đỏnh giỏ và ưu tiờn được truyền từ dũng
Hỡnh 4-5 Cỏc cõy bao trựm cú trọng số nhỏ hơn hoặc bằng 13
b.Cài đặt trờn Java
Chạy chương trỡnh DLV trờn trong Java, ta phải thực hiện việc gọi DLV bằng mó nguồn Java như sau:
Bước 1: Xõy dựng đối tượng Program và thiết lập dữ liệu vào
Program pr=new Program();
// set input
pr.ađProgramFile(this.dlvFileName); pr.ađProgramFile(this.inputFileName);
Bước 2: Xõy dựng đối tượng DlvHandler
// build a DlvHandler object
DlvHandler dlv=new DlvHandler(this.dlvExeFile);
Bước 3: Tạo chương trỡnh đầu vào và cỏc thụng số cần thiết.
// set input program
dlv.setProgram(pr);
// set invocation parameters
dlv.setNumberOfModels(1); //computes no more than 1 solutions dlv.setIncludeFacts(false);
dlv.setFilter(new String[]{"in_tree"});
Bước 4: Chạy DLV
// run DLV by using model synchronous method of invocation
dlv.run(DlvHandler.MODEL_SYNCHRONOUS);
Bước 5: Quản lý kết quả DLV bằng cỏch sử dụng cỏc lớp Model, Predicate,
Literal.
// DLV output handling
// for each model, wait until DLV find a new model
while(dlv.hasMoreModels()) {
Model m=dlv.nextModel(); // gets next model
if(!m.isNoModel()) {
// for each predicate in m
while(m.hasMorePredicates()){
// gets next predicate
Predicate p=m.nextPredicate();
System.out.println(p.toString()); }
System.out.println("--- END Model");
} else System.out.println("I cannot find a model"); }
Phần mềm MST_DLV bao gồm bốn file:
- Nodẹjava : định kiểu cho một nỳt của đồ thị, bao gồm tờn nỳt, tọa độ x và y của nỳt đú trờn khung kết quả.
- Edgẹjava : mụ tả một cạnh của đồ thị, bao gồm cú đỉnh đầu, đỉnh cuối và trọng số của cạnh nàỵ
- MST.java : thực hiện cỏc bước gọi DLV trong Java và vẽ đồ thị và cõy khung tương ứng.
- MSTGUỊjava : mụ tả giao diện làm việc giữa người sử dụng và chương trỡnh.
Giao diện làm việc của MST như sau:
Hỡnh 4-6 Giao diện làm việc của chương trỡnh MST
Ta cần nhập cỏc tờn file tương ứng, đú là file dữ liệu vào chứa cỏc sự kiện mụ tả một đồ thị với cỏc vị từnode và edge; file chương trỡnh là file bao gồm cỏc ràng buộc và cỏc luật; và cuối cựng là file kết quả ra chứa kết quả vừa tớnh
được với vị từin_tree.
Với file MST6.inp, ta cú được kết quả cõy khung nhỏ nhất cú tổng trọng số là 16.
Hỡnh 4-7 Danh sỏch cạnh thuộc cõy khung nhỏ nhất với đồ thị 6 đỉnh chứa trong file MST6.inp
Hỡnh 4-8 Đồ thị và cõy khung nhỏ nhất của MST6.inp
Với file MST7.inp, ta nhận được kết quả cõy khung nhỏ nhất cú tổng trọng số
là 130.
Hỡnh 4-10 Đồ thị và cõy khung nhỏ nhất của MST7.inp
Với file MST8.inp, Ta nhận được kết quả cõy khung nhỏ nhất cú tổng trọng số
là 103.
KẾT LUẬN
Bản luận văn đó trỡnh bày cỏc kết quả nghiờn cứu về cỏch biểu diễn tri thức trong lập trỡnh logic. Cỏc chương trỡnh logic khỏc nhau sẽ cú những cỏch biểu diễn tri thức khỏc nhaụ Một chương trỡnh logic được coi là một đặc thự để
xõy dựng cỏc lý thuyết cú thể cho một thế giới quan và cỏc luật trong chương trỡnh là những ràng buộc mà cỏc lý thuyết này cần phải thỏa món. Ngữ nghĩa của cỏc chương trỡnh logic khỏc nhau về cỏch định nghĩa tớnh thỏa món cỏc luật.
Chương trỡnh logic tổng quỏt sử dụng ngữ nghĩa mụ hỡnh ổn định và cỏc dạng mở rộng của nú. Với ngữ nghĩa này, cỏc lý thuyết tương ứng là cỏc tập nguyờn tố nền, được gọi là cỏc mụ hỡnh ổn định của một chương trỡnh.
Chương trỡnh logic mở rộng xuất hiện thờm một cỏch biểu diễn phủ định, đú là phủ định hiện. Trong ngụn ngữ của chương trỡnh mở rộng, ta cú thể phõn biệt một truy vấn với ý nghĩa “nú khụng thành cụng” với một truy vấn với ý nghĩa mạnh hơn “phủ định của nú thành cụng”. Ngữ nghĩa của một chương trỡnh logic mở rộng là một tập cỏc tập trả lời của chương trỡnh, tập trả
lời của một chương trỡnh là một tập cỏc phần tử được coi là đỳng dựa vào sự
suy diễn trong chương trỡnh.
Với cỏc nghiờn cứu về cỏch biểu diễn tri thức trong cỏc chương trỡnh logic, bản luận văn đó trỡnh bày một mụi trường lập trỡnh logic hiệu quả, DLV (datalog với phộp hoặc) là một hệ thống cơ sở dữ liệu tường thuật khỏ mạnh. Nú được tạo ra trờn cơ sở của ngụn ngữ lập trỡnh tường thuật datalog, thớch hợp với cỏc loại suy diễn khụng đơn điệu, bao gồm cả chuẩn đoỏn và lập kế
tượng Java thụng qua gúi DLV. Bằng cỏch sử dụng một cỏch thứ tự thớch hợp cho cỏc lớp Java, gúi DLV cho phộp kết nối mó nguồn Java với cỏc chương trỡnh logic phõn biệt.
Cuối cựng, bản luận văn đó đưa ra hai bài toỏn minh họa: bài toỏn N quõn hậu và bài toỏn Cõy khung nhỏ nhất. Cỏc bài toỏn này được cài đặt trong mụi trường lập trỡnh logic DLV và chương trỡnh mụ tả bài toỏn Cõy khung nhỏ nhất đó được nhỳng vào mó nguồn Java và được chạy dưới dạng một chương trỡnh hướng đối tượng Javạ
Bản luận văn đó nghiờn cứu cỏc phương phỏp biểu diễn tri thức trong lập trỡnh logic. Nếu cú thờm điều kiện, bản luận văn cú thể mở rộng nghiờn cứu thờm độ phức tạp tớnh toỏn của chương trỡnh, cải thiện tốc độ tớnh toỏn cũng phỏt triển cỏc phương phỏp biểu diễn tri thức khỏc đối với cỏc bài toỏn NP khú.
TÀI LIỆU THAM KHẢO Tiếng Việt
[1] Nguyễn Xuõn Thỏi (1999), “Lập trỡnh logic và nguyờn lý giải”, Luận văn Thạc sỹ khoa học, trường Đại học Khoa học Tự
nhiờn, Đại học Quốc Gia Hà Nộị
Tiếng Anh
[2] Chitta Baral (2004), “Knowledge Representation, Reasoning and Declarative Problem Solving”, Arizona State University, ỤS.Ạ
[3] Chitta Baral, Michael Gelfond (1994), “Logic Programming and Knowledge Representation”, Computer Science Department, University of Texas at El Paso, El Paso, Texaz, ỤS.Ạ
[4] Michael Gelfond (1994), “The Stable Model Semantics for Logic Programming”, University of Texas at El Paso, El Paso, Texaz, ỤS.Ạ
[5] Steffen Hửlldobler (2004), “Computational Logic - Working material”, Artificial Intelligence Institute, Technische Universitọt Dresden, Germanỵ
[6] Matthias Knorr (2006), “A Comparative Study of Disjunctive Well- founded Sematics”, Master thesis in Computational Logic, Universidade Nova de Lisboa, Portugal.
[7] Vladimir Lifschitz, “Foundations of Logic Programming”, Department of Computer Sciences, University of Texas, ỤS.Ạ
[8] Vivek Nigam (2006), “Dynamic Logic Programming and 3APL”, Master thesis in Computational Logic, Universidade Nova de Lisboa, Portugal.
[9] Luớs Moniz Pereira, Josộ Jỳlio Alferes (1996), “Reasoning with Logic Programming”, Universidade Nova de Lisboa, Portugal. [10] Francesco Ricca (2004), “Java Wrapper for DLV”, Department of
Mathematics, University of Calabria, Italỵ
[11] Wolfgang Faber, Gerald Pfeifer (since 1996), DLV homepage,
PHỤ LỤC
Bài toỏn N quõn hậu trờn DLV:
row(X) :- #int(X), X > 0. col(X) :- #int(X), X > 0.
out(X, Y) :- row(X), col(Y), not in(X, Y). in(X, Y) :- row(X), col(Y), not out(X, Y). has_queen(X) :- row(X), col(Y), in(X, Y). :- row(X), not has_queen(X).
:- Y <> YY, in(X, Y), in(X, YY). :- X <> XX, in(X, Y), in(XX, Y).
:- in(X1, Y1), in(X2, Y2), X2=X1+N, Y2 = Y1 + N, N > 0. :- in(X1, Y1), in(X2, Y2), X2=X1+N, Y1 = Y2 + N, N > 0.
Bài toỏn Cõy khung nhỏ nhất trong DLV:
root(a).
node(a). node(b). node(c). node(d). node(e).
edge(a, b, 4). edge(a, c, 3). edge(c, b, 2). edge(c, d, 3). edge(b, e, 4). edge(d, e, 5). in_tree(X, Y, C) v out_tree(X, Y) :- edge(X, Y, C), reached(X). :- root(X), in_tree(_, X, C). :- in_tree(X, Y, C), in_tree(Z, Y, C), X != Z. reached(X) :- root(X). reached(Y) :- reached(X), in_tree(X, Y, C).
:- node(X), not reached(X). :~ in_tree(X, Y, C). [C:1]
row(X) :- #int(X), X > 0. col(X) :- #int(X), X > 0.
out(X, Y) :- row(X), col(Y), not in(X, Y). in(X, Y) :- row(X), col(Y), not out(X, Y). has_queen(X) :- row(X), col(Y), in(X, Y). :- row(X), not has_queen(X).
:- Y <> YY, in(X, Y), in(X, YY). :- X <> XX, in(X, Y), in(XX, Y).
:- in(X1, Y1), in(X2, Y2), X2=X1+N, Y2 = Y1 + N, N > 0. :- in(X1, Y1), in(X2, Y2), X2=X1+N, Y1 = Y2 + N, N > 0.
Bài toỏn Cõy khung nhỏ nhất trong DLV:
root(a).
node(a). node(b). node(c). node(d). node(e).
edge(a, b, 4). edge(a, c, 3). edge(c, b, 2). edge(c, d, 3). edge(b, e, 4). edge(d, e, 5). in_tree(X, Y, C) v out_tree(X, Y) :- edge(X, Y, C), reached(X). :- root(X), in_tree(_, X, C). :- in_tree(X, Y, C), in_tree(Z, Y, C), X != Z. reached(X) :- root(X). reached(Y) :- reached(X), in_tree(X, Y, C). :- node(X), not reached(X). :~ in_tree(X, Y, C). [C:1]
import javạawt.GridLayout; import javạawt.event.ActionEvent; import javạawt.event.WindowEvent; import javạiọFile; import javạiọIOException; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import org.jgraph.JGraph; import org.jgraph.graph.DefaultGraphModel; import org.jgraph.graph.GraphModel; import DLV.DLVInvocationException; public class MSTGUI extends JFrame {
public Container contentPane;
private JTextField textNameInputFile = new JTextField("MST.inp"); private JButton buttonOpenInputFile = new JButton("Open Input File"); private JTextField textNameProgramFile = new JTextField("MST.dl");
private JButton buttonOpenProgramFile = new JButton("Open Program File"); private JTextField textNameOutputFile = new JTextField("MST.out");
private JButton buttonOpenOutputFile = new JButton("Open Output File"); private JButton buttonPress = new JButton("Solve!");
private JFileChooser fileChooserInput = new JFileChooser(); private JPanel inputPanel = new JPanel();
private static final long serialVersionUID = 1L;
public static void main(String[] args) throws Exception, DLVInvocationException { MSTGUI studyGUIObject = new MSTGUI();
studyGUIObject.setSize(800, 175);
studyGUIObject.initPanels(); studyGUIObject.initContainer(); studyGUIObject.setVisible(true);
studyGUIObject.ađWindowListener(new javạawt.event.WindowAdapter() { public void windowClosing(WindowEvent winEvt) {
System.exit(0); }
}); }
public void initContainer() {
this.contentPane = this.getContentPane();
this.contentPanẹađ(this.inputPanel); }
public void initPanels() throws IOException, DLVInvocationException {
//set the layout to be 4 rows and 3 columns GridLayout inputPanelLayout = new GridLayout(4,3); this.inputPanel.setLayout(inputPanelLayout);
//first row
this.inputPanel.ađ(new JLabel("Enter MST Input File")); textNameInputFilẹsetColumns(25);
this.inputPanel.ađ(textNameInputFile); this.buttonOpenInputFilẹađActionListener(new javạawt.event.ActionListener() {
public void actionPerformed(javạawt.event.ActionEvent evt) { buttonOpenInputFileActionPerformed(evt);
}
});
this.inputPanel.ađ(buttonOpenInputFile);
//second row
this.inputPanel.ađ(new JLabel("Enter MST Program File")); textNameProgramFilẹsetColumns(25);
}
});
this.inputPanel.ađ(buttonOpenProgramFile);
//third row
this.inputPanel.ađ(new JLabel("Enter MST Output File")); textNameOutputFilẹsetColumns(25);
this.inputPanel.ađ(textNameOutputFile); this.buttonOpenOutputFilẹađActionListener(new javạawt.event.ActionListener() {
public void actionPerformed(javạawt.event.ActionEvent evt) { buttonOpenOutputFileActionPerformed(evt); } }); this.inputPanel.ađ(buttonOpenOutputFile); //fourth row this.buttonPress.ađActionListener(new javạawt.event.ActionListener() { public void actionPerformed(javạawt.event.ActionEvent evt) {
try { buttonPressActionPerformed(evt); } catch (IOException e) { ẹprintStackTrace(); } catch (DLVInvocationException e) { ẹprintStackTrace(); } } }); this.inputPanel.ađ(new JLabel("")); this.inputPanel.ađ(new JLabel("")); this.inputPanel.ađ(buttonPress); }
private void buttonOpenInputFileActionPerformed(ActionEvent evt) { int returnVal = fileChooserInput.showOpenDialog(MSTGUỊthis); if (returnVal == JFileChooser.APPROVE_OPTION) {
private void buttonOpenProgramFileActionPerformed(ActionEvent evt) { int returnVal = fileChooserInput.showOpenDialog(MSTGUỊthis); if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fileChooserInput.getSelectedFile();
//This is where a real application would open the filẹ textNameProgramFilẹsetText(filẹgetAbsolutePath()); }
}
private void buttonOpenOutputFileActionPerformed(ActionEvent evt) { int returnVal = fileChooserInput.showOpenDialog(MSTGUỊthis); if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fileChooserInput.getSelectedFile();
//This is where a real application would open the filẹ textNameOutputFilẹsetText(filẹgetAbsolutePath()); }
}
private void buttonPressActionPerformed(javạawt.event.ActionEvent evt)throws IOException, DLVInvocationException {
String inputFileName = textNameInputFilẹgetText(); String outputFileName = textNameOutputFilẹgetText(); String dlvFileName = textNameProgramFilẹgetText(); MST mstObject = new MST();
GraphModel model = new DefaultGraphModel();
mstObject.dlvFileName = dlvFileName;
mstObject.inputFileName = inputFileName;
mstObject.outputFileName = outputFileName;
mstObject.graph = new JGraph(model); mstObject.drawGraphFromInput(); mstObject.calculateMST(); mstObject.drawMSTFromOutput();
//create a new frame for the result JFrame resultFrame = new JFrame();
resultFramẹsetDefaultCloseOperation(JFramẹDISPOSE_ON_CLOSE); } } Chương trỡnh MST.java: package com.studyMST; import javạawt.Color; import javạawt.geom.Point2D; import javạawt.geom.Rectangle2D; import javạiọBufferedReader; import javạiọFile; import javạiọFileInputStream; import javạiọFileWriter; import javạiọIOException; import javạiọInputStreamReader; import javạutil.ArrayList; import javạutil.HashMap; import javạutil.Hashtable; import javạutil.Map; import javạutil.Random; import javạutil.StringTokenizer; import javax.swing.BorderFactory; import org.jgraph.JGraph; import org.jgraph.graph.DefaultEdge; import org.jgraph.graph.DefaultGraphCell; import org.jgraph.graph.GraphConstants; import DLV.DLVException; import DLV.DLVExceptionUncheked; import DLV.DLVInvocationException; import DLV.DlvHandler; import DLV.Model; import DLV.Predicate; import DLV.Program; public class MST {
private static final int NODE = 1; private static final int EDGE = 2;
public String dlvFileName = "MST.dl"; public String inputFileName = "MST.inp"; public String outputFileName = "MST.out"; private String dlvExeFile = "dl.exe"; public JGraph graph;
/** * @param args
* @throws IOException
*/
public void calculateMST () throws IOException, DLVInvocationException{ File outputFile = new File(this.outputFileName);
FileWriter out = new FileWriter(outputFile);
// build a Program object and setup input
Program pr=new Program();
// set input
pr.ađProgramFile(this.dlvFileName); pr.ađProgramFile(this.inputFileName);
// build a DlvHandler object
DlvHandler dlv=new DlvHandler(this.dlvExeFile);
// set input program
dlv.setProgram(pr);
// set invocation parameters
dlv.setNumberOfModels(1); // computes no more than 1 solutions dlv.setIncludeFacts(false);
dlv.setFilter(new String[]{"in_tree"}); try
{
// run DLV by using model synchronous method of invocation dlv.run(DlvHandler.MODEL_SYNCHRONOUS);
// DLV output handling
while(dlv.hasMoreModels()) // for each model, wait until DLV find a new model
m
{
Predicate p=m.nextPredicate(); // gets next
predicate
System.out.println(p.toString()); // print out
p
out.write(p.toString()); }
System.out.println("--- END Model");
} else System.out.println("I cannot find a model"); }
}
catch(DLVException d) { d.printStackTrace(); }
catch(DLVExceptionUncheked du) { dụprintStackTrace(); } finally
{
System.err.println(dlv.getWarnings()); // print out errors }
out.close(); }
public void drawGraphFromInput() throws IOException {
BufferedReader d = new BufferedReader(new InputStreamReader(new FileInputStream(new File(this.inputFileName))));
String line = "";
while((line = d.readLine()) != null) {
String verticeOrEdge = linẹsubstring(linẹindexOf("(") + 1, linẹindexOf(")"));
//System.out.println(verticeOrEdge);
int type = this.getType(verticeOrEdge);
if(type == MST.NODE) {
Node theNode = new Node();
theNodẹlabel = verticeOrEdge;
mapOfNodes.put(theNodẹlabel, theNode);
} else if(type == MST.EDGE) {
Node node1 = (Node) mapOfNodes.get(labelNode1);
Node node2 = (Node) mapOfNodes.get(labelNode2);
Edge theEdge = new Edge();
theEdgẹnode1 = node1; theEdgẹnode2 = node2; theEdgẹweight = edgeWeight; listOfEdges.ađ(theEdge); } else { } }
System.out.println("no of nodes = " + mapOfNodes.size()); buildNodesCoordinate();
buildGraph();
}
public void drawMSTFromOutput() throws IOException {
BufferedReader d = new BufferedReader(new InputStreamReader(new FileInputStream(new File(this.outputFileName))));
String line = "";
while((line = d.readLine()) != null) {
String edge = linẹsubstring(linẹindexOf("(") + 1, linẹindexOf(")"));
StringTokenizer st = new StringTokenizer(edge, ",");
String labelNode1 = st.nextToken().trim();
String labelNode2 = st.nextToken().trim();
int edgeWeight = Integer.parseInt(st.nextToken().trim());