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

Ứng dụng phân cụm mờ trong bài toán dự báo ảnh mây vệ tinhb

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.19 MB, 84 trang )

LỜI CẢM ƠN
Để thực hiện bài báo cáo này, em đã nhận được sự giúp đỡ rất nhiều từ phía
nhà trường và Trung tâm tính toán hiệu năng cao - trường Đại học Khoa học tự
nhiên Hà Nội. Em xin gửi lời cảm ơn chân thành đến:
Khoa Công nghệ Thông tin đã trang bị cho chúng em những kiến thức căn bản.
Em xin cảm ơn Samsung Lab - trường Đại Học Công Nghệ Thông Tin và
Truyền Thông đã cho em có nơi nghiên cứu đề tài tốt nhất.
Em xin gửi lời cảm ơn đến anh Phạm Huy Thông – cán bộ Trung tâm tính
toán hiệu năng cao - trường Đại học Khoa học tự nhiên Hà Nội đã nhiệt tình chỉ
bảo, giúp đỡ em trong quá trình làm đồ án.
Em xin chân thành cảm ơn giáo viên hướng dẫn – Th.S. Trần Mạnh Tuấn và
TS. Lê Hoàng Sơn đã tạo điều kiện giúp đỡ em trong quá trình thực hiện đề tài.
Mặc dù đã cố gắng nhưng do gặp nhiều khó khăn và thời gian và khả năng
còn hạn chế nên không thể tránh khỏi thiếu sót. Em kính mong nhận được sự góp ý
từ các thầy cô để bài báo cáo của em được hoàn thiện và đầy đủ hơn.
Thái Nguyên, tháng 5 năm 2016
Sinh viên

Trần Thu Phượng

1


MỤC LỤC
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1
1.1. Kiến thưc cơ bản về tập mờ và phân cụm mờ
1
1.1.1. Tập mờ
1
1.1.2. Phân cụm mờ 3


1.2. Giới thiệu ngôn ngữ lập trình Java
10
1.2.1. Lịch sử phát triển 10
1.2.2. Giới thiệu ngôn ngữ lập trình Java 10
1.2.3. Khai báo biến trong Java 12
1.2.4. Mảng trong Java
16
1.2.5. Điều khiển vòng lặp trong Java
18
1.3. Thiết kế giao diện
19
CHƯƠNG 2: XÂY DỰNG BÀI TOÁN DỰ BÁO ẢNH MÂY VỆ TINH
2.1. Phương pháp dự báo kết hợp phân cụm với luật mờ
26
2.2. Quy trình suy diễn mờ 27
2.3. Mô hình và cơ chế suy diễn 29
CHƯƠNG 3: CÀI ĐẶT THUẬT TOÁN VÀ ỨNG DỤNG 32
3.1. Mô tả dữ liệu 32
3.2. Các độ đo
34
3.2.1. Mean Absolute Error (MAE)
34
3.2.2. Mean Squared Error (MSE) 34
3.2.3. Root Mean Squared Error(RMSE) 34
3.3. Mô tả Demo
34
3.4. Kết quả thực nghiệm 37
3.5. Cài đặt thuật toán và ứng dụng
37
3.5.1. Đầu vào của bài toán

38
3.5.2. Chương trình thuật toán FC-PFS 39
3.5.3. Các bước chính xây dựng chương trình dự báo ảnh mây vệ tinh:
KẾT LUẬN 63
TÀI LIỆU THAM KHẢO 64

2

26

44


DANH MỤC HÌNH ẢNH, BẢNG
Hình 1: Luật mờ tam giác 28
Hình 2: Quy trình bài toán dự báo

29

Hình 3: Bộ ảnh dữ liệu 1 32
Hình 4: Bộ ảnh dữ liệu 2 33
Hình 5: Bộ ảnh dữ liệu 3 33
Hình 6: Kết quả chạy chương trình của bộ dữ liệu 1

35

Hình 7: Kết quả chạy chương trình của bộ dữ liệu 2

35


Hình 8: Kết quả chạy chương trình của bộ dữ liệu 3

36

Bảng 1: Các kiểu dữ liệu cơ bản trong Java

13

Bảng 2: Kết quả thực nghiệm với ba bộ dữ liệu37
Bảng 3: Kết quả thực nghiệm với tham số C thay đổi 37

3


LỜI NÓI ĐẦU
Trong những năm gần đây, do sự phát triển vượt bậc của nền kinh tế, kéo
theo các hệ thống dữ liệu phục vụ cho các lĩnh vực kinh tế-xã hội phát triển bùng
nổ, lượng dữ liệu khổng lồ được tạo ra ngày càng lớn. Cũng từ đó, các yêu cầu về
thông tin, khám phá tri thức mới trong lĩnh vực này ngày càng đòi hỏi cao hơn.
Trước nhu cầu đó, hàng loạt các lĩnh vực nghiên cứu về tổ chức các kho dữ liệu và
thông tin, các hệ trợ giúp quyết định, các thuật toán nhận dạng, và đặc biệt là Data
Mining ra đời.
Khai phá dữ liệu (Data Mining) là một lĩnh vực mới nhằm tự động khai thác
các thông tin có giá trị tiềm ẩn bên trong tập dữ liệu được lưu trữ trong các cơ sở
dữ liệu và kho dữ liệu. Hiện nay, DataMining đã ứng dụng ngày càng rộng rãi
trong các lĩnh vực như thương mại, tài chính, điều trị y học, viễn thông .v.v
Một trong những hướng nghiên cứu chính của Data Mining là phân cụm dữ
liệu. Phân cụm dữ liệu là một kĩ thuật nhằm tìm kiếm, phát hiện các cụm, các mẫu
dữ liệu tự nhiên, tiềm ẩn, quan tâm trong tập dữ liệu lớn, từ đó cung cấp thông tin,
tri thức hữu ích cho việc ra quyết định. Như vậy, phân cụm dữ liệu là quá trình

phân chia một tập ban đầu thành các cụm dữ liệu sao cho các phần tử trong một
cụm tương tự nhau, các phần tử trong các cụm khác nhau không tương tự nhau.
Để tăng độ chính xác trong phân cụm, các thuật toán phân cụm dữ liệu luôn
được cải tiến, trong đó phải kể đến thuật toán phân cụm mờ. Dựa trên lí thuyết về
tập mờ, các thuật toán phân cụm mờ đã được đề xuất và được ứng dụng thành công
trong rất nhiều lĩnh vực, đặc biệt là dự báo.
Xuất phát từ nhu cầu thực tiễn của cuộc sống, dự báo thời tiết từ lâu đã luôn
là vấn đề được quan tâm, nghiên cứu. Từ xa xưa loài người đã dựa vào quan sát
các hiện tượng tự nhiên trên bầu trời để rút ra quy luật thời tiết, ví dụ như: ráng
vàng thì nắng, ráng trắng thì mưa hoặc chuồn chuồn bay thấp thì mưa, bay cao thì
nắng, bay vừa thì râm, và hình dạng của các đám mây.v.v để dự báo thời tiết. Tuy
nhiên phương pháp này có độ chính xác không cao, đặc biệt là đối với diễn biến
4


thời tiết phức tạp như ngày nay.
Với khả năng ứng dụng rộng rãi, cùng sự phát triển của khoa học kĩ thuật, lí
thuyết mờ ngày càng mở rộng và đóng góp to lớn trong lĩnh vực dự báo. Hiện nay
công tác dự báo thời tiết đã được thực hiện bằng cách thu thập số liệu về trạng thái
hiện tại của bầu khí quyển và áp dụng logic mờ, các mô hình toán học, những hiểu
biết khoa học về các quá trình của khí quyển để tiên đoán sự tiến triển của các hiện
tượng trong khí quyển, góp phần quan trọng trong việc dự báo sớm các thảm họa
thiên nhiên.
Phần chính của đồ án đề cập tới thuật toán phân cụm mờ cải tiến dựa trên tập
mờ viễn cảnh, hay còn gọi là thuật toán phân cụm mờ viễn cảnh. Từ đó đưa ra ứng
dụng của thuật toán phân cụm mờ trong bài toán dự báo thời tiết, cụ thể là phương
pháp dự báo thời tiết kết hợp giữa thuật toán phân cụm mờ và hệ luật mờ. Với
những cải tiến trong thuật toán, phương pháp mang lại kết quả dự báo khá chính
xác.
Tên đề tài: Ứng dụng phân cụm mờ trong bài toán dự báo ảnh mây vệ

tinh
Bố cục bài báo cáo gồm 3 phần:
Chương 1: Cơ sở lý thuyết
Chương 2: Xây dựng bài toán dự báo ảnh mây vệ tinh
Chương 3: Cài đặt thuật toán và ứng dụng

CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
 Kiến thưc cơ bản về tập mờ và phân cụm mờ

 Tập mờ
 Giới thiệu
Trong lý thuyết tập hợp, một phần tử được xác định rõ ràng là thuộc hoặc
không thuộc một tập hợp và được kí hiệu lần lượt là 1 và 0 tức là một phần tử bất
kỳ chỉ có hai khả năng là thuộc hoặc không thuộc tập hợp. Tuy nhiên, lý thuyết này
5


không thể giải quyết được những bài toán phức tạp này sinh trong thực tế. Ví dụ:
tập hợp những người cao là từ 1m75 trở lên được chọn vào đội bóng rổ. Vậy người
cao 1m74 sẽ không thuộc tập hợp những người cao và bị loại liệu đã hợp lý.
Do vậy, một cách tiếp cận mới đã và đang được phát triển nhằm giải quyết
những vấn đề trên. Đó là lý thuyết tập mờ (Fuzzy Set) do giáo sư Lotfi A. Zadeh
của trường đại học California – Mỹ sáng lập, bắt đầu với bài báo “Fuzzy Sets” năm
1965. Công trình này nhanh chóng được các nhà nghiên cứu đón nhận. Ý tưởng
của Zadeh về lý thuyết tập mờ là biểu diễn các thông tin trừu tượng, không chắc
chắn như chiều cao (cao – thấp), độ tuổi (trẻ – già) v.v. bằng khái niệm toán học
gọi là tập mờ. Phần tiếp theo sẽ cho thấy sự khác biệt giữa tập rõ và tập mờ.

 Khái niệm tập rõ
Định nghĩa 1.1: Cho tập nền X với x là phần tử của tập X. A là một tập rõ

trên tập X, với x là phần tử thuộc tập hợp A, ta có x A hoặc x A và (x) được gọi
là hàm thuộc hay hàm đặc trưng của tập hợp A. [2]
(1.1)

Ví dụ: X={x1, x2, x3, x4} với x1 A, x2 A, x3 A, x4 A
(x1) = 1; (x2) = 1; (x3) = 1; (x4) = 0;
Ví dụ: “Sinh viên A thuộc lớp HTTTk10A”.

 Khái niệm tập mờ
Định nghĩa 1.2: Cho tập nền X với x là phần tử của tập X. Một tập mờ F trên
tập X được định nghĩa bởi một hàm thành viên hay còn gọi là hàm thuộc F(x), đo
“mức độ” mà phần tử x thuộc về tập F thỏa mãn điều kiện với xX, 0 F(x)1.
(1.2)

Nếu F(x) = 1 thì x F hoàn toàn.
Nếu F(x) = 0 thì x F hoàn toàn.

6


Nếu hàm thuộc F(x) chỉ nhận giá trị 1 hoặc 0, tức là các phần tử trong tập hợp
F thuộc hoặc không thuộc F một cách rõ ràng thì tập mờ trở thành tập rõ. Như vậy
tập rõ chính là một trường hợp đặc biệt trong tập mờ.
Ví dụ: “Một vài sinh viên”, “Anh A khá là cao”, “Quả táo hơi bé” ..v.v

 Tập mờ trực cảm.
Tập mờ trực cảm (Intuitionistic fuzzy sets) được đề xuất bởi Krassimir
Atanassov vào năm 1983 là một sự mở rộng của tập mờ Zadeh năm 1965. Nó đặc
biệt hữu dụng khi làm việc với các đối tượng ngữ nghĩa tự nhiên, trong đó việc đưa
ra độ thuộc không thôi chưa đủ. Ví dụ khi đưa ra quyết định một vấn đề, trong y

học, bầu cử, kinh doanh.v.v, đặc biệt là khi tập hợp ý kiến nhiều chuyên gia, bên
cạnh việc ủng hộ còn có sự phản đối và một tỷ lệ do dự nhất định (bỏ phiếu trắng
hoặc phiếu không hợp lệ).
Định nghĩa 1.3: Xét X là một tập không rỗng, một tập mờ trực cảm A trên
không gian nền X cho bởi:
(1.3)
trong đó

,

thỏa mãn điều kiện:
(1.4)

với µA(x), νA(x) lần lượt là độ thuộc và độ không thuộc của x vào tập A,
πA(x) = 1

µA(x)

νA(x) là độ do dự (không rõ x thuộc hay không thuộc vào

A). Ta thấy
(1.5)
Kí hiệu IFS(X) là tập các tập mờ trực cảm trên không gian nền X. Như vậy,
theo định nghĩa trên thì tập mờ thường A′ là một trường hợp riêng của tập mờ trực
cảm:
(1.6)
với độ do dự là 0:
7



(1.7)
Tập mờ trực cảm tổng quát hơn tập mờ. Nó cho phép chúng ta có thể biểu
diễn những thông tin, trí thức không nhất quán, ứng dụng đa dạng trong những bài
toán thực tiễn. Đặc biệt trong trường hợp tổng hợp ý kiến của con người về một
vấn đề, trong đó có 3 câu trả lời cơ bản: (1) Có, tôi đồng ý; (2) Không, tôi phản
đối; (3) Tôi không biết, tôi không chắc chắn.
 Tập mờ viễn cảnh
Mở rộng từ tập mờ trực cảm (IFS), tập mờ viễn cảnh - Picture Fuzzy Sets
(PFS) được định nghĩa như sau:
Định nghĩa 1.4:
Xét X là một tập không rỗng, một tập mờ viễn cảnh A trên không gian nền X cho
bởi:
(1.8)
trong

đó
thỏa mãn điều kiện:
(1.9)

Với

lần lượt độ thuộc, độ không thuộc, độ do dự (không

rõ x có thuộc tập A hay không),
cả 3 trường hợp trên.

là phương án phủ nhận

(1.10)
Tập mờ viễn cảnh cho phép chúng ta có thể biểu diễn những thông tin, trí

thức không nhất quán, ứng dụng đa dạng trong những bài toán thực tiễn. Đặc biệt
trong trường hợp tổng hợp ý kiến của con người về một vấn đề, trong đó có 4 câu
trả lời cơ bản: (1) Có, tôi đồng ý; (2) Không, tôi phản đối; (3) Tôi không biết, tôi
không chắc chắn; (4) Không đưa ra câu trả lời (không quan tâm vấn đề). Bầu cử là
một ví dụ điển hình trong trường hợp này. Người bỏ phiếu được phân ra làm 4
dạng: (1) Ủng hộ; (2) Phản đối; (3) Bỏ phiếu trắng hoặc bỏ phiếu không hợp lệ; (4)
Không đi bỏ phiếu.
1.1.2. Phân cụm mờ
Phân cụm là quá trình nhóm các dữ liệu trong cơ sở dữ liệu thành các cụm
8


sao cho những điểm dữ liệu trong cùng một cụm có độ tương đồng lớn và những
điểm không cùng một cụm có sự tương đồng là rất nhỏ.
Phân cụm đặc biệt hiệu quả khi không biết hoặc biết thuộc tính của cụm mà
chưa biết hoặc biết rất ít về các thông tin đó.
Trong cuộc sống chúng ta đã gặp rất nhiều ứng dụng của bài toán phân cụm.
Tuy nhiên, một đối tượng có thể thuộc về nhiều cụm khác nhau, do đó ranh giới
giữa các cụm thường không rõ, do vậy nếu chỉ áp dụng phân cụm thì nhiều bài
toán sẽ không được giải quyết hiệu quả. Do đó, ta cần áp dụng phương pháp phân
cụm mờ vào việc phân cụm dữ liệu. Chẳng hạn, ta có phép phân loại sau: Những
người đi xe máy xịn thì thuộc nhóm người giàu, những người đi xe máy thường
thuộc nhóm bình dân. Vậy người nghèo mà đi xe máy xịn thì ta xếp người đó vào
nhóm nào? Vì vậy chúng ta đưa vào khái niệm bài toán phân cụm mờ.
Trong các phương pháp phân cụm cứng như K-Means phân cụm dữ liệu chỉ
thuộc về một cụm dữ liệu, phương pháp này chỉ phù hợp với việc khám phá ra các
cụm có mật độ cao và rời nhau, với đường biên giữa các cụm được xác định tốt.
Tuy nhiên, trong thực tế, đường biên giữa các cụm có thể mờ, các cụm có thể
chồng lên nhau, nghĩa là một số các đối tượng dữ liệu thuộc về nhiều các cụm khác
nhau, do đó mô hình này không mô tả được dữ liệu thực. Vì vậy người ra đã áp

dụng lý thuyết về tập mờ trong phân cụm dữ liệu để giải quyết cho trường hợp này.
Cách thức kết hợp này gọi là phân cụm mờ.
Phân cụm mờ là phương pháp phân cụm dữ liệu mà cho phép mỗi điểm dữ
liệu thuộc về hai hoặc nhiều cụm. Ruspini (1969) giới thiệu khái niệm phân hoạch
mờ để mô tả cấu trúc cụm của tập dữ liệu và đề xuất một thuật toán để tính toán tối
ưu phân hoạch mờ. Dum (1973) mở rộng phương pháp phân cụm và đã phát triển
thuật toán phân cụm mờ. Ý tưởng của thuật toán là xây dựng một phương pháp
phân cụm mờ dựa trên tối thiểu hóa hàm mục tiêu. Bezdek (1981) cải tiến và tổng
quát hóa hàm mục tiêu mờ bằng cách đưa ra trọng số mũ để xây dựng thuật toán
phân cụm mờ và được chứng minh độ hội tụ của các thuật toán là cực tiểu cục bộ.
 Xây dựng cơ sở luật:
Để xây dựng luật, ta có một số phương pháp cơ bản. Thông thường, cách đơn
giản nhất là sử dụng phương pháp phân cụm, với tâm cụm nằm giữa cụm đó, giá
trị của thuộc tính gần tâm cụm nào thì sẽ thuộc cụm đó. Phương pháp này tỏ ra
hiệu quả đối với những bộ dữ liệu có giá trị được rải đều trong giới hạn min-max
của mỗi thuộc tính. Với bộ dữ liệu không được trải đều, phương pháp phân cụm

9


FCM tỏ ra hiệu quả hơn.
1.1.2.1. Thuật toán phân cụm mờ C-means.
Thuật toán C-means mờ hay còn gọi tắt là thuật toán FCM (Fuzzy C means FCM) [2] được xây dựng dựa trên lí thuyết về tập mờ thường khi quan hệ thuộc
của một phần tử đối với một tập chỉ có hai giá trị là thuộc và không thuộc.
Thuật toán này chia một tập n vectơ đối tượng dữ liệu
thành C nhóm và
tìm tâm cụm trong mỗi nhóm sử dụng hàm mục tiêu sau:
(1.11)
trong đó :


là độ thuộc của phần tử thứ k vào cụm thứ j, m là tham số

mờ, Dữ liệu X chứa N phần tử
, số cụm
, tâm cụm
.
Khoảng cách giữa các điểm đến trọng tâm thường được tính bằng khoảng
cách Euclid

(1.12)
Dựa vào phương pháp Langrange, từ hàm mục tiêu, Bezdek đã tính được độ
thuộc và tâm của các cụm như sau:
(1.13)
;

(1.14)
;
Sơ đồ thuật toán FCM:

10


11


Mặc dù FCM là một thuật toán tốt, tuy nhiên còn phụ thuộc vào nhiều yếu tố
như việc chọn số cụm, tham số mờ hay chọn độ đo khoảng cách, khởi tạo các tâm
cụm ban đầu dẫn đến kết quả phân cụm không được như mong muốn. FCM cũng
khá nhạy cảm với nhiễu và các phần tử ngoại lai bên trong dữ liệu, nghĩa là các
trung tâm cụm có thể nằm xa so với trung tâm thực của cụm. Bên cạnh đó việc

những thông tin thu thập được không đầy đủ, rõ ràng cũng là hạn chế của FCM, vì
vậy các phương pháp cải tiến FCM trên những tập mờ nâng cao đã được đề xuất
nhằm nâng cao chất lượng phân cụm. Đó là phương pháp cải tiến FCM trên tâp mờ
trực cảm IFS và trên tập mờ viễn cảnh PFS.
1.1.2.2. Thuật toán IFCM
Thuật toán IFCM là thuật toán phân cụm dựa trên tập mờ trực cảm IFS. Ở
đây độ thuộc của một điểm vào một cụm dữ liệu được cụ thể hơn với 3 giá trị:
thuộc, không thuộc và độ do dự (không biết thuộc hay không).
Từ tập gồm N phần tử chúng ta chia chúng vào C cụm với hàm mục tiêu như
sau:
(1.15)
trong đó:
là độ thuộc của phần tử thứ k vào cụm thứ j, m là tham số mờ, dữ liệu X
chứa N phần tử

, số cụm

, tâm cụm

. Khoảng cách giữa các điểm

đến trọng tâm thường được tính bằng khoảng cách Euclid

.

(1.16)

Chú ý rằng khi

, hàm mục tiêu trở về hàm mục tiêu của FCM.

12


Mặc dù độ thuộc của một điểm vào một cụm đã được cụ thể hơn, giúp cho
việc phân cụm đa dạng, chính xác hơn. Tuy nhiên những khó khăn trong IFCM
gặp phải cũng giống như trong FCM, bên cạnh đó việc tính toán của IFCM cũng
phức tạp hơn.
Để đơn giản, việc tính độ do dự được đề xuất bởi Zeshui Xu và Wu qua
phương trình:
(1.17)

Và sau đó cập nhật lại độ thuộc như sau:
(1.18)
Từ đó các phần tính toán khác có thể tận dụng từ FCM.
1.1.2.3. Thuật toán FC-PFS.
Dựa trên tập mờ viễn cảnh PFS- mở rộng của tập mờ trực cảm IFS, phương
pháp phân cụm mới FC-PFS (Fuzzy Cluster – Picture Fuzzy Sets) đã được đề xuất.
Tập dữ liệu X gồm N điểm dữ liệu. Chia bộ dữ liệu thành C nhóm thỏa mãn hàm
mục tiêu dưới đây:

(1.19)

Với dữ liệu X chứa N phần tử

, số cụm

, tâm cụm

. Khoảng


cách giữa các điểm đến trọng tâm thường được tính bằng khoảng cách Euclid

, độ thuộc

, độ không thuộc

, độ phủ định

, m là tham số mờ

thỏa mãn một số điều kiện:
(1.20)

13

(1.21)


(1.22)

(1.23)

Một điểm dữ liệu gồm 4 lựa chọn: thuộc, không thuộc, do dự, không thuộc
cụm nào, FC-PFS có được nhiều thông tin hơn so với FCM và IFCM, vì thế việc
phân cụm có thể hiệu quả và chính xác hơn. Tuy nhiên tính toán phức tạp hơn.
Với mục tiêu (1.19) và các điều kiện (1.20-1.23) sử dụng phương pháp
Langrange, ta thu được trọng tâm theo công thức (1.24):

(1.24)


Tính được độ thuộc theo công thức (1.25):

(1.25)

Tính được độ không thuộc theo công thức (1.26):
(1.26)

14


Tính độ phủ nhận theo công thức (1.27):
(1.27)

Sơ đồ thuật toán FC-PFS:
Đầu vào:
 Dữ liệu X chứa N phần tử
 Số cụm : C
 Tham số m
 Ngưỡng

 Số lần lặp lớn nhất maxStep > 0
Output: Ma trận µ, , và các tâm cụm V.

15


Output của thuật toán bao gồm: Ma trận µ, , và các tâm cụm V.
Như vậy, trong chương này, chúng ta đã được biết đến tổng quan về cơ sở
toán học của tập mờ, các tập mờ nâng cao, và các thuật toán phân cụm mờ dựa trên
lí thuyết về các tập mờ tương ứng.

1.2. Giới thiệu ngôn ngữ lập trình Java
1.2.1. Lịch sử phát triển

16


Lịch sử phát triển: Java là một ngôn ngữ lập trình được Sun Microsystems
giới thiệu vào tháng 6 năm 1995. Từ đó, nó đã trờ thành một công cụ lập trình của
các lập trình viên chuyên nghiệp. Java được xây dựng trên nền tảng của C và C++.
Do vậy nó sử dụng các cú pháp của C và các đặc trưng hướng đối tượng của C++.
Năm 1991, một nhóm các ký sư của Sun Microsystems có ý định thiết kế một ngôn
ngữ lập trình để điều khiển các thiết bị điện tử như Tivi, máy giặt, lò nướng…Mặc
dù C và C++ có khả năng làm việc này nhưng trình biên dịch lại phụ thuộc vào
từng loại CPU. Do nhu cầu đòi hỏi của ngôn ngữ chạy nhanh, gọn , hiệu quả và
độc lập với thiết bị tức là có thể chạy trên nhiều loại CPU khác nhau, dưới môi
trường khác nhau. Khi đó “Oak” được ra đời, năm 1995 “Oak” được đổi tên thành
Java.
1.2.2. Giới thiệu ngôn ngữ lập trình Java
Java là một ngôn ngữ lập trình dạng lập trình hướng đối tượng (OOP). Thập
niên 90 chứng kiến sự phát triển như vũ bão của mạng internet, kèm theo đó là vô
vàn các ứng dụng trên các môi trường, hệ điều hành (OS – Operating System) và
các hệ xử lý CPU( Central Processing Unit) khác nhau. Java có thể giải quyết hầu
hết các công việc mà các ngôn ngữ khác có thể làm được. Java là ngôn ngữ vừa
thông dịch vừa biên dịch, đầu tiên mã nguồn được biên dịch bằng công cụ JAVAC
để chuyển thành dạng ByteCode. Sau đó được thự thi trên từng loại máy cụ thể
nhờ chương trình thông dịch. Mục tiêu của các nhà thiết kế Java là cho phép người
lập trình viết chương trình một lần nhưng có thể chạy trên bất cứ phần cứng cụ thể.
Ngày nay, Java được sử dụng rộng rãi để viết chương trình chạy trên Internet.
Nó là ngôn ngữ lập trình hướng đối tượng độc lập thiết bị, không phụ thuộc vào hệ
điều hành. Nó không chỉ dùng để viết các ứng dụng chạy đơ lẻ hay trong mạng mà

còn để xây dựng các trình điều khiển thiết vị cho điện thoại di động, PDA,…
Các đặc trưng của Java:
 Hướng đối tượng
 Độc lập phần cứng và hệ điều hành
17


 Mạnh mẽ
 Bảo mật
 Phân tán
 Đa luồng
1.2.2.1. Hướng đối tượng
Java được thiêt kế xoay quanh mô hình hướng đối tượng. Vì vậy trong Java,
tiêu điểm là dữ liệu và các phương pháp thao tác trên dữ liệu đó. Dữ liệu các
phương pháp mô tả trạng thái và cách ứng xử của một đối tượng trong Java.
1.2.2.2. Độc lập phần cứng và hệ điều hành
Đây là khả năng một chương trình được viết tại một máy nhưng có thể chạy
được bất kì đâu. Chúng được thể hiện ở mức mã nguồn và mức nhị phân. Tính độc
lập ở mức nhị phân, một chương trình đã biên dịch có thể chạy trên nhiều nền
(phần cứng, hệ điều hành) khác mà không cần dịch lại mã nguồn. Tuy vậy cần có
phần mềm máy ảo Java (JVM) hoạt động như một trình thông dịch tại máy thực
thi.
Ở mức mã nguồn, người lập trình cần mô tả kiểu cho mỗi biến. Kiểu dữ liệu
trong Java nhất quán cho tất cả các hệ điều hành và phần cứng khác nhau. Java có
riêng một thư viện các lớp cơ sở. Vì vậy, chương trình Java được viết trên một số
máy có thể dịch và chạy trơn tru trên các loại máy khác nhau mà không cần viết
lại. Ở mức nhị phân, một chương trình đã biên dịch có thể chạy trên nền khác mà
không cần dịch lại mã nguồn. Tuy vậy , cần có phần mềm máy ảo Java như một
trình thông dịch tại máy thực thi.
1.2.2.3. Mạnh mẽ

Java yêu cầu chặt chẽ về kiểu dữ liệu và phải có mô tả rõ ràng khi viết
chương trình. Chúng sẽ kiểm tra lúc biên dịch và cả trong thời gian thông dịch vì
vậy Java loại bỏ các kiểu dữ liệu dễ gây ra lỗi. Java không sử dụng con trỏ và các
phép toán con trỏ. Java kiểm tra tất cả các truy nhập đến mảng, chuỗi khi thực thi
để đảm bảo rằng các truy nhập đó không ra ngoài giới hạn kích thước. Java kiểm
18


tra sự chuyển đổi kiểu dữ liệu từ dạng này sang dạng khác lúc thực thi.+
Cơ chế bẫy lỗi của Java giúp đơn giản hóa quá trình xử lý lỗi và hồi phục sau lỗi.
1.2.2.4. Bảo mật
Viruses là nguyên nhân gây ra sự lo lắng trong việc sử dụng máy tính. Trước
khi có Java, các lập trình viên phải quét virus các tệp trước khi tải về hay thực hiện
chúng. Thông thường việc này cũng không loại trừ hoàn toàn virus. Ngoài ra
chương trình khi thực thi có khả năng tìm kiếm và đọc các thông tin nhạy cảm trên
máy của người sử dụng mà người sử dụng không hề hay biết.
Java cung cấp một môi trường quản lý thực thi chương trình. Nó cho rằng không
có một đoạn mã nào là an toàn cả. Và vì vậy Java không chỉ là ngôn ngữ lập trình
thuần tuý mà còn cung cấp nhiều mức để kiểm soát tính an toàn khi thực thi chương
trình.
Java cung cấp một số lớp để kiểm tra bảo mật.
Ở lớp đầu tiên, dữ liệu và các phương pháp được đóng gói bên trong lớp.
Chúng chỉ được truy xuất thông qua các giao diện mà lớp cung cấp. Java không hỗ
trợ con trỏ vì vậy không cho phép truy xuất bộ nhớ trực tiếp. Nó cũng ngăn chặc
không cho truy xuất thông tin bên ngoài của mảng bằng kỹ thuật tràn và cũng cung
cấp kỹ thuật dọn rác trong bộ nhớ. Các đặc trưng này tạo cho Java an toàn và có
khả năng cơ động cao.
Trong lớp thứ hai, trình biên dịch kiểm soát để đảm bảo mã an toàn.
Lớp thứ ba được đảm bảo bởi trình thông dịch. Chúng kiểm tra xem bytecode
có đảm bảo các quy tắc an toàn trước khi thực thi.

Lớp thứ tư kiểm soát việc nạp các lớp trên bộ nhớ để giám sát việc vi phạm
giới hạn truy xuất trước khi nạp vào hệ thống.
1.2.2.5. Phân tán
Java có thể dùng để xây dựng các ứng dụng có thể làm việc trên nhiều phần
cứng, hệ điều hành và giao diện đồ họa. Java được thiết kế cho các ứng dụng chạy
trên mạng. Vì vậy, chúng được sử dụng rỗng tãi trên Internet, nơi sử dụng nhiều
19


nền tảng khác nhau.
1.2.2.6. Đa luồng
Chương trình Java sử dụng kỹ thuật đa tiến trình (Multithread) để thực thi các
công việc đồng thời. Chúng cũng cung cấp giải pháp động bộ giữa các tiến trình.
Đặc tính hỗ trợ đa tiến trình này cho phép xây dựng các ứng dụng trên mạng chạy
uyển chuyển.
1.2.3. Khai báo biến trong Java
1.2.3.1. Khai báo biến
dataType varName;
VD: int x,y;
Khai báo mảng: int[] a; hoặc int a[];
Quy tắc:
• Chỉ được bắt đầu bằng một kí tự (chữ), hoặc một dấu gạch dưới , hoặc một
kí tự dollar
• Không có khoảng trắng giữa tên
• Bắt đầu từ kí tự thứ hai, có thể dùng các kí tự (chữ), chữ số, dấu dollar, dấu
gạch dưới
• Không trùng với các từ khoá
• Có phân biệt chữ hoa chữ thường
1.2.3.2. Kiểu dữ liệu
Trong Java, kiểu dữ liệu được chia thành hai loại:

• Các kiểu dữ liệu cơ bản
• Các kiểu dữ liệu đối tượng

20


Bảng 1: Các kiểu dữ liệu cơ bản trong Java
Java cung cấp các kiểu dữ liệu cơ bản như sau:
byte: Dùng để lưu dữ liệu kiểu số nguyên có kích thước một byte (8 bít).
Phạm vi biểu diễn giá trị từ -128 đến 127. Giá trị mặc định là 0.
char: Dùng để lưu dữ liệu kiểu kí tự hoặc số nguyên không âm có kích thước
2 byte (16 bít).
Phạm vi biểu diễn giá trị từ 0 đến u\ffff. Giá trị mặc định là 0.
boolean: Dùng để lưu dữ liệu chỉ có hai trạng thái đúng hoặc sai (độ lớn chỉ
có 1 bít). Phạm vi biểu diễn giá trị là {“True”, “False”}. Giá trị mặc định là False.
short: Dùng để lưu dữ liệu có kiểu số nguyên, kích cỡ 2 byte (16 bít). Phạm
vi biểu diễn giá trị từ – 32768 đến 32767. Giá trị mặc định là 0.
21


int: Dùng để lưu dữ liệu có kiểu số nguyên, kích cỡ 4 byte (32 bít). Phạm vi
biểu diễn giá trị từ -2,147,483,648 đến 2,147,483,647. Giá trị mặc định là 0.
float: Dùng để lưu dữ liệu có kiểu số thực, kích cỡ 4 byte (32 bít). Giá trị mặc
định là 0.0f.
double: Dùng để lưu dữ liệu có kiểu số thực có kích thước lên đến 8 byte.
Giá trị mặc định là 0.00d
long: Dùng để lưu dữ liệu có kiểu số nguyên có kích thước lên đến 8 byte.
Giá trị mặc định là 0l.
Kiểu dữ liệu đối tượng
Trong Java, có 3 kiểu dữ liệu đối tượng:

Array: Một mảng của các dữ liệu cùng kiểu
class: Dữ liệu kiểu lớp đối tượng do người dùng định nghĩa. Chứa tập các
thuộc tính và phương thức.
interface: Dữ liệu kiểu lớp giao tiếp do người dùng định nghĩa. Chứa các
phương thức của giao tiếp.
Ép kiểu (Type casting)
Ví dụ, nhiều khi gặp tình huống cần cộng một biến có dạng integer với một
biến có dạng float.
Để xử lý tình huống này, Java sử dụng tính năng ép kiểu (type casting) của
C/C++. Đoạn mã sau đây thực hiện phép cộng một giá trị dấu phẩy động (float) với
một giá trị nguyên (integer).
float c = 35.8f;
int b = (int)c + 1;
Đầu tiên giá trị dấu phẩy động c được đổi thành giá trị nguyên 35. Sau đó nó
được cộng với 1 và kết quả là giá trị 36 được lưu vào b.
Trong Java có hai loại ép kiểu dữ liệu:
• Nới rộng (widening): quá trình làm tròn số từ kiểu dữ liệu có kích thước
nhỏ hơn sang kiểu có kích thước lớn hơn. Kiểu biến đổi này không làm mất thông
22


tin. Ví dụ chuyển từ int sang float. Chuyển kiểu loại này có thế được thực hiện
ngầm định bởi trình biên dịch.
• Thu hẹp (narrowwing): quá trình làm tròn số từ kiểu dữ liệu có kích thước
lớn hơn sang kiểu có kích thước nhỏ hơn. Kiểu biến đổi này có thể làm mất thông
tin như ví dụ ở trên.
Chuyển kiểu loại này không thể thực hiện ngầm định bởi trình biên dịch,
người dùng phải thực hiện chuyển kiểu tường minh.
1.2.3.3. Các toán tử
Java cung cấp các dạng toán tử sau:

• Toán tử số học
• Toán tử bit
• Toán tử quan hệ
• Toán tử logic
• Toán tử điều kiện
• Toán tử gán
 Toán tử số học
Các toán hạng của các toán tử số học phải ở dạng số. Các toán hạng kiểu
boolean không sử dụng được, song các toán hạng ký tự cho phép sử dụng loại toán
tử này.
*, + , – , /
Các toán tử cần chú ý:
% : Lấy modul hay phép lấy dư
++: tăng thêm 1: a++ a = a + 1
t = a++; t = a; và a = a + 1;
t = ++a; a = a ++; và t = a;
–: tương tự như ++; giảm đi 1;
Phép gán giá trị: +=, *=, -=; /=; %=; tính phép toán trước rồi thực hiện phép gán;
VD: a +=2; a = a + 2;
23


 Toán tử Bit:
~ : Phép phủ định: NOT trả về giá trị phủ định của 1 Bít & : Phép and; trả về 1 nếu
các toán hạng là 1 và 0 trong các trường hợp khác
| : Phép hoặc,; trả về 1 nếu 1 trong các toán hạng là 1; và 0 trong các trường hợp
khác
^ : Toán tử Exclusive OR bit; trả vè 1 nếu chỉ 1 toán hạng là 1; và 0 trong các
trường hợp khác (khác dấu )
>>: Dịch sang phải bit , chuyển toàn bộ các bít của một số sang phải một vị trí, giữ

nguyên dấu của số âm, toán hạng bên trái là số bít bọ dịch còn bên phải là chỉ số vị
trí mà các bít cần dịch;
VD: 2>>1 = 1 ;
<<: Dịch sang trái bít, Chuyển toàn bộ các bít cuả một số sang trái một vị trí, giữ
nguyên dấu cuả số âm.
Toán hạng bên trái là số bị dịch còn số bên phải chỉ số vị trí mà các bít cần dịch.
VD: 1< ; = ; <= ;
 Toán tử logic: Như trong C/C++
&&, ||, ^, !
^: XOR: trả về true nếu và chỉ nếu 1 trong các giá trị là true còn lai là false
- Toán tử điều kiện
?:;
clause 1: Biểu thức logic
clause 2: trả về nếu clause 1 trả về true
clause 3: trả về nếu clause 1 trả về false
VD: (1 > 2) ? (System.out.print(” 1 Lớn hơn 2″)):(System.out.print(“1 nhỏ
hơn 2”));
Kết quả: 1 nhỏ hơn 2
1.2.4. Mảng trong Java
Thường thì mảng là một tập hợp các phần tử có kiểu tương tự nhau mà có vị
24


trí ô nhớ liền kề. Mảng trong Java là một đối tượng chứa các phần tử có kiểu dữ
liệu giống nhau. Nó là một cấu trúc dữ liệu, tại đó chúng ta có thể lưu trữ các phần
tử tương tự nhau. Chúng ta chỉ có thể lưu trữ một tập hợp cố cố định các phần tử
trong một mảng trong Java.
Mảng trong Java là dựa trên chỉ mục (index), phần tử đầu tiên của mảng
được lưu trữ tại chỉ mục 0.


 Khai báo biến mảng trong Java
Để sử dụng một mảng trong một chương trình, bạn phải khai báo một biến
để tham chiếu mảng, và bạn phải xác định kiểu mảng mà biến có thể tham chiếu.
Dưới đây là cú pháp để khai báo một biến mảng:
 Mảng 1 chiều: Có 2 cách khai báo như sau:
Cách 1 : Kieu_du_lieu[] Bien_tham_chieu_mang
Cách 2 : Kieu_du_lieu Bien_tham_chieu_mang[]
Cách 1 thông dụng hơn. Còn cách 2 xuất phát từ ngôn ngữ lập trình C/C++
và được chấp nhận trong Java.
 Mảng nhiều chiều :
Kieu_du_lieu[][][] Bien_tham_chieu_mang

 Tạo mảng trong Java
Bạn có thể tạo một mảng bởi sử dụng toán tử new với cú pháp sau:
Bien_tham_chieu_mang = new Kieu_du_lieu[Kich_co_mang] ;

25


×