Áp dụng mô hình hệ chuyên gia xây dựng chương trình đoán nhận tính cách người qua đặc tả khuôn mặt

Áp dụng mô hình hệ chuyên gia xây dựng chương trình đoán nhận tính cách người qua đặc tả khuôn mặtMỤC LỤC Chương I:TỔNG QUAN2 I.1Lời nói đầu.2 I.2Nhân tướng học.3 I.2.1Giới thiệu. 3 I.2.3Biết được gì qua vầng trán. 4 I.2.4Cá tính thể hiện qua cặp mắt5 I.2.5Mũi cho ta biết điều gì ?. 6 I.2.6Hình dáng của miệng biểu đạt gì ?. 7 I.2.7Đôi tai mách bảo điều gì ?. 8 I.2.8Một số khuôn mặt thường thấy. 8 I.3Phương hướng giải quyết.10 Chương II : HỆ CHUYÊN GIA11 II.1Tổng quan. 11 II.1.1Hệ chuyên gia là gì ?. 11 II.1.2Đặc trưng và ưu điểm của hệ chuyên gia. 12 II.1.3Các lĩnh vực ứng dụng của hệ chuyên gia. 13 II.1.4Cấu trúc của hệ chuyên gia. 15 II.1.5Một số mô hình kiến trúc hệ chuyên gia. 17 II.2Cơ sở tri thức. 19 II.2.1Phân biệt tri thức và dữ liệu. 19 II.2.2Phân loại tri thức. 20 II.2.3Các cấp độ tri thức. 22 II.2.4Các phương pháp biểu diễn tri thức. 23 II.3Mô tơ suy diễn. 31 II.3.1Cơ chế suy diễn. 31 II.3.2Cơ chế điều khiển. 33 Chương III :ÁP DỤNG MÔ HÌNH HỆ CHUYÊN GIA XÂY DỰNG CHƯƠNG TRÌNH ĐOÁN NHẬN TÍNH CÁCH NGƯỜI QUA ĐẶC TẢ KHUÔN MẶT38 III.1Vecto suy diễn tiến. 38 III.2Cơ sở tri thức. 40 Chương IV :CHƯƠNG TRÌNH CHÍNH47 IV.1 Môi trường. 47 IV.2 Giao diện chương trình. 47 IV.3 Mã nguồn một số form chính. 50 IV.4 Đánh giá chương trình. 72 Chương I: TỔNG QUAN I.1 Lời nói đầu. Có thể nói khuôn mặt chính là nơi “anh hoa phát tiết ra ngoài” của mỗi người. Nó không chỉ biểu hiện trạng thái tâm lý, mà còn thể hiện cá tính, sức khỏe, địa vị xã hội của người đó. Một khuôn mặt đầy đặn, tươi tắn, rạng rỡ có tạo cho bạn một cảm giác thoải mái, dễ chịu hoặc cảm nhận về một tinh thần khỏe mạnh hay không ? Ngược lại, một khuôn mặt gày gò, xanh xao, buồn bã liệu có làm cho bạn phải suy tư, trăn trở ? Hay nói đúng hơn, khuôn mặt không chỉ thể hiện tư chất, tâm trạng của người đó, mà còn để lại ấn tượng tốt hoặc xấu cho người đối diện. Và “Nhân tướng học” chính là “chìa khóa giải mã những bí ẩn” mà bạn nên khám phá, để thấy được sự hấp dẫn thú và vịtrên khuôn mặt bạn và của những người mà bạn quen biết, giao tiếp. Những tìm tòi, hiểu biết, những kinh nghiệm, kiến giải về Nhân tướng học được tích lũy từ ngàn xưa, đương nhiên trở thành một kho tàng vô cùng phong phú, không chỉ dành cho riêng ai mà là di sản tinh thần cho tất cả chúng ta. Chính vì lẽ đó mà em dự định xây dựng một “Hệ chuyên gia” cho phép đoán tính cách của người qua đặc tả khuôn mặt. Trái ngược với sự lâu đời của “Nhân tướng học”, “Hệ chuyên gia” mới được con người nghiên cứu, phát triển và ứng dụng trong một khoảng thời gian ngắn gần đây. Hệ chuyên gia là 1 trong những lĩnh vực nghiên cứu độc lập của trí tuệ nhân tạo. Đây là một lĩnh vực quan tâm tới việc phát triển các chương trình xử lý tri thức được mô tả bằng ký hiệu để mô phỏng cách làm việc của chuyên gia con người. I.2 Nhân tướng học. I.2.1 Giới thiệu Từ khi đất nước mở cửa,Văn hóa thế giới giao lưu,hội nhập rộng rãi với Việt Nam. Đặc biệt hơn cả là nền văn hóa cổ Trung Hoa-vốn đã gần gũi từ lâu-một lần nữa lại được nghiên cứu,tìm hiểu đầy đủ,trong đó Nhân tướng học là một bộ phận đã càng thâm nhập và đi sâu vào cuộc sống,xã hội,con người Việt Nam. Với mỗi người,khuôn mặt trước hết là sự biểu hiện cá tính và tâm trạng. Đó là những cảm xúc thông thường như buồn, vui, lo lắng, giận hờn Nhưng đồng thời nó cũng thể hiện sức khỏe, nhân cách, địa vị xã hội của người đó. Nhìn mặt đoán tính cách vốn là một kinh nghiệm có từ lâu đời,đến nay nó vẫn được sử dụng như một “môn nghệ thuật” với những kỹ năng và mức độ khác nhau. Ở phương Đông,”môn nghệ thuật” này được gọi với cái tên quen thuộc là “Nhân tướng học”. Và cho đến nay, nó là một chuyên ngành khoa học được mọi người công nhận. Nhân tướng học Á-đông không chỉ dừng chân ở việc đoán tính cách. Khoa này còn đào sâu cả địa hạt phú quý,bệnh tật,thọ yểu,sinh kế,nghề nghiệp. Mặt khác Nhân tướng học còn tìm hiểu-qua nét tướng mỗi cá nhân-những chi tiết liên quan đến những người khác có liên hệ mật thiết với mình : cha mẹ, vợ chồng, anh em, con cái, bạn bè. Sau cùng, Nhân tướng học Á-đông còn rộng rãi và táo bạo hơn hẳn khoa tâm lý phương Tây. Từ nội tâm và liên hệ của con người, Nhân tướng học Á-đông tiên đoán luôn vận mạng, dám khẳng định cả sự thành bại, thịnh suy, xét cả quá khứ lẫn tương lai, chứ không dừng lại ở một giai đoạn nào. Tóm lại, Nhân tướng học là một bộ môn nhân văn, từ người mà ra, do con người mà có và nhằm phục vụ cho con người trong việc “tri kỷ, tri bỉ”. Tuy nhiên ở khuôn khổ đề tài này, chúng ta chỉ tìm hiểu đến một phần của khoa Nhân tướng học : Tìm hiểu cá tính biểu hiện trên khuôn mặt. Qua đó ta có thể nắm chắc một trong những yếu tố quan trọng để phát triển và duy trì mối quan hệ hài hòa, hiệu quả giữa con người với nhau. I.2.2 Những điều cơ bản về cá tính thể hiện trên khuôn mặt Thuật tìm hiểu tính cách qua khuôn mặt về cơ bản dựa trên kích thước, hình dạng, vị trí, tính chất, và màu sắc của một số cơ quan thể hiện trên khuôn mặt. Một trong những dấu hiệu quan trọng nhất trong thuật tìm hiểu cá tính biểu hiện trên khuôn mặt là khuôn mặt có cân đối hay không. Khuôn mặt của một người càng mất cân đối, thì người ấy càng có nhiều khả năng bị rối loạn tâm lý, trong cuộc sống gặp nhiều khó khăn, khổ sở và nhiều thất vọng. Cũng như bộ não được chia thành hai phần với các chức năng khác nhau, các bên của khuôn mặt cũng phản ánh nhiều đặc điểm khác nhau. Ở hầu hết mọi người, bên trái của khuôn mặt biểu thị cá tính và tính khí, trong khi bên phải mô tả cảm xúc, địa vị xã hội và kinh tế, các mối quan hệ giữa cá nhân với người khác. Có 3 loại khuôn mặt cơ bản, với mỗi loại tương ứng với một loại cá tính và vận may cụ thể : tam giác, tròn, vuông. Khuôn mặt được chia thành 3 vùng theo phương nằm ngang : trán; vùng từ chân mày đến cuối mũi; và từ cuối mũi đến cằm. Ta quan sát các đặc tả khuôn mặt chủ yếu dựa trên các bộ phận chính như : trán, mắt, mũi, miệng, tai, cằm. Ngoài ra cũng có thể dựa trên một số chi tiết khác như : nếp nhăn, chân mày, gò má (lưỡng quyền), nốt ruồi, răng I.2.3 Biết được gì qua vầng trán a)Trán cao, rộng: · Trán cao, rộng là dấu hiệu của trí năng, nghị lực. · Cá nhân có loại trán này dành nhiều thời gian để quan sát và suy ngẫm. · Trán cao rộng là đặc điểm thường gặp ở những người thành công. b)Trán thấp, rộng : · Loại trán này là dấu hiệu của khả năng quan sát tinh tế, tính kiên nhẫn và kiên trì. · Ngoài ra, người có trán thấp rộng thường quá e dè, ngượng ngập, đến mức không thể nhận biết toàn bộ khả năng tiềm ẩn của bản thân. c)Trán cao, hẹp : · Người có trán như thế này thường thờ ơ,dửng dưng,không biết thương xót người khác mặc dù họ rất thông minh. · Nhiều nhà khoa học có loại trán này. d)Trán thấp, hẹp : · Đây là dấu hiệu biểu thị thái độ vô trách nhiệm, cẩu thả, không thành thật, trong nhiều trường hợp còn có hành động tội ác.

doc74 trang | Chia sẻ: banmai | Lượt xem: 2167 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Áp dụng mô hình hệ chuyên gia xây dựng chương trình đoán nhận tính cách người qua đặc tả khuôn mặt, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ơi đẹp”. Đây là một khẳng định bất biến, không phụ thuộc vào tình huống, không gian và thời gian. Các tri thức phụ thuộc không gian và thời gian đòi hỏi những mô hình biểu diễn đặc biệt, cho phép thể hiện các tương quan giữa các sự kiện, quá trình không gian và thời gian. Ngoài ra các tri thức mô tả còn cho phép miêu tả các mối liên hệ, các ràng buộc giữa các đối tượng, các sự kiện và các quá trình. Ví dụ : “Tôi muốn mua bút” miêu tả mối quan hệ giữa đối tượng “tôi” và “bút” thông qua quan hệ “muốn mua”. b)Tri thức thủ tục : Cho ta những phương pháp cấu trúc tri thức, ghép nối và suy diễn các tri thức mới từ những tri thức đã có. Các tri thức loại này tạo nên cơ sở của kỹ nghệ xử lý tri thức Một số thủ tục tri thức cơ bản : Tổng hợp tri thức : Suy diễn, Quy diễn, Quy nạp. Học tự động : 2 cách suy diễn logic thường được sử dụng trong các hệ thống là Modus Ponens Nghĩa là nếu A đúng, A suy ra B thì B cũng đúng Modus Tollens Nghĩa là nếu B sai, A suy ra B thì A cũng sai c)Tri thức điều khiển : Dùng để điều khiển, phối hợp các nguồn tri thức thủ tục và tri thức mô tả khác nhau. II.2.3 Các cấp độ tri thức a)Tri thức động phụ thuộc vào tình huống không gian và thời gian : Các tri thức mô tả, tri thức thủ tục, tri thức điều khiển không phụ thuộc vào yếu tố không gian, thời gian được gọi là tri thức tĩnh. Các tri thức loại này tạo nên phần lõi trong các cơ cấu trí thức. Nguồn các cơ cấu trí thức này thường phát sinh từ các tài liệu chuyên môn các nguyên lý chung của khoa học. Ví dụ : “Nếu một đường thẳng vuông góc với một trong hai đường thẳng song song thì nó vuông góc với đường thẳng còn lại”. Tuy vậy, có những tri thức lại phụ thuộc vào yếu tố lịch sử,thông qua các tham số thời gian và không gian có thể xuất hiện tường minh hoặc không tường minh trong các phát biểu. Chẳng hạn, phát biểu : “Việt Nam không phải là thành viên của tổ chức WTO” chỉ đúng ở thời điểm trước năm 2008, còn hiện nay Việt Nam đã gia nhập tổ chức WTO. Chính yếu tố đó, mà quá trình suy diễn trong các cơ sở tri thức được phụ thuộc không gian, thời gian có thể giao hoán hay không giao hoán bộ phận, đơn điệu hay không đơn điệu. b)Tri thức bất định, tri thức không đầy đủ : Trong nhiều trường hợp các tri thức có thể đúng hoặc sai. Tuy vậy trong thực tế ta gặp phải các phát biểu không phải lúc nào cũng xác định được chúng đúng hay sai. Ví dụ : “Trời có thể mưa”, trong trường hợp này không thể quyết định 100% là trời mưa hay không mưa ; Các tri thức không chính xác là các mệnh đề phát biểu mà giá trị chân lý của chúng không thể chỉ ra một cách chính xác, tương ứng với thang đo quy ước. Ví dụ : “Anh ta cao khoảng 1m70”. Cũng có thể xuất hiện các tri thức không đầy đủ trong các phát biểu, các mô tả. Ví dụ : “Thông thường nếu anh ta đi thì nói chung chị ấy cũng đi” , đây là phát biểu bất định, song chỉ có tác dụng nếu biết được một chút về sự kiện “anh ta có đến hay không”. Nói chung, các tri thức bất định, không chính xác và không đầy đủ xuất hiện là do trong các phát biểu, người ta sử dụng các yếu tố ngôn ngữ không rõ ràng, như : có thể, có lẽ, khoảng, nói chung…Một trong những cách tiếp cận để xử lý các loại tri thức trên là sử dụng cách tiếp cận lý thuyết mờ. Các lý thuyết lập luận xấp xỉ đã và đang được quan tâm, nghiên cứu rất nhiều. II.2.4 Các phương pháp biểu diễn tri thức a)Biểu diễn tri thức nhờ logic Dựa vào các khái niệm cơ bản về logic mệnh đề và logic vị từ, với một số bài toán, các trạng thái được mô tả qua các biểu thức logic. Khi đó bài toán được phát biểu lại dưới dạng : A.Chứng minh : Từ GTGT…GT suy ra một trong các kết luận : KL,…,KL. Ở đây :GT,KL là các biểu thức logic (mệnh đề hoặc vị từ) B.Tìm phép gán cho các biến tự do sao cho từ GT,…,GT suy ra một trong các kết luận KL,…,KL. Cơ sở tri thức bằng logic mệnh đề : Cơ sở tri thức gồm 2 phần : Các sự kiện. Các luật. Các sự kiện được cho bởi các luật đặc biệt dạng : q; q; … q; Tập F = (p,…,p) tạo nên giả thiết cho quá trình suy diễn. Các luật ở dạng chuẩn Horn : ppq Cơ sở tri thức biểu diễn bằng logic vị từ : Cơ sở tri thức được cấu tạo bởi 2 phần : Tập các sự kiện F. Tập các luật R. Các sự kiện được cho bởi q (x,y,z,…), I = ,ở đây q (x,y,z,…) là các vị từ phụ thuộc vào các hạng thức x, y, z,… Các luật có dạng ppq(.). Logic vị từ cho phép biểu diễn hầu hết các khái niệm và các phát biểu định lý, định luật trong các bộ môn khoa học. Cách biểu diễn này khá trực quan và ưu điểm căn bản của nó là có một cơ sở lý thuyết vững chắc cho những thủ tục suy diễn nhằm tìm kiếm và sản sinh ra những tri thức mới, dựa trên các sự kiện và các luật đã cho. (*) Logic vị từ và logic mệnh đề có các ưu điểm sau : Là ngôn ngữ biểu diễn kiểu mô tả. Có khả năng suy diễn đối với các cơ chế quen thuộc : Pronens & Tollens. Khá trực quan với người sử dụng. Khá gần gũi về cú pháp với các lệnh lập trình logic, chẳng hạn như PROLOG. Có thể dùng để mô tả cấu trúc mô hình và xử lý động mô hình. Có thể kiểm tra tính mâu thuẫn trong cơ sở tri thức. Tính mô đun cao, do vậy các tri thức có thể thêm bớt sửa đổi khá độc lập với nhau và các cơ chế suy diễn. (*)Một số điểm yếu của logic : Mức độ hình thức hóa cao, dẫn tới khó hiểu ngữ nghĩa của các vị từ khi xét chương trình. Năng xuất xử lý thấp. Một trong những khó khăn cơ bản của quá trình suy diễn là cơ chế hợp và suy diễn vét cạn. Do các tri thức được biểu diễn nhờ các vị từ, nên ưu thể sử dụng cấu trúc dữ liệu không được khai thác triệt để. b)Biểu diễn tri thức nhờ mạng ngữ nghĩa : Trong phương pháp này, người ta sử dụng một đồ thị gồm các nút và các cung nối các nút để biểu diễn tri thức. Nút dùng để thể hiện các đối tượng, thuộc tính của đối tượng và giá trị của thuộc tính. Còn cung dùng để thể hiện các quan hệ giữa các đối tượng. Các nút và các cung đều được gắn nhãn. Ví dụ để thể hiện tri thức “sẻ là một loài chim có cánh và biết bay” ,người ta vẽ một đồ thị như sau : Bằng cách thêm vào đồ thị nút mới và các cung mới người ta có thể mở rộng một mạng ngữ nghĩa. Các cung mới được thêm thể hiện các đối tượng tương tự (với các nút đã có trong đồ thị), hoặc tổng quát hơn. Chẳng hạn để thể hiện “chim là một loài động vật đẻ trứng” và “cánh cụt là loài chim biết lặn”, người ta vẽ thêm như sau : (*)Ưu điểm : Cho phép biểu diễn một cách trực quan các sự kiện và mối quan hệ giữa chúng. Tính mô đun cao, theo nghĩa các tri thức thêm vào hoàn toàn độc lập với các tri thức cũ. Là ngôn ngữ biểu diễn dạng mô tả. Có thể áp dụng một số cơ chế trên mạng : Cơ chế truyền và thừa hưởng thông tin giữa các đối tượng. (*)Nhược điểm : Không có một phương pháp suy diễn chung cho mọi loại mạng ngữ nghĩa. Khó kiểm soát được quá trình cập nhật tri thức, dễ dẫn đến mâu thuẫn trong cơ sở tri thức. c)Biểu diễn tri thức nhờ các luật sản xuất Để có thể tận dụng những điểm mạnh trong suy diễn logic nhờ nguyên lý Modun Ponens, các hệ chuyên gia trí tuệ nhân tạo đưa ra các luật sản xuất có dạng : Nếu Điều kiện 1 Điều kiện 2 ……. Điều kiện m Thì Kết luận 1 ……. Kết luận n Trong đó các điều kiện và các kết luận có thể có dạng khá thoải mái. Trường hợp mỗi điều kiện i , mỗi kết luận j là vị từ hay mệnh đề thì ta có thể suy diễn logic thông thường. (*)Ưu điểm : Cách biểu diễn khá đơn giản và trực quan. Có thể suy diễn theo chiến lược khác nhau : suy diễn tiến, suy diễn lùi, và suy diễn hỗn hợp. Khá gần gũi về cú pháp. Có thể kiểm tra tính mâu thuẫn giữa các luật. Tính mô đun cao, có nghĩa là việc thêm, sửa đổi hoặc loại bỏ các luật hoàn toàn không có ảnh hưởng tới các luật khác và cơ chế suy diễn. (*)Nhược điểm : Năng xuất xử lý thấp. Không sử dụng được các cấu trúc dữ liệu. d)Biểu diễn tri thức bằng FRAME Phương pháp biểu diễn tri thức bằng FRAME có tất cả các tính chất vốn có của một ngôn ngữ biểu diễn tri thức. Nghĩa là nó có thể biểu diễn tri thức ở góc độ giao diện người-máy, góc độ mô tả mô hình, điều khiển hệ thống. Đồng thời nó cũng là một cơ sở cho một phương pháp xử lý thông tin mới – hướng đối tượng. Nếu phương pháp nhờ logic và mạng ngữ nghĩa dùng để biểu diễn tri thức mô tả và phương pháp luật sản xuất dùng để biểu diễn tri thức thủ tục thì các FRAME là kết hợp của cả 2 dạng biểu diễn : mô tả và thủ tục. FRAME tận dụng được các ưu điểm của luật sản xuất, vị từ, cũng như mạng ngữ nghĩa. Cấu trúc của FRAME : (như trên, duy nhất, miền…) (text, integer, real, pointer…) (tên, giá trị, thủ tục,…) Ví dụ về 1 FRAME mô tả tập HOCSINH : Frame HOCSINH IS-A: FART-OF : NGUOI-DI-HOC A KIND OF : (HOC_SINH_CO_SO, HOC_SINH_TRUNG_HOC) Cân nặng : 10-60 kg Chiều cao : 80-170 cm Có râu : không Nói tiếng : Việt/Anh/Pháp Cấu trúc này cho ta một khung dữ liệu để khoanh vùng các đối tượng là học sinh. Trường hợp gặp 1 người cao 180 cm, nặng 45 kg ta có thể khẳng định rằng đó không phải học sinh, vì không thỏa mãn các ràng buộc đã có. (*)Ưu điểm : Đáp ứng tất cả các yêu cầu về biểu diễn tri thức. Cho phép người sử dụng khá tự do khi biểu diễn tri thức. FRAME không chỉ sử dụng để mô tả tri thức mà còn được dùng thể hiện các thuật toán suy dẫn. Tận dụng được những điểm mạnh của biểu diễn thủ tục và mô tả. Quá trình xử lý trên các FRAME độc lập theo nghĩa kế thừa thông tin, không nhất thiết phải tuần tự. (*)Nhược điểm : Phương pháp biểu diễn quá phức tạp và cồng kềnh. Phương pháp biểu diễn FRAME tiện lợi đối với kỹ sư xử lý tri thức cũng như người sử dụng có trình độ cao, nhưng lại là sự quá tải đối với những người sử dụng thông thường. Các giá trị của slot có thể gán qua thực hiện các thủ tục, điều này làm cho việc thu nạp và cập nhật tri thức trở nên phức tạp và làm khả năng mềm dẻo, phù hợp với những thay đổi của môi trường bên ngoài bị giảm xuống. Do cấu trúc của FRAME nên khi biểu diễn cần phải sử dụng các biện pháp khá cầu kỳ. Vì vậy làm mất đi tính trực quan trong phương pháp biểu diễn. Đối với các bài toán phức tạp thì việc mô tả và điều khiển hệ thống sử dụng FRAME sẽ phức tạp lên rất nhiều so với các phương pháp biểu diễn khác. e)Biểu diễn nhờ bộ ba liên hợp O.A.V Biểu diễn tri thức nhờ bộ ba liên hợp OAV là sử dụng bộ ba “Đối tượng”-“Thuộc tính”-“Giá trị” (Object-Attribute-Value) để chỉ ra rằng đối tượng với thuộc tính đã cho nào đó có một giá trị nào đó. Ví dụ : (Nguyễn A, cao, 167) (Nguyễn A, nặng, 64) (Nguyễn A, râu, không) (Nguyễn A, nói, tiếng Việt) =>Có thể mô tả dưới dạng mạng ngữ nghĩa và các bộ liên hợp như sau : Đối tượng trong bộ ba liên hợp được chia thành 2 loại : đối tượng tĩnh và đối tượng động. Các đối tượng tĩnh được lưu trong bộ nhớ ngoài (băng từ, đĩa…) và khi cần được nạp vào bộ nhớ trong để xử lý. Các đối tượng động được khởi tạo trong quá trình làm việc và được lưu giữ ở bộ nhớ trong phục vụ cho việc xử lý. Một điều quan trọng là các đối tượng có thể sắp xếp và liên kết lại với nhau cũng giống như trong liên kết các FRAME. Tuy vậy, không thể biết một cách chính xác và tường minh bản chất của từng liên kết. Vì vậy người ta thường sử dụng bộ ba liên hợp để biểu diễn các sự kiện không chắc chắn. (*)Ưu điểm : Cho phép biểu diễn các đối tượng một cách trực quan. Tính mô đun tương đối cao. Là ngôn ngữ biểu diễn dạng mô tả. Cho phép diễn đạt tường minh các luật suy diễn. (*)Tuy vậy, cách biểu diễn này thực chất là một dạng đặc biêt của phương pháp mạng ngữ nghĩa nên nó cũng có các nhược điểm của mạng ngữ nghĩa. Ngoài ra khi sử dụng phương pháp này, các quan hệ, liên kết giữa các đối tượng không thể biểu diễn một cách tường minh. II.3 Mô tơ suy diễn II.3.1 Cơ chế suy diễn a)Suy diễn tiến : Suy diễn tiến là lập luận từ các sự kiện, sự việc để rút ra các kết luận. Ví dụ: Nếu thấy trời mưa trước khi ra khỏi nhà (sự kiện) thì phải lấy áo mưa (kết luận). Trong phương pháp này, người sử dụng cung cấp các sự kiện cho hệ chuyên gia để hệ thống (máy suy diễn) tìm cách rút ra các kết luận có thể. Kết luận được xem là những thuộc tính có thể được gán giá trị. Trong số những kết luận này, có thể có những kết luận làm người sử dụng quan tâm, một số khác không nói lên điều gì, một số khác có thể vắng mặt. Các sự kiện thường có dạng : Attribute = Value Lần lượt các sự kiện trong cơ sở trí thức được chọn và hệ thống xem xét tất cả các luật mà các sự kiện này xuất hiện như là tiền đề. Theo nguyên tắc lập luận trên, hệ thống sẽ lấy ra những luật thỏa mãn. Sau khi gán giá trị cho các thuộc tính thuộc kết luận tương ứng, người ta nói rằng các sự kiện đã được thỏa mãn. Các thuộc tính được gán giá trị sẽ là một phần của kết quả chuyên gia. Sau khi mọi sự kiện đã được xem xét, kết quả được xuất ra cho người sử dụng dùng. b)Suy diễn lùi : Phương pháp suy diễn lùi tiến hành các lập luận theo chiều ngược lại (đối với phương pháp suy diễn tiến). Từ một giả thuyết (như là một kết luận), hệ thống đưa ra một tình huống trả lời gồm các sự kiện là cơ sở của giả thuyết đã cho này. Ví dụ: nếu ai đó vào nhà mà cầm áo mưa và quần áo bị ướt thì giả thuyết này là trời mưa. Để củng cố giả thuyết này, ta hỏi người đó xem có phải trời mưa không ? Nếu người đó trả lời là có thì giả thuyết trời mưa là đúng và trở thành một sự kiện. Nghĩa là trời mưa nên phải cầm áo mưa và quần áo bị ướt. Suy diễn lùi là cho phép nhận được giá trị của một thuộc tính. Đó là câu trả lời cho câu hỏi “giá trị của thuộc tính A là bao nhiêu ?” với A là một đích. Để xác định giá trị của A, cần có các nguồn thông tin. Những nguồn này có thể là những câu hỏi hoắc có thể là những luật. Căn cứ vào các câu hỏi, hệ thống nhận được một cách trực tiếp từ người sử dụng những giá trị của thuộc tính liên quan. Căn cứ vào các luật, hệ thống suy diễn có thể tìm ra giá trị sẽ là kết luận của một trong số các kết luận có thể của thuộc tính liên quan,… Ý tưởng của thuật toán suy diễn lùi như sau : Với mỗi thuộc tính đã cho, người ta định nghĩa nguồn của nó : Nếu thuộc tính xuất hiện như là tiền đề của một luật (phần đầu của luật), thì nguồn sẽ thu gọn thành một câu hỏi. Nếu thuộc tính xuất hiện như là hậu quả của một luật (phần cuối của luật), thì nguồn sẽ là các luật mà trong đó, thuộc tính là kết luận. Nếu thuộc tính là trung gian, xuất hiện đồng thời như là tiền đề và như là kết luận, khi đó nguồn có thể là các luật, hoặc có thể là các câu hỏi mà chưa được nêu ra. Nếu mỗi lần với câu hỏi đã cho, người sử dụng trả lời hợp lệ, giá trị trả lời này sẽ được gán cho thuộc tính và xem như thành công. Nếu nguồn là các luật, hệ thống sẽ lấy lần lượt các luật mà thuộc tính đích xuất hiện như kết luận, để có thể tìm giá trị các thuộc tính thuộc tiền đề. Nếu các luật thỏa mãn, thuộc tính kết luận sẽ được ghi nhận. c)Cơ chế hỗn hợp : Sử dụng kết hợp cả 2 phương pháp suy diễn trên. II.3.2 Cơ chế điều khiển a)Chọn hướng suy diễn: Cho f = # GT GT: tập các sự kiện ban đầu f = # KL KL: Tập các sự kiện kết quả f = max #{ r R/ r có thể áp dụng cho 1 tập con F nào đó } = max # lọc (F,R) f = max # { r R/ r có cùng một sự kiện ở vế phải } (*)Các luật heuristic : Luật 1 : nếu f < f thì chọn suy diễn tiến Luật 2 : nếu f > f thì chọn suy diễn lùi Luật 3 : nếu f = f và f < f thì chọn suy diễn tiến Luật 4 : nếu f = f và f > f thì chọn suy diễn lùi Luật 5 : nếu f = f và f = f người thiết kế có thể chọn 1 trong 2 phương pháp suy diễn để sử dụng. b)Giải quyết các vấn đề cạnh tranh : b.1)Cạnh tranh trong suy diễn tiến Tính huống cạnh tranh xảy ra khi và chỉ khi tồn tại F và r1, r2 R mà : r1 : left1q1, r2 : left2q2, left1F, left2Fó # lọc (F,R) 2 ta có lọc ({a},R) = {r1,r2} Đặt vấn đề : làm thế nào để chọn 1 luật r trong số các luật có thể áp dụng được bằng lọc (F,R) ? Giải pháp 1 : Tổ chức các luật có thể sử dụng được như một hàng đợi. Giải pháp 2 : Tổ chức các luật có thể sử dụng theo xếp chồng. Giải pháp 3 : Sử dụng heuristic Đối với mỗi r R bằng kỹ thuật heuristic ta đánh giá liên hệ hàm ước lượng h trong KL với một phần vế phải của luật r, r : leftq H(r,KL) = h(q,KL) Nguyên tắc : Luật r : leftq sẽ được chọn khi và chỉ khi h(q,KL) min/max Giải pháp 4 : Thực hiện sắp xếp thứ tự các sự kiện (Đồ thị FPG-Fact Precedence Graph) Cho tập luật R và mỗi sự kiện của R là một nút, các luật là các dây cung trong đồ thị FPG. Giải pháp 4’ : Sử dụng đồ thị VA/HOĂC Mỗi luật r : pp…pq tương đương với một cụm cung kiểu “VÀ”. Giải pháp 5 : Đồ thị thứ tự luật (RPG – Rule Precedence Graph) Một luật r là sắp thứ tự với luật r (ký hiệu là r r) nếu và chỉ nếu tồn tại một sự kiện f sao cho : r : leftf ; r :…f…q Một luật r được gọi “khởi đầu – initial” nếu và chỉ nếu : r : leftq và left GTINITIAL Mỗi luật r được gọi là “kết thúc – final” nếu và chỉ nếu : r : left q và q GTFINAL Biểu diễn trong đồ thị RPG : Mỗi luật khởi đầu được coi là “áp dụng” ; APP = {INITIAL}. Cho App(r) điểm – vào(r) = {r’} tồn tại một đỉnh r’r trong RPG ; r : leftq ; mỗi r’ App(r) có thể áp dụng Nếu left {q’/ r’ App(r)}GT Thì luật r cũng có thể được áp dụng. Suy diễn trong đồ thị RPG như sau : Chọn một luật trong APPLICABLE. Thực hiện luật đó. Chú ý : đối với Suy diễn theo chiều rộng APP = hàng đợi Suy diễn theo chiều sâu APP = xếp chồng (*)Một số các kinh nghiệm (heuristics) : b.1.1/, h(r,FINALS) = h(r) # điểm – ra(r) = #{r’ / tồn tại một cung rr’ trong RPG} Luật được chọn ó h(r) = # điểm – ra(r) max b.1.2/, h(r,FINALS) = # p Luật được chọn ó h(r,FINALS) min b.1.3/, h(r,FINALS) = # {p / p : r FINALS} (số lượng các đường đi từ luật r đến FINALS trong đồ thị RPG) Luật được chọn ó h(r,FINALS) là lớn nhất b.2)Cạnh tranh trong suy diễn lùi : Cạnh tranh trong suy diễn lùi xảy ra khi và chỉ khi với một sự kiện f nào đó tồn tại ít nhất 2 luật r1, r2 : r1 : left1f và r2 : left2f Định nghĩa hàm tìm thấy: Tìm_thấy(f) = {r/ r : leftf } Câu hỏi đặt ra : Làm thế nào để chọn một luật sao cho r Tìm_thấy (f) Giải pháp 1 : Nếu r, r Tìm_thấy (f) Và r, r không được sử dụng nữa Và i < j Thì r được chọn Giải pháp 2 : Sử dụng đồ thì VA/HOAC và đồ thị FPG (*)Một vài phương pháp kinh nghiệm (heuristics) b.2.1/, Xét luật r : leftq. Với mỗi sự kiện f độ_dài(f,GT) = độ dài đường đi ngắn nhất từ GT đến f. h(r,GT) = max(độ_dài(f,GT)/ fleft) luật r1 được chọn ó h(r1,GT) nhỏ nhất b.2.2/, h(r,GT) = # left /* r : leftq */ luật được chọn ó # leftnhỏ nhất b.2.3/, Hàm độ_sâu(f,GT) = 0 nếu fGT Max { max( độ_sâu(q) + 1)} r : leftf q left luật được chọn ó max{độ_sâu(q)} nhỏ nhất b.2.4/, Hàm h(r,GT) = ( độ_sâu(f) ) f left luật được chọn ó h(r,GT) nhỏ nhất c)Việc giới hạn Thao tác lọc thường tốn thời gian để tính toán, nên phải lướt qua tập luật R để tìm ra tập có thể áp dụng được APPLICABLE. Để giảm nhẹ con số thử nghiệm, người ta quyết định chỉ lọc một phần các luật, hoặc sự kiện được đưa vào. Đó là việc giới hạn phải làm trước khi lọc. Chương III : ÁP DỤNG MÔ HÌNH HỆ CHUYÊN GIA XÂY DỰNG CHƯƠNG TRÌNH ĐOÁN NHẬN TÍNH CÁCH NGƯỜI QUA ĐẶC TẢ KHUÔN MẶT (*)Mô hình hệ. Em dự định xây dựng một chương trình hệ chuyên gia, mà qua đó cho phép đoán tính cách của một người nào đó dựa trên những đặc tả về khuôn mặt của họ. Hệ thống sử dụng vecto suy diễn tiến và cơ sở tri thức như sau : III.1 Vecto suy diễn tiến Giải quyết vấn đề dựa trên biểu diễn bài toán bằng logic vị từ, logic mệnh đề, các phương pháp suy diễn sẽ dần dần chuyển từ các giả thiết về kết luận, bằng cách thêm vào giả thiết các sự kiện đã được khẳng định là đúng, dựa trên 2 phương thức : Modus ponens : Nghĩa là nếu A đúng, AB đúng thì B cũng đúng. Modus tollens: Nghĩa là nếu B sai , AB đúng thì A cũng sai. Nói một cách khác, giả sử A, B, -A, -B là các sự kiện, trước khi áp dụng luật AB , ta có tập {A} (hoặc tập {B} tương ứng) thì sau sự khi thực hiện luật ta sẽ có thêm {B} (hoặc{-A} tương ứng). Kết quả là có tập sự kiện {A,B} (hoặc {-A,-B}) Ta có thể viết : {A} AB {A,B} {-B} AB {-A,-B} Như vậy, quá trình suy diễn bắt đầu từ tập các giả thiết, làm nở dần dần bằng cách thêm vào các sự kiện mới cho đến khi một trong các kết luận cần chứng minh được thực hiện. Chữ “tiến” ở đây sẽ được dùng với nghĩa với mỗi qui tắc luật AB, ta sẽ chuyển từ vế trái sang vế phải dấu . (*)Suy diễn tiến với logic mệnh đề : Đầu vào : Tập các mệnh đề đã cho GT = {g1,g2,…,g} Tập các luật RULE có dạng Horn : p1p2…pq Tập các mệnh đề kết luận : KL = {q1,q2,…,q} Đầu ra : Thông báo thành công nếu mọi q KL có thể suy ra từ giả thiết GT nhờ sử dụng tập luật RULE. Thuật toán : Tgian là tập các sự kiện (mệnh đề) đúng trong thời điểm đang xét, ban đầu Tgian = GT. Sat là tập luật có dạng p1p2…pq sao cho i = (i,n) p Tgian { Tgian = GT; Sat = lọc (RULE,Tgian); While KL Tgian and Sat do { r get (Sat) ; /*lấy một luật khả hợp từ tập Sat,giả sử r có dạng p1p2…pq */ TgianTgian {q}; RULERULE \ {r}; Sat = lọc (RULE,Tgian); }; If KL Tgian then exit (“thành công”) else exit (“không thành công”); } III.2 Cơ sở tri thức Thông qua việc tham khảo và tổng hợp các tài liệu về nhân tướng học, em dự định sẽ xây dựng một cơ sở tri thức với các luật theo cấu trúc If…then được minh họa như sau : Nếu một người có vầng trán cao rộng thì đây là một người có trí năng, nghị lực. Nếu một người có vầng trán thấp rộng thì đây là một người có khả năng quan sát tinh tế, kiên trì nhưng lại quá e dè. Nếu một người có vầng trán vồ thì đây là người có tính độc lập, có khả năng thích nghi, tháo vát. Nếu một người có đôi mắt to không bằng nhau (mắt to, mắt bé) thì đây là một người có tham vọng, tháo vát, chan hòa và năng nổ Nếu một người có đôi mắt to thì đây là người giàu cảm xúc, thích nghệ thuật và thông minh. Nếu một người có đôi tai to thì đây là người có tính chủ động, lịch lãm, chuyên cần. Nếu một người có đôi tai nhỏ thì đây là người hay thay đổi, trí nhớ kém, nhưng lại có khiếu nghệ thuật và sáng tạo. Nếu một người có mũi ngắn dẹt thì đây là người suy nghĩ chậm chạp nhưng trung thành với ai đối xử tốt với họ. Nếu một người có chiếc mũi dài to cao thì đây là người vô cùng cố chấp. Nếu một người có bướu ở giữa mũi thì đây là người khỏe mạnh, kiên quyết và ưa mạo hiểm. Nếu một người có miệng rộng thì đây là người cởi mở, chan hòa, có nghị lực, thân mật và thoải mái. Nếu một người có miệng nhỏ thì đây là người yếu đuối, sống lệ thuộc, đa cảm. Nếu một người có 2 răng cửa nhỏ thì đây là người năng nổ, nói nhiều nhưng không có khả năng giữ bí mật. Ngoài ra còn có các luật với cấu trúc Ifandand…then bằng cách liên kết các điều kiện ở các luật bên trên theo những hướng khác nhau tùy ý người dùng và kết quả là kết quả tổng hợp. Ví dụ như : “Nếu một người có vầng trán vuông, mắt lồi, tai to, mũi dài to cao, miệng trề thì đây là một người có tinh thần thực tiễn; cẩn thận, tham vọng, nhiều nghị lực; lịch lãm, chuyên cần; cố chấp; nói nhiều, vui vẻ ”. Với các luật như trên em đã xây dựng được cơ sở dữ liệu như sau : a)Ràng buộc trong cơ sở dữ liệu : b)Chi tiết các bảng : tbl_FeatureType : Bảng trên cho phép cập nhật thông tin về các bộ phận trên khuôn mặt con người. tbl_Feature : Bảng trên cho phép cập nhập các đặc điểm của từng loại bộ phận trên khuôn mặt người. Ví dụ như : với id_type = 0 , ta có thể thấy “ trán ” có các đặc điểm như vuông , vồ , lẹm , cao rộng … tbl_Characters : Chúng ta có thể cập nhập các tính cách có thể có của con người trong bảng trên. tbl_RelationType : Trong “ tbl_RelationType ” ta cập nhật thông tin về các mối quan hệ có thể có giữa các tính cách. Ví dụ : 2 tính cách “ thông minh ” và “ suy nghĩ chậm chạp ” có mối quan hệ đối lập nhau. 2 tính cách “ vui vẻ ” và “ ham vui ” có mối quan hệ tương đồng , tương hỗ. tbl_FeatureRelation : “ tbl_FeatureRelation ” cho phép ta thiết lập mối quan hệ giữa các đặc điểm của từng bộ phận trên khuôn mặt với tính cách của con người. tbl_CharacterRelation : “ tbl_FeatureRelation ” cho phép ta thiết lập mối quan hệ giữa các tính cách. (*) Cơ sở dữ liệu trên cho phép chúng ta thực hiện các thao tác cập nhập dễ dàng thông qua chương trình được mô tả dưới đây. Chương IV : CHƯƠNG TRÌNH CHÍNH IV.1 Môi trường Hệ điều hành : Windows Nền tảng : NetFramework 3.5 Sử dụng hệ quản trị cơ sở dữ liệu Access Môtơ suy diễn tiến Ngôn ngữ cài đặt : C# IV.2 Giao diện chương trình Giao diện chính : Người dùng có thể lựa chọn các đặc điểm trên khuôn mặt mà họ cần trong các comboBox “Nhận dạng” và “Đặc điểm”. Sau khi nhấn vào button “Thêm”, các đặc điểm đó sẽ hiện lên trong listview như sau : Khi click button “Phỏng đoán”, chương trình sẽ xử lý và đưa ra những tính cách có thể có dựa trên các đặc điểm mà người dùng đã chọn : Bên cạnh chức năng phỏng đoán tính cách con người qua đặc tả khuôn mặt, chương trình còn cho phép người dùng cập nhật cơ sở dữ liệu thông qua button : Trên form “Co so du lieu” này chúng ta có thể thực hiện các thao tác như : Thêm bớt các đặc điểm của khuôn mặt cũng như những tính cách thường thấy ở con người. Thiết lập các mối quan hệ giữa đặc điểm nhận dạng và tính cách thông qua form : Thiết lập các mối quan hệ giữa 2 tính cách chuẩn (xét sự đối lập của 2 tính cách) thông qua form : IV.3 Mã nguồn một số form chính Main form : public partial class Main : Form { private List> idFeature; private List> textFeature; private List listChar; public Main() { InitializeComponent(); cb_Type.LostFocus += new EventHandler(cb_Type_LostFocus); cb_DacDiem.LostFocus += new EventHandler(cb_DacDiem_LostFocus); } private void cb_Type_LostFocus(object sender, EventArgs e) { if (cb_Type.SelectedIndex == -1) { errPrv.SetError(cb_Type, "Không tồn tại đặc điểm này"); cb_Type.Focus(); } else errPrv.Clear(); } private void cb_DacDiem_LostFocus(object sender, EventArgs e) { if (cb_DacDiem.SelectedIndex == -1) { errPrv.SetError(cb_DacDiem, "Không tồn tại đặc điểm này"); cb_DacDiem.Focus(); } else errPrv.Clear(); } private void init() { idFeature = new List>(); textFeature = new List>(); for (int i = 0; i < cb_Type.Items.Count; i++) { idFeature.Add(new List()); textFeature.Add(new List()); } for (int i = 0; i < cb_Type.Items.Count; i++) { ListViewItem item = new ListViewItem(i.ToString()); item.SubItems.Add(((System.Data.DataRowView)cb_Type.Items[i])["Mota"].ToString()); item.SubItems.Add(""); lv_DDNhanDang.Items.Add(item); } } private void Main_Load(object sender, EventArgs e) { this.tbl_FeatureTypeTableAdapter.Fill(this.boiToanDataSet.tbl_FeatureType); init(); cb_Type_SelectedIndexChanged(cb_Type, new EventArgs()); } private void button1_Click(object sender, EventArgs e) { CSDL frm_CSDL = new CSDL(); frm_CSDL.Disposed += new EventHandler(frm_CSDL_Disposed); frm_CSDL.Show(); } private void frm_CSDL_Disposed(object sender, EventArgs e) { cb_Type_SelectedIndexChanged(cb_Type, new EventArgs()); this.Visible = true; } private void cb_Type_SelectedIndexChanged(object sender, EventArgs e) { if (cb_Type.SelectedIndex == -1) { errPrv.SetError(cb_Type, "Không tồn tại đặc điểm này"); cb_Type.Focus(); return; } else errPrv.Clear(); BoiToanDataSet.tbl_FeaturesDataTable dataTable = new BoiToanDataSet.tbl_FeaturesDataTable(); BoiToanDataSetTableAdapters.tbl_FeaturesTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.tbl_FeaturesTableAdapter(); adapter.FillByType(dataTable, int.Parse(cb_Type.SelectedValue.ToString())); cb_DacDiem.DisplayMember = dataTable.MotaColumn.ColumnName; cb_DacDiem.ValueMember = dataTable.idColumn.ColumnName; cb_DacDiem.DataSource = dataTable; } private void bt_AddFeature_Click(object sender, EventArgs e) { if (cb_Type.SelectedIndex == -1) { errPrv.SetError(cb_Type, "Không tồn tại đặc điểm này"); cb_Type.Focus(); return; } else errPrv.Clear(); if (cb_DacDiem.SelectedIndex == -1) { errPrv.SetError(cb_DacDiem, "Không tồn tại đặc điểm này"); cb_DacDiem.Focus(); return; } else errPrv.Clear(); int idx = cb_Type.SelectedIndex; try { int id = int.Parse(cb_DacDiem.SelectedValue.ToString()); if (idFeature[idx].Contains(id)) return; idFeature[idx].Add(id); textFeature[idx].Add(cb_DacDiem.Text); if (lv_DDNhanDang.Items[idx].SubItems[2].Text.Length > 0) lv_DDNhanDang.Items[idx].SubItems[2].Text += ", "; lv_DDNhanDang.Items[idx].SubItems[2].Text += cb_DacDiem.Text; } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } } private void bt_RemoveFeature_Click(object sender, EventArgs e) { if (lv_DDNhanDang.SelectedItems.Count <= 0) return; int idx = lv_DDNhanDang.SelectedIndices[0]; if (textFeature[idx].Count <= 0) return; idFeature[idx].RemoveAt(idFeature[idx].Count - 1); textFeature[idx].RemoveAt(textFeature[idx].Count - 1); lv_DDNhanDang.Items[idx].SubItems[2].Text = ""; if (textFeature[idx].Count > 0) { for (int i = 0; i < textFeature[idx].Count - 1; i++) lv_DDNhanDang.Items[idx].SubItems[2].Text += textFeature[idx][i] + ", "; lv_DDNhanDang.Items[idx].SubItems[2].Text += textFeature[idx][textFeature[idx].Count - 1]; } } private void bt_Go_Click(object sender, EventArgs e) { List str = new List(); listChar = getListCharacter(ref str); if (listChar.Count <= 0) { MessageBox.Show("Không tồn tại chuẩn tính cách nào !"); return; } List charCount = new List(); for (int i=0; i<listChar.Count; i++) charCount.Add(0); for (int i = 0; i < idFeature.Count; i++) { for (int j = 0; j < idFeature[i].Count; j++) { processFeature(idFeature[i][j], listChar, ref charCount); } } for (int i = 0; i < charCount.Count - 1; i++) if (charCount[i] > 0) { for (int j=i + 1; j<charCount.Count; j++) if (charCount[j] > 0) { if (hasRelation(listChar[i], listChar[j])) { charCount[i] += (int)(charCount[i] / 2); charCount[j] += (int)(charCount[j] / 2); } } } for (int i = 0; i < charCount.Count; i++) for (int j=i+1; j<charCount.Count; j++) if (charCount[i] < charCount[j]) { int c = charCount[i]; charCount[i] = charCount[j]; charCount[j] = c; c = listChar[i]; listChar[i] = listChar[j]; listChar[j] = c; String tmp = str[i]; str[i] = str[j]; str[j] = tmp; } List resultIdx = new List(); for (int i = 0; i < charCount.Count; i++) if (charCount[i] > 0) { if (canAdd(resultIdx, listChar[i])) resultIdx.Add(i); } else break; rtb_TinhCach.Text = "Người này có tính cách: "; for (int i = 0; i < resultIdx.Count; i++) { rtb_TinhCach.Text += str[resultIdx[i]] + ", "; } } private bool hasRelation(int _id1, int _id2) { BoiToanDataSet.tbl_CharacterRelationDataTable tbl = new BoiToanDataSet.tbl_CharacterRelationDataTable(); BoiToanDataSetTableAdapters.tbl_CharacterRelationTableAdapter adap = new BoiToan.BoiToanDataSetTableAdapters.tbl_CharacterRelationTableAdapter(); adap.FillBy2ID(tbl, _id1, _id2); if (tbl.Rows.Count > 0) if (tbl.Rows[0][tbl.relation_typeColumn].ToString() == CharacterRelation.QH_TUONG_HO.ToString()) return true; adap.FillBy2ID(tbl, _id2, _id1); if (tbl.Rows.Count > 0) if (tbl.Rows[0][tbl.relation_typeColumn].ToString() == CharacterRelation.QH_TUONG_HO.ToString()) return true; return false; } private bool canAdd(List _listIdx, int _id) { BoiToanDataSet.tbl_CharacterRelationDataTable tbl = new BoiToanDataSet.tbl_CharacterRelationDataTable(); BoiToanDataSetTableAdapters.tbl_CharacterRelationTableAdapter adap = new BoiToan.BoiToanDataSetTableAdapters.tbl_CharacterRelationTableAdapter(); adap.ClearBeforeFill = true; for (int i = 0; i < _listIdx.Count; i++) { adap.FillBy2ID(tbl, listChar[_listIdx[i]], _id); if (tbl.Count > 0) { if (tbl.Rows[0][tbl.relation_typeColumn].ToString() == CharacterRelation.QH_DOI_LAP.ToString()) return false; } adap.FillBy2ID(tbl, _id, listChar[_listIdx[i]]); if (tbl.Count > 0) { if (tbl.Rows[0][tbl.relation_typeColumn].ToString() == CharacterRelation.QH_DOI_LAP.ToString()) return false; } } return true; } private void processFeature(int _idFeature, List _idCharList, ref List _countList) { BoiToanDataSet.tbl_FeatureRelationDataTable tbl = new BoiToanDataSet.tbl_FeatureRelationDataTable(); BoiToanDataSetTableAdapters.tbl_FeatureRelationTableAdapter adap = new BoiToan.BoiToanDataSetTableAdapters.tbl_FeatureRelationTableAdapter(); adap.FillByIdFeature(tbl, _idFeature); for (int i = 0; i < tbl.Rows.Count; i++) { try { int idChar = int.Parse(tbl.Rows[i][tbl.id_characterColumn].ToString()); int weight = int.Parse(tbl.Rows[i][tbl.weightColumn].ToString()); for (int j=0; j<_idCharList.Count; j++) if (_idCharList[j] == idChar) { _countList[j] += weight; break; } } catch {} } } private List getListCharacter(ref List charStr) { List result = new List(); BoiToanDataSet.tbl_CharactersDataTable tbl = new BoiToanDataSet.tbl_CharactersDataTable(); BoiToanDataSetTableAdapters.tbl_CharactersTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.tbl_CharactersTableAdapter(); adapter.Fill(tbl); charStr.Clear(); for (int i = 0; i < tbl.Rows.Count; i++) { try { result.Add(int.Parse(tbl.Rows[i][tbl.idColumn].ToString())); charStr.Add(tbl.Rows[i][tbl.MotaColumn].ToString()); } catch { } } return result; } private void mn_CT_Thoat_Click(object sender, EventArgs e) { this.Close(); } private void mn_CT_CSDL_Click(object sender, EventArgs e) { CSDL frm_CSDL = new CSDL(); frm_CSDL.Disposed += new EventHandler(frm_CSDL_Disposed); frm_CSDL.Show(); this.Visible = false; } private void textBox1_TextChanged(object sender, EventArgs e) { } private void tb_Search_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { doSearch(); } } private void doSearch() { MessageBox.Show("Do search"); } private void thôngTinChươngTrìnhToolStripMenuItem_Click(object sender, EventArgs e) { ThongTin frm_about = new ThongTin(); frm_about.Show(); } private void câuHỏiTrắcNToolStripMenuItem_Click(object sender, EventArgs e) { Question frm_Question = new Question(); frm_Question.Show(); } private void làmBàiToolStripMenuItem_Click(object sender, EventArgs e) { Quiz frm_Quiz = new Quiz(); frm_Quiz.Show(); this.Visible = false; frm_Quiz.Disposed += new EventHandler(frm_CSDL_Disposed); } private void cb_DacDiem_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { bt_AddFeature_Click(bt_AddFeature, new EventArgs()); } } private void bt_Close_Click(object sender, EventArgs e) { this.Dispose(); } } Form cập nhập cơ sở dữ liệu : public partial class CSDL : Form { public const int DAC_DIEM_TRAN = 0; public const int DAC_DIEM_MAT = 1; public const int DAC_DIEM_MUI = 2; public const int DAC_DIEM_MIENG = 3; public const int DAC_DIEM_TAI = 4; private BoiToanDataSet.tbl_FeaturesDataTable dt_DacDiem; private BoiToanDataSet.tbl_CharactersDataTable dt_TinhCachChuan; private int idAddFeature; public CSDL() { InitializeComponent(); } public static String correctString(String _input) { String result = ""; Char pChar = ' '; for (int i = 0; i < _input.Length; i++) { if (_input[i] == ' ' && pChar == ' ') continue; pChar = _input[i]; result += _input[i].ToString(); } return result; } private void Main_Load(object sender, EventArgs e) { this.tbl_FeatureTypeTableAdapter.Fill(this.boiToanDataSet.tbl_FeatureType); cb_Type.SelectedIndex = 0; refreshCharacters(); cb_Type_SelectedIndexChanged(cb_Type, new EventArgs()); } private void refreshCharacters() { dt_TinhCachChuan = new BoiToanDataSet.tbl_CharactersDataTable(); BoiToanDataSetTableAdapters.tbl_CharactersTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.tbl_CharactersTableAdapter(); adapter.Fill(dt_TinhCachChuan); lv_TinhCach.Items.Clear(); for (int i = 0; i < dt_TinhCachChuan.Rows.Count; i++) { ListViewItem item = new ListViewItem(i.ToString()); item.SubItems.Add(dt_TinhCachChuan.Rows[i][dt_TinhCachChuan.MotaColumn].ToString()); lv_TinhCach.Items.Add(item); } } private void cb_Type_SelectedIndexChanged(object sender, EventArgs e) { if (cb_Type.SelectedIndex < 0) return; lv_DDNhanDang.Items.Clear(); dt_DacDiem = new BoiToanDataSet.tbl_FeaturesDataTable(); BoiToanDataSetTableAdapters.tbl_FeaturesTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.tbl_FeaturesTableAdapter(); try { adapter.FillByType(dt_DacDiem, int.Parse(cb_Type.SelectedValue.ToString())); } catch { } for (int i = 0; i < dt_DacDiem.Rows.Count; i++) { ListViewItem item = new ListViewItem(i.ToString()); item.SubItems.Add(dt_DacDiem.Rows[i][dt_DacDiem.MotaColumn].ToString()); item.SubItems.Add(getHasCharaters(int.Parse(dt_DacDiem.Rows[i][dt_DacDiem.idColumn].ToString()))); lv_DDNhanDang.Items.Add(item); } } private String getHasCharaters(int _id_feature) { String result = ""; BoiToanDataSet.view_FeatureRelationDataTable tbl = new BoiToanDataSet.view_FeatureRelationDataTable(); BoiToanDataSetTableAdapters.view_FeatureRelationTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.view_FeatureRelationTableAdapter(); adapter.FillByFeatureID(tbl, _id_feature); for (int i = 0; i < tbl.Rows.Count; i++) { if (tbl.Rows[i][tbl.weightColumn].ToString() == "2") { result += tbl.Rows[i][tbl.MotaColumn].ToString() + ", "; } } return result; } private void bt_ThemTC_Click(object sender, EventArgs e) { InputText frm_input = new InputText(); frm_input.Finished += new InputText.EventUpdate(frm_input_Finished); frm_input.Show(); } private void frm_input_Finished(object sender, String _value) { BoiToanDataSetTableAdapters.tbl_CharactersTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.tbl_CharactersTableAdapter(); int i = 0; String tmp = adapter.getMaxID().ToString(); if (!(tmp == "")) i = int.Parse(tmp) + 1; _value = correctString(_value.Trim()); if (adapter.GetDataByMota(_value).Rows.Count > 0) { MessageBox.Show("Đã tồn tại tính cách này!"); return; } adapter.Insert(i, _value); refreshCharacters(); } private void bt_XoaTC_Click(object sender, EventArgs e) { if (lv_TinhCach.SelectedIndices.Count == 0) return; BoiToanDataSetTableAdapters.tbl_CharactersTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.tbl_CharactersTableAdapter(); try { int id = int.Parse(dt_TinhCachChuan.Rows[lv_TinhCach.SelectedIndices[0]][dt_TinhCachChuan.idColumn].ToString()); BoiToanDataSetTableAdapters.tbl_FeatureRelationTableAdapter featureAdap = new BoiToan.BoiToanDataSetTableAdapters.tbl_FeatureRelationTableAdapter(); featureAdap.DeleteByCharacterID(id); BoiToanDataSetTableAdapters.tbl_CharacterRelationTableAdapter charAdap = new BoiToan.BoiToanDataSetTableAdapters.tbl_CharacterRelationTableAdapter(); featureAdap.DeleteByCharacterID(id); String mota = dt_TinhCachChuan.Rows[lv_TinhCach.SelectedIndices[0]][dt_TinhCachChuan.MotaColumn].ToString(); adapter.Delete(id, mota); } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } refreshCharacters(); cb_Type_SelectedIndexChanged(cb_Type, new EventArgs()); } private void bt_ChiTietTC_Click(object sender, EventArgs e) { CharacterRelation frm_Relation = new CharacterRelation(); frm_Relation.Show(); } private void lv_TinhCach_MouseDoubleClick(object sender, MouseEventArgs e) { bt_ChiTietTC_Click(sender, new EventArgs()); } private void bt_AddFeature_Click(object sender, EventArgs e) { if (cb_Type.SelectedIndex < 0) return; InputText frm_inputFeature = new InputText(); frm_inputFeature.Finished += new InputText.EventUpdate(frm_inputFeature_Finished); frm_inputFeature.Show(); idAddFeature = int.Parse(cb_Type.SelectedValue.ToString()); } private void frm_inputFeature_Finished(object sender, String _value) { BoiToanDataSetTableAdapters.tbl_FeaturesTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.tbl_FeaturesTableAdapter(); try { int newID = int.Parse(adapter.getMaxID().ToString()) + 1; _value = correctString(_value.Trim()); if (adapter.GetDataByMota(_value, idAddFeature).Rows.Count > 0) { MessageBox.Show("Đã tồn tại đặc điểm này!"); return; } adapter.Insert(newID, _value, idAddFeature); } catch { } cb_Type_SelectedIndexChanged(cb_Type, new EventArgs()); } private void bt_RemoveFeature_Click(object sender, EventArgs e) { if (lv_DDNhanDang.SelectedItems.Count <= 0) return; int idx = lv_DDNhanDang.SelectedIndices[0]; try { int id = int.Parse(dt_DacDiem.Rows[idx][dt_DacDiem.idColumn].ToString()); BoiToanDataSetTableAdapters.tbl_FeatureRelationTableAdapter featureAdap = new BoiToan.BoiToanDataSetTableAdapters.tbl_FeatureRelationTableAdapter(); featureAdap.DeleteByFeatureID(id); BoiToanDataSetTableAdapters.tbl_FeaturesTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.tbl_FeaturesTableAdapter(); adapter.DeleteByID(id); } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } cb_Type_SelectedIndexChanged(cb_Type, new EventArgs()); } private void bt_DetailFeature_Click(object sender, EventArgs e) { FeaturesRelation frm_Relation = new FeaturesRelation(); frm_Relation.Disposed += new EventHandler(frm_Relation_Disposed); frm_Relation.Show(); } private void frm_Relation_Disposed(object sender, EventArgs e) { cb_Type_SelectedIndexChanged(cb_Type, new EventArgs()); } } Form thiết lập mối quan hệ giữa các tính cách : public partial class CharacterRelation : Form { public const int QH_DOI_LAP = 0; public const int QH_TUONG_HO = 1; private int idTinhCach; private List listID; public CharacterRelation() { InitializeComponent(); listID = new List(); } private void Main_Load(object sender, EventArgs e) { this.tbl_CharactersTableAdapter.Fill(this.boiToanDataSet.tbl_Characters); if (cb_TinhCach.Items.Count > 0) { cb_TinhCach.SelectedIndex = 0; cb_TinhCach_SelectedIndexChanged(cb_TinhCach, new EventArgs()); } } private void bt_ThemTC_Click(object sender, EventArgs e) { InputCharactersRelation frm_InputRelation = new InputCharactersRelation(); frm_InputRelation.Show(); frm_InputRelation.Disposed += new EventHandler(frm_InputRelation_Disposed); } private void frm_InputRelation_Disposed(object sender, EventArgs e) { cb_TinhCach_SelectedIndexChanged(cb_TinhCach, new EventArgs()); } private void bt_XoaTC_Click(object sender, EventArgs e) { if (lv_TinhCach.SelectedItems.Count <= 0) return; int idx = lv_TinhCach.SelectedIndices[0]; try { BoiToanDataSetTableAdapters.tbl_CharacterRelationTableAdapter adap = new BoiToan.BoiToanDataSetTableAdapters.tbl_CharacterRelationTableAdapter(); adap.DeleteBy2Id(int.Parse(cb_TinhCach.SelectedValue.ToString()), listID[idx]); adap.DeleteBy2Id(listID[idx], int.Parse(cb_TinhCach.SelectedValue.ToString())); } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } cb_TinhCach_SelectedIndexChanged(cb_TinhCach, new EventArgs()); } private void cb_TinhCach_SelectedIndexChanged(object sender, EventArgs e) { if (cb_TinhCach.SelectedIndex == -1) return; lv_TinhCach.Items.Clear(); BoiToanDataSetTableAdapters.view_getRelationTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.view_getRelationTableAdapter(); BoiToanDataSet.view_getRelationDataTable tbl = new BoiToanDataSet.view_getRelationDataTable(); adapter.Fill(tbl); listID.Clear(); for (int i = 0; i < tbl.Rows.Count; i++) { if (tbl.Rows[i][tbl.id_char1Column].ToString() == cb_TinhCach.SelectedValue.ToString()) { ListViewItem item = new ListViewItem(lv_TinhCach.Items.Count.ToString()); item.SubItems.Add(tbl.Rows[i][tbl.Expr1Column].ToString()); item.SubItems.Add(tbl.Rows[i][tbl.Expr2Column].ToString()); lv_TinhCach.Items.Add(item); listID.Add(int.Parse(tbl.Rows[i][tbl.id_char2Column].ToString())); } else if (tbl.Rows[i][tbl.id_char2Column].ToString() == cb_TinhCach.SelectedValue.ToString()) { ListViewItem item = new ListViewItem(lv_TinhCach.Items.Count.ToString()); item.SubItems.Add(tbl.Rows[i][tbl.MotaColumn].ToString()); item.SubItems.Add(tbl.Rows[i][tbl.Expr2Column].ToString()); lv_TinhCach.Items.Add(item); listID.Add(int.Parse(tbl.Rows[i][tbl.id_char1Column].ToString())); } } } } Form thiết lập mối quan hệ giữa đặc điểm khuôn mặt và tính cách : public partial class FeaturesRelation : Form { BoiToanDataSet.view_FeatureRelationDataTable tbl_Relation; public FeaturesRelation() { InitializeComponent(); } private void Main_Load(object sender, EventArgs e) { this.tbl_FeatureTypeTableAdapter.Fill(this.boiToanDataSet.tbl_FeatureType); cb_Type.SelectedIndex = 0; refreshCharacters(); cb_Type_SelectedIndexChanged(cb_Type, new EventArgs()); } private void refreshCharacters() { } private void cb_Type_SelectedIndexChanged(object sender, EventArgs e) { if (cb_Type.SelectedIndex < 0) return; BoiToanDataSet.tbl_FeaturesDataTable dataTable = new BoiToanDataSet.tbl_FeaturesDataTable(); BoiToanDataSetTableAdapters.tbl_FeaturesTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.tbl_FeaturesTableAdapter(); adapter.FillByType(dataTable, int.Parse(cb_Type.SelectedValue.ToString())); cb_DacDiem.DisplayMember = dataTable.MotaColumn.ColumnName; cb_DacDiem.ValueMember = dataTable.idColumn.ColumnName; cb_DacDiem.DataSource = dataTable; } private void bt_AddFeature_Click(object sender, EventArgs e) { InputFeatureRelation frm_InputRelation = new InputFeatureRelation(); frm_InputRelation.Finished += new InputFeatureRelation.EventUpdate(frm_InputRelation_Finished); frm_InputRelation.Show(); } private void frm_InputRelation_Finished(object sender) { cb_DacDiem_SelectedIndexChanged(cb_DacDiem, new EventArgs()); } private void cb_DacDiem_SelectedIndexChanged(object sender, EventArgs e) { if (cb_DacDiem.SelectedIndex 0) return; lv_DDNhanDang.Items.Clear(); tbl_Relation = new BoiToanDataSet.view_FeatureRelationDataTable(); BoiToanDataSetTableAdapters.view_FeatureRelationTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.view_FeatureRelationTableAdapter(); adapter.FillByFeatureID(tbl_Relation, int.Parse(cb_DacDiem.SelectedValue.ToString())); for (int i = 0; i < tbl_Relation.Rows.Count; i++) { ListViewItem item = new ListViewItem(i.ToString()); item.SubItems.Add(tbl_Relation.Rows[i][tbl_Relation.MotaColumn].ToString()); int weight = int.Parse(tbl_Relation.Rows[i][tbl_Relation.weightColumn].ToString()); String qh = "Có"; if (weight == -1) qh = "Không có"; item.SubItems.Add(qh); lv_DDNhanDang.Items.Add(item); } } private void bt_RemoveFeature_Click_1(object sender, EventArgs e) { if (lv_DDNhanDang.SelectedItems.Count <= 0) return; try { int idx = lv_DDNhanDang.SelectedIndices[0]; int id_feature = int.Parse(tbl_Relation.Rows[idx][tbl_Relation.id_featureColumn].ToString()); int id_character = int.Parse(tbl_Relation.Rows[idx][tbl_Relation.id_characterColumn].ToString()); BoiToanDataSetTableAdapters.tbl_FeatureRelationTableAdapter adapter = new BoiToan.BoiToanDataSetTableAdapters.tbl_FeatureRelationTableAdapter(); adapter.DeleteByID(id_feature, id_character); } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } cb_DacDiem_SelectedIndexChanged(cb_DacDiem, new EventArgs()); } } IV.4 Đánh giá chương trình a) Ưu điểm : Cách sử dụng hoàn toàn đơn giản, dễ hiểu. Chương trình đã cơ bản xử lý được tình huống “2 hoặc nhiều đặc điểm trên 1 khuôn mặt lại chỉ ra những tính cách giống hệt nhau và đặc biệt là trái ngược nhau”. Các luật trong cơ sở trí thức là khá lớn và ràng buộc được xây dựng chặt chẽ. Cơ sở tri thức được xây dựng đảm bảo cho việc xử lý cập nhập thông tin thuận tiện. b) Hạn chế : Giao diện chương trình chưa thật đặc sắc, chưa thật thân thiện với người dùng (ép người dùng lựa chọn những đặc điểm thông qua ComboBox). Chương trình mới chỉ đưa ra các phỏng đoán thông qua ngũ quan trên khuôn mặt chứ chưa bao quát được những đặc điểm khác như nốt ruồi, khóe miệng hay như lưỡng quyền (gò má)... Ngoài ra, hệ thống chưa có cơ sở dữ liệu về hình ảnh giúp cho người dùng có thể hình dung ra những đặc điểm trên khuôn mặt một cách rõ nét. c) Hướng phát triển : Tăng tính thân thiện của giao diện bằng việc cho phép người dùng chủ động hơn trong việc đưa vào các dữ liệu. Thu thập và xử lý thêm các đặc điểm khác ngoài ngũ quan đã có sẵn như nốt ruồi, lưỡng quyền, lông mày… Xây dựng thêm cơ sở tri thức về hình ảnh minh họa cụ thể những đặc điểm trên khuôn mặt con người. KẾT LUẬN ***oOo*** Sự kết hợp giữa cái cổ xưa “Nhân tướng học” và khái niệm hiện đại mới mẻ “Hệ chuyên gia” sẽ tạo ra một công cụ hữu ích phục vụ đắc lực cho con người trong việc “tri kỷ, tri bỉ”. Từ đó, mối quan hệ giữa người với người sẽ được tăng cường, phát triển và duy trì hài hòa. Với sự giúp đỡ của các thầy cô trong khoa Công Nghệ Thông Tin trường Đại Học Hàng Hải, đặc biệt là sự chỉ bảo cặn kẽ của thầy Nguyễn Trọng Đức, trên cơ sở những kiến thức có được trong quá trình học tập và thời gian nghiên cứu vừa qua em đã hoàn thành luận văn tốt nghiệp của mình đúng tiến độ. Một lần nữa em xin chân thành cám ơn các bạn, quý thầy cô đặc biệt là thầy Nguyễn Trọng Đức đã tận tình chỉ bảo, giúp đỡ để em hoàn thành đề tài này. Tài liệu tham khảo: Nguyễn Thanh Thuỷ, Hệ chuyên gia, NXB Giáo dục Nguyễn Thanh Thủy, Trí tuệ nhân tạo, NXB Khoa học và kỹ thuật. Đậu Quang Tuấn, Tự học lập trình hướng đối tượng & lập trình cơ sở dữ liệu C#, NXB Giao thông vận tải. Phan Huy Khánh, Giáo trình hệ chuyên gia, Đại học Đà Nẵng Demente, Cá tính thể hiện trên khuôn mặt người Châu Á, NXB Từ điển Bách Khoa. Việt Chương, Vận dụng khoa Nhân tướng học trong ứng xử & quản lý, NXB Văn hoá Thông tin.

Các file đính kèm theo tài liệu này:

  • docÁP DỤNG MÔ HÌNH HỆ CHUYÊN GIA XÂY DỰNG CHƯƠNG TRÌNH ĐOÁN NHẬN TÍNH CÁCH NGƯỜI QUA ĐẶC TẢ KHUÔN MẶT.doc