Tải bản đầy đủ (.pdf) (70 trang)

Xây dựng chương trình xếp thời khóa biểu phục vụ đào tạo tín chỉ cho khoa công nghệ thông tin

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.08 MB, 70 trang )

MỤC LỤC
MỞ ĐẦU ......................................................................................................................3
CHƯƠNG 1 ..................................................................................................................5
TỔNG QUAN VỀ LẬP TRÌNH C# .NET .....................................................................5
1.1. Giới thiệu về .NET FrameWork..........................................................................5
1.2. Ngôn ngữ C# ......................................................................................................6
1.2.1. Cấu trúc chương trình của ngôn ngữ C# ......................................................6
1.2.2. Những kiểu cơ sở của ngôn ngữ C#..............................................................7
1.2.3. Các lệnh điều khiển......................................................................................8
1.2.4. C# hướng đối tượng ..................................................................................10
1.3. Mô hình đối tượng ADO.NET ..........................................................................14
1.3.1. Các Namespace..........................................................................................14
1.3.2. Các lớp dùng chung ...................................................................................14
1.3.3. Các lớp cơ sở dữ liệu chuyên biệt...............................................................15
CHƯƠNG 2 ................................................................................................................19
MỘT SỐ LÝ THUYẾT CƠ SỞ ỨNG DỤNG CHO BÀI TOÁN.................................19
XẾP THỜI KHÓA BIỂU ............................................................................................19
2.1. Khái quát về hệ chuyên gia ...............................................................................19
2.1.1. Những thành phần cơ bản của một hệ chuyên gia .......................................19
2.1.2. Kỹ thuật suy luận trong các hệ chuyên gia..................................................19
2.1.3. Biểu diễn tri thức trong các hệ chuyên gia ..................................................20
2.2. Khái quát về tập hợp .........................................................................................21
2.3. Bài toán tìm kiếm .............................................................................................21
2.3.1. Giải quyết vấn đề bằng tìm kiếm ................................................................21
2.3.2. Các chiến lược tìm kiếm trong không gian trạng thái..................................22
2.4. Cây tìm kiếm ....................................................................................................26
2.5. Thuật toán quay lui ...........................................................................................27
CHƯƠNG 3 ................................................................................................................30
BÀI TOÁN THỜI KHÓA BIỂU - GIẢI PHÁP ĐỀ XUẤT .........................................30
VÀ THIẾT KẾ HỆ THỐNG .......................................................................................30
3.1. Mô hình đào tạo theo tín chỉ..............................................................................30


3.2. Quy trình xếp thời khóa biểu theo đào tạo tín chỉ ..............................................30
3.3. Các đối tượng liên quan đến thời khóa biểu theo đào tạo tín chỉ ........................31

1


3.4. Phân tích bài toán .............................................................................................33
3.5. Một số khái niệm được áp dụng để xếp thời khóa biểu theo tín chỉ....................35
3.6. Các vấn đề khó khăn và các giải pháp ...............................................................38
3.6.1. Các khó khăn .............................................................................................38
3.6.2. Các giải pháp ............................................................................................40
3.7. Thuật toán xếp thời khóa biểu ...........................................................................46
3.7.1. Ý tưởng......................................................................................................46
3.7.2. Các bước chính của thuật toán XTKBTC ...................................................47
3.7.3. Lưu đồ thuật toán.......................................................................................50
3.8. Thiết kế hệ thống ..............................................................................................51
3.8.1. Biểu đồ phân cấp chức năng.......................................................................52
3.8.2. Biểu đồ luồng dữ liệu mức khung cảnh .....................................................53
3.8.3. Biểu đồ luồng dữ liệu mức đỉnh .................................................................53
3.8.4. Thiết kế cơ sở dữ liệu.................................................................................54
3.8.5. Lược đồ dữ liệu quan hệ.............................................................................55
CHƯƠNG 4 ................................................................................................................56
KẾT QUẢ THỰC NGHIỆM .......................................................................................56
4.1. Tính năng của chương trình ..............................................................................56
4.2. Các bước sử dụng chương trình ........................................................................56
4.3. Các giao diện chính của chương trình ...............................................................57
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN....................................................................65
TÀI LIỆU THAM KHẢO ...........................................................................................66
PHỤ LỤC ...................................................................................................................67


2


MỞ ĐẦU
Chúng ta thấy rằng trong thực tế bất kỳ một đơn vị, cơ quan hay một tổ chức
hoạt động kinh tế, xã hội nào cũng cần phải xậy dựng cho mình một lịch biểu.
Thậm chí, tất cả các quy trình sản xuất cũng đều cần có lịch biểu để đảm bảo các
công việc được hoàn thành theo đúng kế hoạch đã đặt ra. Đối với các trường học
thì lịch biểu dạy và học (hay còn gọi là Thời khóa biểu) càng quan trọng hơn bao
giờ hết. Nó trở thành xương sống kết nối mọi hoạt động của nhà trường. Chính vì
vậy, bài toán xếp Thời khóa biểu luôn là một trong những bài toán được quan
tâm và chú trọng hàng đầu trong các trường học.
Đối với nước ta, mô hình đào tạo của các trường phổ thông là hầu như thống
nhất trong cả nước, vì vậy có thể sử dụng chung một phần mềm xếp Thời khóa
biểu cho các trường này. Tuy nhiên, đối với các trường đại học, cao đẳng và
trung học chuyên nghiệp thì mô hình đào tạo lại rất khác nhau. Do đó, việc xậy
dựng một Thời khóa biểu chung cho tất cả các trường là rất khó. Đó cũng là lí do
để giải thích vì sao đa số các trường hiện nay vẫn xếp Thời khóa biểu bằng tay.
Mặt khác, việc xây dựng một phần mềm xếp Thời khóa biểu cũng không dễ
dàng bởi đây là bài toán có độ phức tạp hàm mũ. Rất nhiều các nhóm nghiên cứu
trong và ngoài nước đã nghiên cứu bài toán này theo các hướng tiếp cận khác
nhau như mạng nơron, fuzzy logic kết hợp với giải thuật di truyền và đã có
những thành công đáng kể.
Qua tìm hiểu thực tế tại Khoa em được biết, hiện nay Khoa đã áp dụng quy
chế đào tạo tín chỉ cho sinh viên đại học hệ chính quy. Do đó công việc xếp thời
khóa biểu sẽ khác với niên chế. Nên em chọn đề tài “Xây dựng chương trình
xếp thời khóa biểu phục vụ đào tạo tín chỉ cho Khoa Công Nghệ Thông Tin”
là đồ án tốt nghiệp của mình. Trong quá trình làm đề tài em đã kế thừa và vận
dụng thuật toán xếp Thời khóa biểu theo hướng tiếp cận của cô giáo Ngô Thị
Vinh bộ môn Điện tử viễn thông đó là: Kết hợp giữa hệ chuyên gia, lý thuyết tập

hợp và đồ thị. Để thực hiện đề tài của mình, em đã kết hợp với các thầy giáo, cô
giáo, cán bộ phòng đào tạo, cán bộ Bộ phận triển khai và đào tạo tín chỉ Khoa
công nghệ thông tin – Đại học Thái Nguyên.

3


Báo cáo đồ án tốt nghiệp của em gồm các chương như sau:
 Chương 1: Tổng quan về C# .NET. Trong chương này trình bày sơ lược về
môi trường .NET, ngôn ngữ C# và các đối tượng truy cập cơ sở dữ liệu trên môi
trường NET.
 Chương 2: Một số lý thuyết cơ sở ứng dụng cho bài toán xếp thời khóa
biểu. Chương này sẽ trình bày sơ lược về hệ chuyên gia, tập hợp, bài toán tìm
kiếm và một số thuật toán tìm kiếm, về tư tưởng của thuật toán quay lui và hướng
ứng dụng trong bài toán xếp Thời khóa biểu.
 Chương 3: Sơ lược về bài toán xếp Thời khóa biểu và giải pháp đề xuất.
Chương này sẽ tập chung phân tích bài toán xếp Thời khóa biểu, xây dựng thuật
toán xếp Thời khóa biểu, thiết kế hệ thống.
 Chương 4: Kết quả thực nghiệm.

4


CHƯƠNG 1
TỔNG QUAN VỀ LẬP TRÌNH C# .NET
1.1. Giới thiệu về .NET FrameWork
Hạt nhân của .NET Frame work là CRL (Common Language Runtime) CRL
quản lý sự thực thi của đoạn mã .NET và cung cấp các dịch vụ tạo quá trình phát
triển ứng dụng dễ dàng hơn. Các chương chình biên dịch và các công cụ làm cho
chức năng của thư viện thực thi Runtime trở nên phong phú và hiệu quả hơn.

CRL quản lý đoạn mã ở mức thực thi thấp nhất, kết hợp khả năng sử dụng đồng
thời nhiều ngôn ngữ đan xen nhau, tích hợp quản lý lỗi ngoại lệ, khởi động và
chấm dứt các tiểu trình ở mức thấp, hỗ trợ về bảo mật, quản lý phiên bản, đóng
gói cài đặt.
CRL cung cấp sự dễ dàng cho các nhà phát triển VB.NET khi thiết kế và xây
dựng ứng dụng mà những thay đổi đối tượng của chúng có thể tương tác với các
đối tượng được viết bằng ngôn ngữ khác. Sự tương tác này có thể bởi vì các trình
biên dịch ngông ngữ và các công cụ phát triển hướng đến sử dụng CRL với một
hệ thống kiểu dữ liệu chung được định nghĩa bởi thư viện Runtime.
FrameWork, Languages, Tools
Visual Basic

C++

C#



CLS – Common Language Specification
Web Service

User Interface
Visual Studio.
NET

Data and XML
Base Class Library
CLR – Common Language Runtime

Hình 1.1. Các thành phần cấu thành .NET Framework


5


1.2. Ngôn ngữ C#
C# được thiết kế riêng để dùng cho Microsoft's .NET Framework (Một nền
khá mạnh cho sự phát triển, triển khai, hiện thực và phân phối các ứng dụng).
C# là một ngôn ngữ hoàn toàn hướng đối tượng được thiết kế dựa trên kinh
nghiệm của các ngôn ngữ hướng đối tượng khác.
Một điều quan trọng cần nhớ C# là một ngôn ngữ độc lập. Nó được thiết kế
để có thể sinh ra mã đích trong môi trường .NET, nó không phải là một phần của
.NET bởi vậy có một vài đặc trưng được hỗ trợ bởi .NET nhưng C# không hỗ trợ
và có những đặc trưng C# hỗ trợ mà .NET không hỗ trợ (chẳng hạn như quá tải
toán tử).
1.2.1. Cấu trúc chương trình của ngôn ngữ C#
+) Lớp

Lớp là một khuôn mẫu thiết yếu mà chúng ta cần tạo ra đối tượng. Mỗi đối
tượng chứa dữ liệu và các phương thức chế tác truy cập dữ liệu. Lớp định nghĩa
cái mà dữ liệu và hàm của mỗi đối tượng riêng biệt (được gọi là thể hiện) của lớp
có thể chứa.

+) Các lớp thành viên
Dữ liệu và các hàm không có lớp đượp biết như là lớp thành viên
+) Thành phần dữ liệu
Thành phần dữ liệu (Data members) là những thành phần chứa dữ liệu cho
lớp – trường (fields), hằng số (constants), và sự kiện (events).

+) Hàm thành phần (Function Members):
Bao gồm các thuộc tính và các phương thức. Chúng ta sử dụng các từ khoá

sau để bổ nghĩa cho một phương thức:
Từ khóa

Diễn giải

new

Phương thức ẩn một phương thức kế thừa với cùng kí hiệu

public

Phương thức có thể được truy cập bất kỳ

protected
internal

Phương thức có thể bị truy xuất không từ lớp nó thuộc hoặc
từ lớp dẫn xuất.
Phương thức có thể được truy cập không cùng assembly

6


private

static

Phương thức có thể được truy cập từ bên trong lớp nó phụ
thuộc
Phương thức có thể không được tính trên trên một lớp thể

hiển cụ thể

virtual

Phương thức bị ghi đè bởi một lớp dẫn xúât

abstract

Phương thức trừu tượng

override

sealed

extern

Phương thức ghi đè một phương thức ảo kế thừa hoặc trừu
tượng.
Phương thức ghi đè một phương thức ảo kế thừa, nhưng
không thể bị ghi đè từ lớp kế thừa này
Phương thức được thực thi theo bên ngoài từ một ngôn ngữ
khác
Bảng 1.1. Danh sách các từ khóa

1.2.2. Những kiểu cơ sở của ngôn ngữ C#
C# buộc phải khai báo kiểu của đối tượng được tạo. Khi kiểu được khai báo
rõ ràng, trình biên dịch sẽ giúp ngăn ngừa lỗi bằng cách kiểm tra dữ liệu được
gán cho đối tượng có hợp lệ không, đồng thời cấp phát đúng kích thước bộ nhớ
cho đối tượng.
C# phân thành hai loại: loại dữ liệu dựng sẵn và loại do người dùng định

nghĩa.
C# cũng chia tập dữ liệu thành hai kiểu: giá trị và tham chiếu. Biến kiểu giá
trị được lưu trong vùng nhớ stack, còn biến kiểu tham chiếu được lưu trong
vùng nhớ heap.
C# cũng hỗ trợ kiểu con trỏ của C++, nhưng ít khi được sử dụng. Thông
thường con trỏ chỉ được sử dụng khi làm việc trực tiếp với các hàm API của
windows hay các đối tượng COM.
+) Loại dữ liệu định sẵn
C# có nhiểu kiểu dữ liệu định sẵn, mỗi kiểu ánh xạ đến một kiểu được hổ
trợ bởi CLS (Commom Language Specification), ánh xạ để đảm bảo rằng đối
tượng được tạo trong C# không khác gì đối tượng được tạo trong các ngôn ngữ

7


.NET khác như kiểu byte, long, char, float, double, bool.
+) Chuyển đổi kiểu định sẵn
Một đối tượng có thể chuyển từ kiểu này sang kiểu kia theo hai hình thức
ngầm hoặc tường minh. Hình thức ngầm được chuyển tự động còn hình thức
tường minh cần sự can thiệp trực tiếp của người lập trình (giống với C++ và
Java).
short x = 5;
int y ;
y = x; // chuyển kiểu ngầm định - tự động
x = y; // lỗi, không biên dịch được
x = (short) y; // OK
+) Kểu do người dùng định nghĩa
Để định nghĩa một kiểu dữ liệu ta sử dụng từ khóa struct
struct Tenkieu
{

Kieu1 <tên trường1>
…….
Kieun <tên trườngn>
}
1.2.3. Các lệnh điều khiển
Các từ khóa if-else, while, do-while, for, switch-case, dùng để điều khiển
dòng chảy chương trình. C# giữ lại tất cả các cú pháp của C++, ngoại trừ switch
có vài cải tiến.
+) Lệnh If .. else …
Cú pháp:
if ( biểu thức logic )
khối lệnh;
hoặc
if ( biểu thức logic )
khối lệnh 1;
else
khối lệnh 2;
Biểu thức logic là biểu thức cho giá trị dúng hoặc sai (true hoặc false).
Nếu “biểu thức logic” cho giá trị đúng thì “khối lệnh” hay “khối lệnh 1” sẽ

8


được thực thi, ngược lại “khối lệnh 2” sẽ thực thi. Một điểm khác biệt với
C++ là biểu thức trong câu lệnh if phải là biểu thức logic, không thể là biểu
thức số.
+) Lệnh switch
Cú pháp:
switch ( biểu_thức_lựa_chọn )
{

case biểu_thức_hằng :
khối lệnh;
lệnh nhảy;
[ default : khối lệnh; lệnh nhảy; ]
}
Biểu thức lựa chọn là biểu thức sinh ra trị nguyên hay chuỗi. Switch sẽ
so sánh biểu_thức_lựa_chọn với các biểu_thức_hằng để biết phải thực hiện
với khối lệnh nào. Lệnh nhảy như break, goto…để thoát khỏi câu switch và bắt
buộc phải có.
+) Lệnh lặp
C# cung cấp các lệnh lặp giống C++ như for, while, do-while và lệnh
lặp mới foreach. Nó cũng hổ trợ các câu lệnh nhảy như: goto, break, continue
và return.
+) Lệnh goto
Lệnh goto có thể dùng để tạo lệnh nhảy nhưng nhiều khi nhà lập trình
chuyên nghiệp khuyên không nên dùng câu lệnh này vì nó phá vỡ tính cấu
trúc của chương trình.
Cách dùng câu lệnh này như sau:
1. Tạo một nhãn
2. goto đến nhãn đó.
+) Vòng lặp while
Cú pháp:
while ( biểu_thức_logic )
khối_lệnh;
Khối_lệnh sẽ được thực hiện cho đến khi nào biểu thức còn đúng. Nếu
ngay từ đầu biểu thức sai, khối lệnh sẽ không được thực thi.

9



+) Vòng lặp do … while
Cú pháp:
do
khối_lệnh
while ( biếu_thức_logic )
Khác với while khối lệnh sẽ được thực hiện trước, sau đó biểu thức được
kiểm tra. Nếu biểu thức đúng khối lệnh lại được thực hiện.
+) Vòng lặp for
Cú pháp:
for ( [khởi_tạo_biến_đếm]; [biểu_thức]; [gia_tăng_biến_đếm] )
khối lệnh;
+) Câu lệnh break, continue, và return
Cả ba câu lệnh break, continue, và return rất quen thuộc trong C++ và
Java, trong C#, ý nghĩa và cách sử dụng chúng hoàn toàn giống với hai ngôn
ngữ này.
1.2.4. C# hướng đối tượng
+) Lớp và thừa kế
Lớp trong C# được định nghĩa với cú pháp sau:
Class MyClass
{
private int someField;
Publich string SomeMethod(bool parameter)
{
}
}
Các lớp bao gồm nhiều thành viên, mỗi thành viên là thuật ngữ(term) dùng để
chỉ đến một dữ liệu hay một chức năng nào đó được định nghĩa trong lớp đó. Ví
dụ chúng ta dùng thuật ngữ Function để chỉ những thành viên chứa mã như các
phương thức(methods), các thuộc tính(properties), constructor, hay các nạp
chồng toán hạng(Operator Overloads).

Tất cả các lớp trong C# là những kiểu tham khảo. Tức là khi bạn khai báo một
kiểu lớp thì có một biến lưu trữ sự tham khảo đến một thể hiện (instance) của lớp
đó. Và sử dụng lệnh new để tạo ra một đối tượng.

10


Ví dụ tạo ra đối tượng myObject như sau:
MyClass myObject;
myObject=new MyClass();
Tuy nhiên bạn có thể khai báo và khởi tạo đối tượng cùng một lúc.
MyClass myObject=new MyClass();
C# hỗ trợ đơn thừa kế giữa các lớp. Một lớp có thể thừa hưởng những
thuộc tính và phương thức từ một lớp khác. Cú pháp:
class MyDerivedClass: MyBaseClass
{
//functions and data members here
}
+) Phương thức nạp chồng(Overloading)
Một cách đơn giản là bạn khai báo những phương thức cùng tên nhưng khác
số lượng và kiểu của thông số:
class ResultDisplayer
{
void DisplayResult (string result)
{
//implementation
}
void DisplayResult (int result)
{//implementation
}

}
+) Phương thức Overriden và Hide
Bằng cách khai báo virtual trong một hàm ở lớp cơ sở thì cho phép hàm đó
được overriden trong bất kỳ một lớp thừa hưởng nào.
Class MyBaseClass
{
Public virtual string VirtualMethod()
{
return “This method is virtual and defined in MyBaseClass”;
}
}

11


+) Thuộc tính(properties)
Để định nghĩa thuộc tính trong C# bạn dùng cú pháp sau:
Public string SomeProperty
{
get
{
Return “This is the property value”;
}
Set
{
//
Do whatever needs to be done to set the property
}
}
+) Lớp đối tượng

Trong C#, nếu bạn không chỉ rõ rằng một lớp thì thừa kế từ một lớp khác thì
trình biên dịch sẽ tự động hiểu rằng lớp của bạn thừa kế từ lớp Object. Đều này
có nghĩa là ngoài những thuộc tính và phương thức mà bạn định nghĩa thì bạn có
thể truy cập đến những phương thức protected và public của lớp Object. Và
những phương thức này cũng có trong tất cả lớp mà bạn định nghĩa.
Bảng 1.2. Một số phương thức được định nghĩa trong lớp Object là:
Phương thức

Bổ từ truy cập

string ToString()

public virtual

int GetHashTable()

public virtual

bool Equals(object
obj)
bool Equals(object
objA, object objB)
bool
ReferenceEquals(object
objA, object objB)
Type GetType()
object
MemberwiseClone()
void Finalize()


public virtual
public static
public static
public
protected
protected
virtual

12

Chức năng
Trả về một chuỗi mô tả của
đối tượng
Được sử dụng nếu thi hành
từ điển
So sánh các thực thể của đối
tượng
So sánh các thực thể của đối
tượng
So sánh hai sự tham khảo
đến một đối tượng
Trả về chi tiết kiểu của một
đối tượng.
tạo ra một bản copy của đối
tượng
Đây là một dạng Destructor
của .Net


+) Giao diện

C# hỗ trợ giao diện (Interfaces). Khi thừa kế một giao diện, một lớp đang
khai báo sẽ thực thi những hàm nào đó.
+) Constructor
Cú pháp khai báo một Constructor là : chúng ta khai báo một phương thức mà
cùng tên với lớp và không có kiểu trả về.
Public class MyClass
{
Public MyClass()
{
}
Các contructor theo cùng luật overloading như các phương thức khác. Bạn
cũng có thể tạo nhiều constructor cùng tên và khác tham số giống như các
phương thức nạp chồng:
Public MyClass()
{
//construction code
}
Public MyClass(int number)
{
//construction code
}
Constructor tĩnh(static): Chúng ta định nghĩa một constructor tĩnh để khởi tạo
giá trị cho các biến tĩnh.
Chúng ta có thể gọi các constructor từ những constructor khác.
+) Struct
Cú pháp để định nghĩa một struct được mô tả trong ví dụ sau:
Struct Dimensions
{
public double Length;
public double Width;

}
Một struct được định nghĩa gần giống như một lớp chỉ khác từ khoá và một
vài điểm như sau:
1. Struct là một kiểu giá trị, không phải là kiểu tham khảo.
2. Struct không hổ trợ thừa kế.

13


3. Có vài sự khác nhau trong cách làm việc của các constructor đối với struct.
Trình biên dịch luôn luôn cung cấp một constructor không tham số mặc định, và
không được cho phép thay thế.
4. Với một struct, bạn có thể chỉ rỏ cách mà các trường được đặt ngoài bộ
nhớ.
1.3. Mô hình đối tượng ADO.NET
ADO.NET chứa hai không gian tên cơ sơ dữ liệu - một cho SQL Server, và
một cái khác cho các cơ sở dữ liệu được trình bày thông qua một giao diện OLE
DB. Nếu cơ sở dữ liệu của bạn chọn là một bộ phận của OLE DB, bạn có thể dễ
dàng kết nối với nó từ .NET - chỉ cần dùng các lớp OLE DB và kết nối thông qua
các driver cơ sở dữ liêu hiện hành của bạn.
1.3.1. Các Namespace
Tất cả các ví dụ trong chương này truy xuất dữ liệu trong một vài cách. Các
không gian tên sau chỉ ra các lớp và các giao diện được dùng cho việc truy xuất
dữ liệu trong .NET:


System.Data - Các lớp truy xuất dữ liệu chung




System.Data.Common - Các lớp dùng chung của các data provider khác nhau



System.Data.OleDb - Các lớp của OLE DB provider



System.Data.SqlClient - Các lớp của SQL Server provider



System.Data.SqlTypes - Cac kiểu của SQL Server

1.3.2. Các lớp dùng chung
ADO.NET chứa một số lớp được dùng không quan tâm là bạn đang dùng các
lớp của SQL Server hay là các lớp của OLE DB.
Các lớp trong không gian tên System.Data được liệt kê sau đây:


DataSet - Đối tượng này chứa một bộ các DataTable, có thể bao gồm quan

hệ giữa các bảng, và nó được thiết kế cho truy xuất dữ liệu không kết nối.


DataTable - Một kho chứa dữ liệu. Một DataTable bao gồm một hoặc nhiều

DataColumns, và khi được tạo ra nó sẽ có một hoặc nhiều DataRows chứa dữ
liệu.


14




DataRow - Một bộ giá trị, có quan hệ với một dòng trong bảng cơ sở dữ

liệu, hoặc một dòng của bảng tính.


DataColumn - Chứa định nghĩa của một cột, chẳng hạn như tên và kiểu dữ

liệu.


DataRelation - Một liên kết giữa hai DataTable trong một DataSet. Sử dụng

cho khóa ngoại và các mối quan hệ chủ tớ.


Constraint - Định nghĩa một qui tắt cho một DataColumn (hoặc môt bộ các

cột dữ liệu), như các giá trị là độc nhất.
Sau đây là hai lớp trong không gian tên System.Data.Common:


DataColumnMapping - Ánh xạ tên của một cột từ cơ sở dữ liệu vào tên của

một cột trong một DataTable.



DataTableMapping - Ánh xạ tên của một bảng từ cơ sở dữ liệu vào một

bảng trong một DataSet.
1.3.3. Các lớp cơ sở dữ liệu chuyên biệt
Bổ sung cho các lớp dùng chung ở trên, ADO.NET có một số các lớp dữ liệu
chuyên biệt được đưa ra dưới đây. Các lớp này thực thi một bộ các giao diện
chuẩn được định nghĩa trong không gian tên System.Data, cho phép sử dụng các
lớp có cùng kiểu giao diện. Ví dụ cả hai lớp SqlConnection và OleDbConnection
thực thi giao diện IDbConnection.


SqlCommand, OleDbCommand - Một vỏ bọc của các câu lệnh SQL hoặc

các lời gọi stored procedure.


SqlCommandBuilder, OleDbCommandBuilder - Một lớp sử dụng các câu

lệnh SQL (chẳng hạn như các câu lệnh INSERT, UPDATE, vàDELETE) từ một
câu lệnh SELECT.


SqlConnection, OleDbConnection - Kết nối với cơ sở dữ liệu. Giống như

một ADO Connection.


SqlDataAdapter, OleDbDataAdapter - Một lớp giữ các câu lệnh select,


insert, update, và delete, chúng được sử dụng để tạo một DataSet và cập nhật
Database.


SqlDataReader, OleDbDataReader - Chỉ đọc, kết nối với data reader.

15




SqlParameter, OleDbParameter - Định nghĩa một tham số cho một stored

procedure.


SqlTransaction, OleDbTransaction - Một giao tiếp cơ sở dữ liện, được bọc

trong một đối tượng.
Cơ sở dữ liệu (database) là một tổ chức tập hợp các thông tin được lưu trong
file Visual Basic.Net (VB.NET) không thiết kế cho mục đích tạo cơ sở dữ liệu,
nó được dùng để truy xuất, hiển thị, phân tích dữ liệu chứa trong các CSDL. Với
ADO.NET của VB.NET bạn có thể truy xuất đến mọi hệ CSDL.

DataBase

Connection
DataSet

Application


DataAdapter

Hình 1.2. Mô hình kết nối của các đối tượng khi truy xuất CSDL trong
ADO.NET
 Trước hết là thiết lập kết nối đến CSDL, tiếp đến đối tượng điều phối dữ
liệu (DataAdapter) được tạo ra để truy vấn dữ liệu từ các bảng. Tiếp đến là việc
tạo ra đối tượng DataSet chứa bảng dữ liệu bạn muốn trích rút thông tin (DataSet
chỉ là thông tin copy từ dữ liệu thật). Cuối cùng, bạn có thể gắn các thông tin
trong DataSet vào các đối tượng hiển thị trên form như TextBox, Label, Button,
DataGrid…
 Thành phần ADO.NET được thiết kế nhằm tăng tốc độ truy cập và thao tác
dữ liệu trong môi trường đa lớp (n-tier). Thành phần chính của ADO.NET là
DataSet và .NET Provider.

16


 DataSet có thể mô phỏng dữ liệu một cách hợp lý hay trừu tượng , khác
với Recordset, DataSet kkhông những là Container để chứa đựng và kiểm soát
toàn bộ mẩu tin mà còn giữ nhiều bảng dữ liệu và các quan hệ giữa chúng .
 .NET Provider là một tập hợp các đối tượng trong thành phần .NET bao
gồm: Connection ( kết nối CSDL ), Command ( lệnh thi hành ), DataReader ( bộ
đọc dữ liệu ) ,và DataAdapter ( kết nối và điều phối dữ liệu ).
System.Data
DataRelation
DataTable

DataTable
Data

Column

Data
View

Data
Column

DataRow

DataRow

UI
Data Provider
DataReader

DataAdapter

Command

Connection

Hình 1.3. Mô hình đối tượng ADO.NET
ADO.NET kết nối vào cơ sở dữ liệu để lấy dữ liệu và kết nối trở lại để cập
nhật dữ liệu khi người dùng thay đổi chúng. Hầu hết mọi ứng dụng đều sử
dụng nhiều thời gian cho việc đọc và hiển thị dữ liệu, vì thế ADO.NET đã
cung cấp một tập hợp con các đối tượng dữ liệu không kết nối cho các ứng
dụng để người dùng có thể đọc và hiển thị chúng mà không cần kết nối vào cơ
sở dữ liệu.


17


Hình 1.4. Kiến trúc ADO.NET
ADO.NET được chia ra làm hai phần chính rõ rệt, được thể hiện qua hình:
DataSet là thành phần chính cho đặc trưng kết nối không liên tục của
kiến trúc ADO.NET. DataSet được thiết kế để có thể thích ứng với bất kỳ
nguồn dữ liệu nào. DataSet chứa một hay nhiều đối tượng DataTable mà nó
được tạo từ tập các dòng và cột dữ liệu, cùng với khoá chính, khóa ngoài,
ràng buộc và các thông tin liên quan đến đối tượng DataTable này. Bản thân
DataSet được định dng như một tập tin XML.
Thành phần chính thứ hai của ADO.NET chính là NET Provider Data, nó
chứa các đối tượng phục vụ cho việc thao tác trên cơ sở dữ liệu được hiệu
quả và nhanh chóng, nó bao gồm một tập các đối tượng Connection,
Command, DataReader và DataAdapter. Đối tượng Connection cung cấp
một kết nối đến cơ sở dữ liệu, Command cung cấp một thao tác đến cơ sở
dữ liệu, DataReader cho phép chỉ đọc dữ liệu và DataAdapter là cấu nối trung
gian giữa DataSet và nguồn dữ liệu.

18


CHƯƠNG 2
MỘT SỐ LÝ THUYẾT CƠ SỞ ỨNG DỤNG CHO BÀI TOÁN
XẾP THỜI KHÓA BIỂU
2.1. Khái quát về hệ chuyên gia
Hệ chuyên gia là một chương trình máy tính được thiết kế để mô phỏng
chuyên gia, thực hiện giải quyết vấn đề.
2.1.1. Những thành phần cơ bản của một hệ chuyên gia
Hệ chuyên gia gồm 6 thành phần:

Cơ sở tri thức: là thành phần chính của hệ chuyên gia. Nó được xây dựng dựa
trên tri thức của hệ chuyên gia, chứa các tri thức về lĩnh vực đó và lĩnh vực liên
quan.
Bộ nhớ làm việc: chứa các sự kiện liên quan đến vấn đề cần giải quyết.
Máy suy diễn: là phương pháp mà chuyên gia giải quyết vấn đề.
Phương tiện giải thích: là cách giải thích cho người sử dụng hiểu vấn đề này.
Khả năng thu nhận tri thức: là khả năng bổ xung tri thức mới.
Giao diện người sử dụng: cho phép người sử dụng tương tác với hệ thống.

Hình 2.1. Các thành phần của hệ chuyên gia
2.1.2. Kỹ thuật suy luận trong các hệ chuyên gia
Có nhiều phương pháp để suy luận trong các chiến lược giải quyết vấn đề của
hệ chuyên gia. Những phương pháp hay gặp là suy diễn tiến, suy diễn lùi, và phối
hợp hai phương pháp này. Các phương pháp khác như phân tích phương tiện, rút
gọn vấn đề, quay lui, kiểm tra lập kế hoạch, lập kế hoạch phân cấp.

19


Hình 2.2. Nền tảng của công nghệ hệ chuyên gia dựa trên luật hiện đại
2.1.3. Biểu diễn tri thức trong các hệ chuyên gia
- Khái niệm tri thức
Tri thức là sự hiểu biết về lĩnh vực, về chủ đề của con người.
Thể hiện tri thức là quá trình mô phỏng tri thức trong cơ sở tri thức của hệ
thống.
- Các dạng tri thức
+ Tri thức thủ tục: là loại tri thức cho biết phương hướng để thực hiện hành
động hoặc để giả quyết vấn đề.
+ Tri thức mô tả: là loại tri thức khẳng định giá trị của thuộc tính về đối
tượng. Thông qua loại tri thức này người ta sẽ hình dung về đối tượng, về vấn đề

và về hành động.
+ Tri thức may rủi: là loại tri thức được xây dựng không dựa trên cơ sở khoa
học mà chủ yếu dựa vào kinh nghiệm để hình thành.
+ Tri thức cấu trúc: là loại tri thức diễn tả các cấu trúc của tri thức, nó miêu tả
cách thức tổ chức, chức năng và quan hệ giữa các tri thức.
+ Tri thức meta: là loại tri thức diễn tả ý nghĩa trực tiếp về đối tượng, làm
giảm hoặc tăng tầm quan trọng hoặc ý nghĩa của đối tượng, vấn đề.
- Thể hiện tri thức dưới dạng các luật IF…THEN…
Chúng ta có thể biểu diễn tri thức qua một số kỹ thuật như: thể hiện tri thức
bằng cặp 3 đối tượng – thuộc tính – giá trị, thể hiện tri thức nhờ các luật, thể hiện
tri thức qua mạng ngữ nghĩa, thể hiện tri thức qua các khung, thể hiện tri thức
qua logic (mệnh đề và vị từ).

20


- Độ tin cậy của vấn đề
Các chuyên gia thường đánh giá, suy xét khi giải quyết vấn đề. Thông tin về
vấn đề có thể không đầy đủ và không xác thực. Người ta dùng lý thuyết xác suất
để đánh giá độ tin cậy của vấn đề và xây dựng lên lý thuyết chắc chắn.
Gọi CF là nhân tố chắn chắn và CF là một giá trị thuộc khoảng [0..1]. Nếu CF
càng lớn thì độ tin cậy của sự kiện đó cũng càng lớn và xác suất xảy ra sự kiện đó
càng cao. Ngược lại, nếu CF càng nhỏ thì xác suất xảy ra sự kiện đó càng nhỏ.
2.2. Khái quát về tập hợp
Ta có thể hiểu tập hợp là một tập các phần tử cùng thỏa mãn một hay một số
tính chất nào đó và được kí hiệu A, B, C, X, Y, Z,...
Để biểu diễn một tập hợp ta có hai cách sau:
Cách 1: liệt kê tất cả các phần tử thuộc tập hợp
Cách 2: chỉ ra những tính chất đặc trưng P nào đó của các phần tử thuộc tập
hợp.

Hợp của hai tập hợp: hợp của 2 tậphợp A và B là một tập kí hiệu A  B gồm
tất cả các phần tử thuộc ít nhất một trong hai tập hợp đã cho.
A  B = {x | x  A hoặc x  B}
Giao của hai tập hợp: giao của hai tập hợp A và B là một tập hợp kí hiệu là
A  B gồm tất cả các phần thuộc đồng thời cả hai tập A và B.
A  B = {x | x  A và x  B }
Hiệu của hai tập hợp: hiệu của hai tập A và B là một tập kí hiệu là A\B gồm
các phần tử thuộc tập A mà không thuộc B.
A\B = { x | x  A và x  B }
2.3. Bài toán tìm kiếm
2.3.1. Giải quyết vấn đề bằng tìm kiếm
Khi muốn giải quyết một vấn đề nào đó bằng cách tìm kiếm, đầu tiên ta phải
xác định được không gian tìm kiếm. Không gian tìm kiếm bao gồm tất cả các đối
tượng cần quan tâm tìm kiếm. Nó có thể là không gian liên tục, chẳng hạn không
gian vectơ n chiều; nó cũng có thể là không gian các đối tượng rời rạc. Vấn đề là
làm thế nào để biểu diễn được các đối tượng trong không gian tìm kiếm. Một

21


trong phương pháp phổ biến là sử dụng không gian trạng thái. Khi đó việc giải
quyết vấn đề sẽ quy về việc tìm kiếm trong không gian trạng thái. Bài toán xếp
Thời khóa biểu thực chất cũng là một bài toán tìm kiếm phương án sắp xếp trong
miền thời gian của lớp và của giáo viên. Chính vì vậy, ta có thể áp dụng ta có thể
áp dụng các chiến lược tìm kiếm trong không gian trạng thái để giải quyết bài
toán này bằng cách coi mỗi tiết học trong miền thời gian của giáo viên và lớp là
một trạng thái và hàm tìm kiếm vị trí là các toán tử.
Để biểu diễn vấn đề trong không gian trạng thái người ta sử dụng một tập các
trạng thái và các toán tử và khi muốn biểu diễn một vấn đề nào đó cần phải xác
định được các yếu tố sau:

 Trạng thái ban đầu
 Một tập các toán tử. Trong mỗi toán tử tả một hành động hoặc một phép
biến đổi để có thể đưa một trạng thái tới một trạng thái khác. Tập tất cả các trạng
thái có thể đạt tới từ một trạng thái ban đầu bằng cách áp dụng một dãy toán tử
lập thành không gian trạng thái của vấn đề.
Ta kí hiệu không gian trạng thái là U, trạng thái ban đầu là u 0 (u0  U), Mỗi
toán tử R có thể xem như một ánh xạ R: U ->U.
 Một tập hợp T các trạng thái kết thúc (trạng thái đích), T là tâp con của
không gian U.
Khi biểu diễn vấn đề thông qua các trạng thái và các toán tử thì việc tìm
nghiệm của bài toán quy về việc tìm đường đi từ trạng thái ban đầu tới trạng thái
kết thúc (đích). Có thể biểu diễn không gian trạng thái bằng đồ thị định hướng,
trong đó mỗi đỉnh của đồ thị tương ứng với một trạng thái.
2.3.2. Các chiến lược tìm kiếm trong không gian trạng thái
Có thể phân chia các chiến lược tìm kiếm thành hai loại: chiến lược tìm kiếm
mù và chiến lược tìm kiếm kinh nghiệm:
Chiến lược tìm kiếm mù (blind search): trong chiến lược tìm kiếm này, không
có một sự hướng dẫn nào cho sự tìm kiếm, mà ta chỉ phát triển các trạng thái ban
đầu cho tới khi gặp một trạng thái đích nào đó. Có hai kỹ thuật tìm kiếm mù đó là
tìm kiếm theo bề rộng và tìm kiếm theo độ sâu.

22


Tư tưởng của tìm kiếm theo bề rộng là: các trạng thái được phát triển theo thứ
tự mà chúng được sinh ra, tức là trạng thái nào được sinh ra trước sẽ được phát
triển trước. Còn tư tưởng của tìm kiếm theo độ sâu là các trạng thái sinh ra sau sẽ
được phát triển trước.
Trong nhiều vấn đề, dù phát triển các trạng thái theo bề rộng hoặc theo bề sâu
thì số lượng các trạng thái sinh ra trước khi gặp trạng thái đích cũng rất lớn. Do

đó, các thuật toán tìm kiếm mù kém hiệu quả, đòi hỏi rất nhiều không gian và
thời gian. Trong thực tế, nhiều vấn đề không giải quyết được bằng tìm kiếm mù.
Chiếm lược tìm kiếm kinh nghiệm (heuristis search): chiến lược này sử dụng
sự hiểu biết về vấn đề để đánh giá các trạng thái và hướng dẫn sự tìm kiếm.
Trong quá trình phát triển trạng thái, ta sẽ chọn trong số các trạng thái chờ phát
triển, trạng thái được đánh giá tốt nhất sẽ được chọn để phát triển trước. Do đó,
tốc độ tìm kiếm sẽ nhanh hơn.
Như vậy, chiến lược tìm kiếm được xác định bởi chiến lược chọn trạng thái
để phát triển ở mỗi bước. Trong tìm kiếm mù việc chọn trạng thái theo thứ tự mà
chúng được sinh ra; còn trong tìm kiếm kinh nghiệm việc chọn trạng thái dựa vào
sự đánh giá các trạng thái.
+) Các chiến lược tìm kiếm mù
Tìm kiếm theo bề rộng: Tư tưởng trong tìm kiếm theo bề rộng là tại mỗi
bước ta sẽ chọn trạng thái để phát triển là trạng thái được sinh ra trước trong các
trạng thái chờ phát triển khác. Danh sách L được sử dụng để lưu các trạng thái đã
được sinh ra và chờ được phát triển. Mục tiêu của tìm kiếm trong không gian
trạng thái là tìm đường đi từ trạng thái ban đầu tới trạng thái đích, do đó trong
quá trình tìm kiếm ta cần lưu lại vết của đường đi. Ta có thể sử dụng mảng father
để lưu lại vết của đường đi, father[v]=u nếu cha của đỉnh v là u.
Trong tìm kiếm bề rộng, trạng thái nào sinh ra trước sẽ được phát triển trước
(theo nguyên tắc FIFO), do đó danh sách L được xử lý như hằng đợi (Queue).
Nếu bài toán có nghiệm (tồn tại đường đi từ trạng thái ban đầu đến trạng thái
đích), thì thuật toán tìm kiếm theo bề rộng sẽ tìm ra nghiệm, đồng thời đường đi

23


tìm được là ngắn nhất. Trong trường hợp bài toán vô nghiệm và không gian trạng
thái là hữu hạn, thuật toán sẽ dừng và cho thông báo vô nghiệm.
Đánh giá độ phức tạp: Giả sử rằng, mỗi trạng thái khi được phát triển sẽ sinh

ra b trạng thái kề. Ta gọi b là nhân tố nhánh. Giả sử rằng, nghiệm của bài toán là
đường đi có độ dài d. Bởi vì nghiệm có thể được tìm ra tại một đỉnh bất kỳ ở mức
d của cây tìm kiếm, do đó số đỉnh cần xem xét để tìm ra nghiệm là:
1 + b + b2 + ... + bd-1 + k.
Trong đó k có thể là 1,2,...,bd. Do đó số đỉnh lớn nhất cần xem xét là:
1 + b + b2 +...+ bd.
Như vậy độ phức tạp thời gian của thuật toán tìm kiếm theo bề rộng là: O(bd)
Độ phức tạp không gian cũng là O(bd), bởi vì ở đây cần lưu vào danh sách L
tất cả các đỉnh của cây tìm kiếm ở mức d, số các đỉnh này là bd.
Tìm kiếm theo độ sâu: Tư tưởng trong tìm kiếm theo độ sâu là tại mỗi bước
ta sẽ chọn trạng thái để phát triển là trạng thái được sinh ra sau cùng trong số các
trạng thái chờ phát triển. Cũng như trong tìm kiếm theo bề rộng, danh sách L
được sử dụng để lưu các trạng thái đã được sinh ra và chờ được phát triển và sử
dụng mảng father để lưu lại vết của đường đi, father[v]=u nếu cha của đỉnh v là
u.
Đánh giá độ phức tạp: Giả sử rằng, nghiệm của bài toán là đường đi có độ dài
d, cây tìm kiếm có nhân tố nhánh là b và có chiều cao là d. Có thể xảy ra, nghiệm
là đỉnh ngoài cùng bên phải trên mức d của cây tìm kiếm, do đó độ phức tạp thời
gian của cây tìm kiếm theo độ sâu trong trường hợp xấu nhất là O(bd), tức là
cũng như tìm kiếm theo bề rộng. Tuy nhiên trên thực tế đối với nhiều bài toán
tìm kiếm theo độ sâu thực sự nhanh hơn tìm kiếm theo bề rộng. Lý do là tìm
kiếm theo bề rộng phải xem xét toàn bộ cây tìm kiếm tới mức (d-1), rồi mới xem
xét các đỉnh ở mức d. Còn trong tìm kiếm theo độ sâu, có thể chỉ cần xem xét
một bộ phận nhỏ của cây tìm kiếm thì đã tìm ra nghiệm.
Trên đây hai chiến lược tìm kiếm mù rất phổ biến và thông dụng, song sự kết
hợp hai chiến lược này để tận dụng được các thế mạnh của mỗi chiến lược. Đó là
chiến lược tìm kiếm sâu lặp.

24



Tìm kiếm sâu lặp: Nếu cây tìm kiếm chứa nhánh vô hạn, khi sử dụng tìm
kiếm theo độ sâu, ta có thể mắc kẹt ở nhánh đó và không tìm ra nghiệm. Để khắc
phục hoàn cảnh đó, ta chỉ tìm kiếm độ sâu ở mức d nào đó. Nếu không tìm ra
nghiệm, ta tăng độ sâu lên 1. Quá trình trên được lặp lại lại với d lần lượt là: 1,
2,... đến một độ sâu max nào đó. Như vậy thuật toán tìm kiếm sâu lặp sẽ sử dụng
thủ tục tìm kiếm sâu hạn chế như thủ tục con. Đó là thủ tục tìm kiếm theo độ sâu
d nào đó rồi quay lên.
Kỹ thuật tìm kiếm sâu lặp kết hợp được các ưu điển của tìm kiếm theo bề
rộng và tìm kiếm theo độ sâu và có những đặc điểm như sau:
- Cũng như tìm kiếm theo bề rộng, tìm kiếm sâu lặp luôn tìm ra nghiệm (nếu
bài toán có nghiệm), miễn là ta chọn độ sâu max đủ lớn.
- Trong tìm kiếm sâu lặp chỉ cần không gian nhớ như tìm kiếm theo độ sâu.
- Trong tìm kiếm sâu lặp, ta phải phát triển lặp lại nhiều lần cùng một trạng
thái. Điều đó làm cho ta có cảm giác rằng, tìm kiếm sâu lặp lãng phí nhiều thời
gian. Thực ra, thời gian cho phát triển lặp lại các trạng thái là không đáng kể so
với thời gian tìm kiếm theo bề rộng. Thật vậy, mỗi lần gọi thủ tục tìm kiếm sâu
hạn chế tới mức d, nếu cây tìm kiếm có nhân tố nhánh là b, thì số đỉnh cần phát
triển là: 1 + b + b2 + ...+ bd.
Nếu nghiệm ở độ sâu d, thì trong tìm kiếm sâu lặp, ta phải gọi thủ tục tìm
kiếm sâu hạn chế với độ sâu lần lượt là: 0, 1, 2, ..., d. Do đó các đỉnh ở mức 1
phải phải phát triển lặp d lần, các đỉnh ở mức 2 lặp d-1 lần, ... , các đỉnh ở mức d
lặp 1 lần. Như vậy tổng số đỉnh cần phát triển trong tìm kiếm sâu lặp là: (d+1)1 +
db + (d-1)b2 + ...+ 2bd-1 + 1bd. Do đó thời gian tìm kiếm sâu lặp là O(bd).
Tóm lại, thời gian tìm kiếm sâu lặp có độ phức tạp thời gian là O(bd) như
trong tìm kiếm theo bề rộng, và có độ phức tạp không gian là O(bd) như tìm kiếm
theo độ sâu. Nói chung, ta nên áp dụng tìm kiếm sâu lặp cho các vấn đề có không
gian trạng thái lớn và độ sâu của nghiệm không biết trước. Có thể nói rằng, đây
là chiến lược tốt nhất trong các chiến lược tìm kiếm mù.


25


×