Các modul tối ưu được xây dựng ở trên được gắn vào một giao diện như hình dưới.
Hình V-1. Giao diện chương trình
Chương trình chính bây giờ chính là giao diện được tạo ra do thư viện MFC trong Visual C++ cung cấp. Tiếp theo ta chỉ việc ghép các modul tối ưu với các thư viện của MFC bằng cách “add” chúng vào cùng project đã tạo nên giao diện trên. Còn trong hàm mục tiêu và thủ tục các ràng buộc bây giờ phải gọi đến thư viện xử lí kí tự để xử lí hàm mục tiêu và các ràng buộc được người sử dụng nhập vào dưới dạng xâu. Hàm mục tiêu và các ràng buộc được cho dưới dạng kí tự trong một tệp có tên “nhapham.txt” trong thư mục gốc của chương trình. Tệp “nhapham.txt” phải có cấu trúc như sau:
- Dòng đầu ghi giá trị của n (Ví dụ: n=2)
- Dòng thứ 2 ghi n giá trị khởi tạo ban đầu cho vector x, mỗi giá trị cách nhau ít nhất một dấu cách.
- Dòng thứ 3 ghi biểu thức của hàm mục tiêu dưới dạng kí tự (Ví dụ: f(x)=(x1-2)^2+(x2-1)^2).
- Dòng tiếp theo ghi giá trị của m là số các ràng buộc đẳng thức (giống như ghi n).
- Trong m dòng tiếp theo, mỗi dòng ghi một biểu thức của ràng buộc đẳng thức (giống như ghi hàm mục tiêu).
- Dòng tiếp theo ghi giá trị của p là số các ràng buộc bất đẳng thức (giống như ghi n).
- Trong p dòng tiếp theo, mỗi dòng ghi một biểu thức của ràng buộc bất đẳng thức (giống như ghi hàm mục tiêu). Kết thúc tệp. Phần xử lí hàm được thực hiện bởi một modul xử lí kí tự riêng, trong đó có các toán tử +, -, *, /, và số mũ ^m (với m có thể là số thực), ngoài ra còn có 2 hàm lượng giác cơ bản (sin, cos) và hàm e mũ (exp). Modul này có tên “nhapham” và hàm xử lí kí tự được khai báo như sau:
double value_function(CString s,double *x)
Trong đó s chính là xâu kí tự của hàm cần phải sử lí, mảng x là tham số thứ nhất khai báo trong hàm mục tiêu, đó là các biến trạng thái.
Sau khi đọc xâu hàm mục tiêu trong tệp “nhapham.txt” gán vào s thì trong hàm mục tiêu f(x,n) thực hiện lệnh:
return value_function(s,x);
nó sẽ trả về đúng giá trị của hàm mục tiêu tại x.
Các xâu của các ràng buộc thu được trong tệp “nhapham.txt” cũng được dùng đến hàm xử lí kí tự như trên trong thủ tục constrain(…). Ví dụ với g1 là xâu của biểu thức ràng buộc bất đẳng thức thứ nhất thì ta gán như sau:
g[0] = value_function(g1,x);
ở đây dùng chỉ số 0 đối với g vì trong C++ các mảng bắt đầu từ chỉ số 0.
Để chạy chương trình thì thực hiện như sau:
Bấm “Open” để mở tệp “nhapham.txt” rồi nhập dữ liệu. Ghi và đóng tệp đó lại.
Chọn một trong bốn phương pháp tối ưu rồi bấm “Run” để chạy chương trình. Hộp time để hiển thị thời gian tính toán. Kết quả được lưu trong tệp có tên “ketquanhap2.txt” trong thư mục gốc của chương trình.
Ví dụ với bài toán tối ưu như sau: (xem [2]) Tìm min: f(x)=(x1-2)2+(x2-1)2
Các ràng buộc: h1(x)=x1-2x2+1=0 g1(x)=-x12/4-x22+1≥0 Điểm khởi tạo: x(0)=[2 2]T
Thì tệp “nhap.txt” như sau: n=2 2.0 2.0 f(x)=(x1-2)^2+(x2-1)^2 m=1 h1(x)=x1-2*x2+1 p=1 g1(x)=-(x1^2)/4-x2^2+1
Kết quả ở tệp “ketqua.txt” sẽ như sau:
(Chương trình chạy trên máy Pentium III 600 MHz) Với phương pháp Nelder Mead, sau 24 giây:
fmin=1.393402
x*=(0.822902, 0.911440)
Với phương pháp Hook Jeeves sau 35 giây: fmin=1.39346
x*=(0.822878, 0.911437)
Với phương pháp Powell sau 27 giây:
fmin=1.393460
x*=(0.822878, 0.911437)
Với phương pháp Rosenbrock sau 14 giây: fmin=1.393456
x*=(0.822880, 0.911437)