Ngôn ngữ lập trình FUZZY (ngôn ngữ mờ) – chương trình dịch Fuzzy 1.0


(0 comments)

Fuzzy 1.0 là một chương trình dịch và triển khai ngôn ngữ lập trình FUZZY, được thiết kế để xử lý các biến ngôn ngữ và tập mờ với các khái niệm mơ hồ như cao, thấp, trung bình, rất cao, không thấp lắm.

Chương trình Hello World

Các chương trình Fuzzy không có chương trình chính. Mã nguồn của một chương trình đơn giản nhất có thể chỉ như thế này

print “Hello World”;

Các kiểu dữ liệu cơ bản

Các kiểu dữ liệu cơ bản là int, Number, String, bool và fuzzy. Các kiểu này hầu như đều có thể gán sang nhau, ví dụ

 int i = 100;
 i += 50;
 String text = i;
 speed.high = i + 50; // speed.high is a fuzzy set

Các lệnh điều khiển

Các lệnh điều khiển while, for, if, else, break, continue, return tương tự như trong C/C++. Tuy nhiên, lệnh switch có thể sử dụng cho cả kiểu xâu kí tự (String)

switch(text) // text is a String variable
{
case "abc":
        // do something
        break;
case "def":
        // do something
        break;
}

Chồng hàm và toán tử

Tương tự như C++, các hàm và toán tử trong Fuzzy có thể được viết chồng. Ngoài ra, toán tử gán của Fuzzy có thể chỉ cần khai báo có kiểu trả về là void, kể cả khi phép gán có vai trò như một biểu thức. Các biến thành phần của cấu trúc có thể được khởi tạo khi khai báo

struct OBJECT
{
        int m_i = 50;
        String m_string = "abc";
        Number m_array[10]; //an array of Number
        void operator = (OBJECT t)
        {
                m_i = t.m_i;
                m_string = t.m_string;
                for(int i = 0; i < 10; i++)
                        m_array[i] = t.m_array[i];
        }
        OBJECT operator - ()
        {
                OBJECT obj;
                obj.m_i = -m_i;
                return obj;
        }
};

Tập mờ và term mờ

Các tập mờ rời rạc cần được khai báo bên trong term mờ rời rạc. Ví dụ dưới đây chỉ ra một term mờ có ba tập mờ, mỗi tập có năm phần tử, mỗi phần tử là một cặp grade/value

term TEMPERATURE(5)
{
        fuzzy discrete low(1/100, 0.5/125, 0.25/150, 0.1/175, 0/200);
        fuzzy discrete medium(0.25/100, 0.5/125, 1/150, 0.5/175, 0.25/200);
        fuzzy discrete high(0/100, 0/125, 0.25/150, 0.75/175, 1/200);
};

Đặt dữ liệu vào term mờ

Từ khóa put được sử dụng để đặt các giá trị và giá trị thành viên cho term mờ

TEMPERATURE temperature;
put temperature := (0/100, 0/125, 0.5/150, 0.25/175, 0/200);

Áp dụng các luật mờ

Các toán tử AND, OR, NOT, VERY, LITTLE, REALLY có thể được sử dụng đệ quy

rule temperature.medium AND pressure.medium OR weather.bad OR traffic.bad => speed.low;

rule VERY temperature.high AND pressure.low OR NOT VERY temperature.high AND
        pressure.medium AND NOT VERY traffic.bad => speed.high;

rule temperature.low AND pressure.high AND REALLY weather.normal OR
    traffic.normal => speed.medium;

rule (temperature.medium OR pressure.low) AND weather.good OR pressure.low AND
    traffic.good => speed.high;

rule REALLY temperature.medium AND LITTLE pressure.high AND VERY VERY
    weather.good => speed.high;

In ra các tập mờ và term mờ

Lệnh dưới đây in ra giá trị đã giải mờ của một term mờ

print speed;

Nếu muốn in dữ liệu mờ, bạn sử dụng lệnh prints

prints speed;

Làm rõ, giải mờ

Phương pháp giải mờ sử dụng trong fuzzy 1.0 là phương pháp trọng tâm (centroid)

Defuzz(pressure);

Đặt lại các tập mờ và term mờ

Để đặt lại dữ liệu của tập mờ về 0 cho mỗi lần áp dụng các quy tắc mới hay dữ liệu đọc vào thay đổi, bạn sử dụng hàm ZeroFuzz như sau

ZeroFuzz(temperature);

Chuyển dữ liệu của tập mờ ra mảng

Khi cần xử lý kết quả, bạn có thể chuyển dữ liệu của tập mờ ra một mảng. Trong fuzzy có một cấu trúc xây dựng sẵn là FuzzyPair. Cấu trúc này có hai thành phần kiểu Number là m_grade và m_value. Để chuyển dữ liệu, bạn khai báo một mảng các cấu trúc FuzzyPair có cỡ mảng đủ để chứa dữ liệu, rồi sử dụng hàm FuzzyToArray như sau

FuzzyPair array[8];
FuzzyToArray(speed, array);

Mã dưới đây để xem kết quả

for(int i = 0; i < 8; i++)
    print array[i].m_grade, " ", array[i].m_value;

Tập mờ liên tục

Có trường hợp các tập mờ được cho một miền xác định và một giá trị trung tâm. Khi đó bạn sử dụng khai báo term mờ kiểu miền xác định, như sau

term TEMPERATURE(100, 200)
{
    fuzzy low = 100;
    fuzzy medium = 150;
    fuzzy high = 200;
};

In ra file

Các lệnh in print và prints có thể được chuyển hướng dữ liệu ra file. Token > ghi dữ liệu vào file, còn token >> thêm dữ liệu vào file

print speed > "filename.txt";
prints speed >> "filename.txt";

Thực hiện lệnh shell

Fuzzy có từ khóa system để chạy lệnh shell, chẳng hạn gọi một chương trình trong hệ thống

String command_text = "sudo makeca -f";
system command_text;

Các hàm toán học

Các hàm toán học có sẵn là sin, cos, tan, atan, ln, log10, exp, pow, sqrt, floor, round, abs, min, và max

File bao hàm

Các tệp mã nguồn bên ngoài có thể được bao hàm vào trong tệp chính, sử dụng tương tự như C/C++

#include "filename.h"

Comment

Quy định comment trong fuzzy giống như trong C/C++, sử dụng // hoặc cặp /* và */

Sử dụng

Bạn tải về tệp fuzzy-1.0.tar.xz rồi giải nén như sau

tar xf fuzzy-1.0.tar.xz

Kết quả được tệp chương trình fuzzy và tệp hướng dẫn fuzzy.1.gz

Giả sử bạn viết một chương trình với file mã nguồn là program.fuz. Để dịch và chạy chương trình, bạn thực hiện lệnh sau

./fuzzy program.fuz
Currently unrated

Comments

There are currently no comments

New Comment

required

required (not published)

optional

required


What is 8 × 1?

required