Sử dụng ngôn ngữ VB để viết ch-ơng trình giải bài toán qui hoạch lồi

Một phần của tài liệu Phương pháp giải bài toán quy hoạch lồi (Trang 27)

Đầu tiên để thực hiện viết một ch-ơng trình nói chung và một ch-ơng trình nhằm giải bài toán qui hoạch lồi nói riêng bằng ngôn ngữ Visual Basic ta phải tiến hành cài đặt Visual Basic 6.0 vào máy (việc cài đặt Visual Basic độc giả có thể tham khảo trong các giáo trình về Visual Basic hoặc trên internet). Sau khi đã tiến hành cài đặt ta click vào Start -> All Programs -> MiscoSoft Visual Basic

6.0 -> MicroSoft Visual Basic 6.0 để khởi động ch-ơng trình Visual Basic 6.0.(

hình 1).

Hình 1. Khởi động ch-ơng trình Visual Basic 6.0.

Bây giờ ta có thể làm việc trực tiếp thông qua giao diện chính và các công cụ đã đ-ợc tích hợp sẵn của Visual Basic 6.0.

D-ới đây là giao diện làm việc của Visual Basic, đ-ợc gọi là IDE (hình 2). IDE là tên viết tắt của môi tr-ờng phát triển tích hợp (Inegreated Development Enviroment), là nơi tạo ra các ch-ơng trình của VB.

Hình 2. Giao diện làm việc của Visual Basic.

IDE là nơi tập trung các menu, thanh công cụ và cửa sổ để tạo ra ch-ơng trình. Mỗi phần của IDE có các tính năng ảnh h-ởng đến hoạt động lập trình khác nhau. Thanh menu cho phép bạn tác động cũng nh- quản lí trên toàn bộ ứng dụng. Thanh công cụ cho phép truy cập các chức năng của thanh menu qua các nút trên thanh công cụ.

Sau khi tiến hành các thao tác cần thiết tác giả đã xây dựng đ-ợc một ch-ơng trình giải bài toán bằng thuật toán Frank- Wolfe thông qua ngôn ngữ lập trình Visual Basic. Trong ch-ơng trình tác giả viết hệ thống gồm 4 form chính: frmAbout, frmQuiHoachLoi, mdiMain, frmAboutFrankWolfe.

Trong đó frmQuiHoachLoi là form hiển thị giao diện chính của ch-ơng trình (hình 3).

Hình 3. Giao diện chính của ch-ơng trình.

frmAbout là form giới thiệu về ch-ơng trình (hình 4).

Hình 4. Giới thiệu về ch-ơng trình.

mdiMain (hình 5) là một form chứa hai menu con: menu “bài toán qui hoạch lồi”

Hình 5. mdiMain

và menu “hệ thống” gồm form giới thiệu ch-ơng trình (hình 4) và nút điều khiển tắt để thoát ch-ơng trình giải bài toán qui hoạch lồi.

Và cuối cùng là frmAboutFrankWolfe là form giới thiệu Thuật toán Frank- Wolfe (hình 6).

Hình 6. Giới thiệu Thuật toán Frank-Wolfe.

Vì giới hạn về số l-ợng trang nên tác giả không thể đ-a hết các đoạn code của ch-ơng trình vào luận văn, sau đây là một đoạn code thể hiện thuật toán Frank-Wolfe để giải bài toán qui hoạch lồi.

Đoạn code thể hiện thuật toán Frank-Wolfe:

Private Sub FrankWolfe() Dim i, solan As Integer Dim Fx, Fy As Double Dim sStr As String Dim bFlag As Boolean

Dim xmin, ymin, fmin As Double Me.lstKetQua.Clear

Me.lstKetQua.AddItem ("0. F'x(z) = " + Trim(GetFx)) Me.lstKetQua.AddItem (" F'y(z) = " + Trim(GetFy)) i = 0

solan = 0 Do While True i = i + 1

Me.lstKetQua.AddItem ("")

sStr = Trim(Str(i)) + ". x(" + Trim(Str(i - 1)) + ") = " + Trim(Format(x(i - 1), "##0.##0")) + ", y(" + Trim(Str(i - 1)) + ") = " + Trim(Format(y(i - 1),

"##0.##0"))

Me.lstKetQua.AddItem (sStr) Fx = Fx_z0(x(i - 1))

Fy = Fy_z0(y(i - 1))

sStr = " F'x(z" + Trim(Str(i - 1)) + ") = " + Trim(Format(Fx, "##0.##0")) sStr = sStr + ", F'y(z" + Trim(Str(i - 1)) + ") = " + Trim(Format(Fy, "##0.##0"))

Me.lstKetQua.AddItem (sStr)

sStr = " Giải bài toán quy hoạch tuyến tính:" Me.lstKetQua.AddItem (sStr)

sStr = " min{<F'(z" + Trim(Str(i - 1)) + "),z>} = min{" + Trim(GetTDC(Fx, Fy)) + "}"

Me.lstKetQua.AddItem (sStr) 'Tim nghiem cua bai toan QHTT

Call TimNghiem(a1, b1, c1, a2, b2, c2) bFlag = False

If (KiemTraPA(x0, y0)) Then bFlag = True

xmin = x0 ymin = y0

fmin = Fx * x0 + Fy * y0 End If

Call TimNghiem(a1, b1, c1, a3, b3, c3) If (KiemTraPA(x0, y0)) Then

If (Not bFlag) Then bFlag = True xmin = x0 ymin = y0

fmin = Fx * x0 + Fy * y0 Else

If (fmin > Fx * x0 + Fy * y0) Then xmin = x0 ymin = y0 fmin = Fx * x0 + Fy * y0 End If End If End If Call TimNghiem(a1, b1, c1, 1, 0, 0) If (KiemTraPA(x0, y0)) Then

If (Not bFlag) Then bFlag = True xmin = x0 ymin = y0

fmin = Fx * x0 + Fy * y0 Else

If (fmin > Fx * x0 + Fy * y0) Then xmin = x0 ymin = y0 fmin = Fx * x0 + Fy * y0 End If End If End If Call TimNghiem(a1, b1, c1, 0, 1, 0) If (KiemTraPA(x0, y0)) Then

If (Not bFlag) Then bFlag = True xmin = x0 ymin = y0

fmin = Fx * x0 + Fy * y0 Else

If (fmin > Fx * x0 + Fy * y0) Then xmin = x0 ymin = y0 fmin = Fx * x0 + Fy * y0 End If End If End If

Call TimNghiem(a2, b2, c2, a3, b3, c3) If (KiemTraPA(x0, y0)) Then

If (Not bFlag) Then bFlag = True xmin = x0 ymin = y0

fmin = Fx * x0 + Fy * y0 Else

xmin = x0 ymin = y0 fmin = Fx * x0 + Fy * y0 End If End If End If Call TimNghiem(a2, b2, c2, 1, 0, 0) If (KiemTraPA(x0, y0)) Then

If (Not bFlag) Then bFlag = True xmin = x0 ymin = y0

fmin = Fx * x0 + Fy * y0 Else

If (fmin > Fx * x0 + Fy * y0) Then xmin = x0 ymin = y0 fmin = Fx * x0 + Fy * y0 End If End If End If Call TimNghiem(a2, b2, c2, 0, 1, 0) If (KiemTraPA(x0, y0)) Then

If (Not bFlag) Then bFlag = True xmin = x0 ymin = y0

fmin = Fx * x0 + Fy * y0 Else

If (fmin > Fx * x0 + Fy * y0) Then xmin = x0

ymin = y0 fmin = Fx * x0 + Fy * y0 End If End If End If Call TimNghiem(a3, b3, c3, 1, 0, 0) If (KiemTraPA(x0, y0)) Then

If (Not bFlag) Then bFlag = True xmin = x0 ymin = y0

fmin = Fx * x0 + Fy * y0 Else

If (fmin > Fx * x0 + Fy * y0) Then xmin = x0 ymin = y0 fmin = Fx * x0 + Fy * y0 End If End If End If Call TimNghiem(a3, b3, c3, 0, 1, 0) If (KiemTraPA(x0, y0)) Then

If (Not bFlag) Then bFlag = True xmin = x0 ymin = y0

fmin = Fx * x0 + Fy * y0 Else

If (fmin > Fx * x0 + Fy * y0) Then xmin = x0

fmin = Fx * x0 + Fy * y0 End If

End If End If

Call TimNghiem(1, 0, 0, 0, 1, 0) If (KiemTraPA(x0, y0)) Then If (Not bFlag) Then

bFlag = True xmin = x0 ymin = y0

fmin = Fx * x0 + Fy * y0 Else

If (fmin > Fx * x0 + Fy * y0) Then xmin = x0 ymin = y0 fmin = Fx * x0 + Fy * y0 End If End If End If If (bFlag) Then

Me.lstKetQua.AddItem (" Có nghiệm là: z" + Trim(Str(i - 1)) + "' = (x, y) = (" + Trim(Format(xmin, "##0.##0")) + ", " + Trim(Format(ymin, "##0.##0")) + ")")

Else

Me.lstKetQua.AddItem ("Bài toán QHTT trên không có nghiệm!") Exit Sub

End If

Me.lstKetQua.AddItem ("")

Me.lstKetQua.AddItem (" Do <F'(z" + Trim(Str(i - 1)) + "),z" + Trim(Str(i - 1)) + "' -z" + Trim(Str(i - 1)) + "> = " + Trim(Format(Fx * (xmin - x(i - 1)) + Fy * (ymin - y(i - 1)), "##0.##0")) + " >= 0 ")

Me.lstKetQua.AddItem (" PATU là: (x, y) = (" + Trim(Format(x(i - 1), "##0.##0")) + ", " + Trim(Format(y(i - 1), "##0.##0")) + ")")

Me.lstKetQua.AddItem (" Với giá trị HMT Fmin = " + Trim(Format(TinhHam(x(i - 1), y(i - 1)), "##0.##0")))

Me.lbKetQua.Caption = "Nghiệm là: (" + Trim(Format(x(i - 1), "##0.##0")) + ", " + Trim(Format(y(i - 1), "##0.##0")) + ")"

GoTo Thoat End If

If (solan >= Val(Me.txtSoLanLap.Text)) Then

Me.lstKetQua.AddItem (" Do số nghiệm chọn là " + Trim(Me.txtSoLanLap.Text))

Me.lstKetQua.AddItem (" PATU gần đúng là: (x, y) = (" + Trim(Format(x(i - 1), "##0.##0")) + ", " + Trim(Format(y(i - 1), "##0.##0")) + ")")

Me.lstKetQua.AddItem (" Với giá trị HMT F = " + Trim(Format(TinhHam(x(i - 1), y(i - 1)), "##0.##0")))

Me.lbKetQua.Caption = "Nghiệm gần đúng là: (" + Trim(Format(x(i - 1), "##0.##0")) + ", " + Trim(Format(y(i - 1), "##0.##0")) + ")"

GoTo Thoat End If

Me.lstKetQua.AddItem (" Do <F'(z" + Trim(Str(i - 1)) + "),z" + Trim(Str(i - 1)) + "' -z" + Trim(Str(i - 1)) + "> = " + Trim(Format(Fx * (xmin - x(i - 1)) + Fy * (ymin - y(i - 1)), "##0.##0")) + " < 0 ")

Me.lstKetQua.AddItem (" Giải bài toán một biến theo b") ax = x(i - 1)

bx = xmin - x(i - 1) ay = y(i - 1)

by = ymin - y(i - 1)

b = C1X * bx + 2 * C2X * ax * bx + C1Y * by + 2 * C2Y * ay * by a = C2X * bx * bx + C2Y * by * by

Me.lstKetQua.AddItem (" " + HamAlpha(a, b, c)) Dim nghiem, min As Double

If (a <> 0) Then nghiem = -b / 2 / a

If (nghiem >= 0) And (nghiem <= 1) Then x(i) = ax + nghiem * bx y(i) = ay + nghiem * by Else nghiem = 0 If (a * 0 * 0 + b * 0 + c > a * 1 * 1 + b * 1 + c) Then nghiem = 1 x(i) = ax + nghiem * bx y(i) = ay + nghiem * by End If Else nghiem = 0 If (a * 0 * 0 + b * 0 + c > a * 1 * 1 + b * 1 + c) Then nghiem = 1 x(i) = ax + nghiem * bx y(i) = ay + nghiem * by End If

Me.lstKetQua.AddItem (" Có nghiệm là b = " + Trim(Format(nghiem, "##0.#0"))) Me.lstKetQua.AddItem ("") solan = solan + 1 Loop Thoat: End Sub

Sau khi đã xây dựng đ-ợc ch-ơng trình giải bài toán qui hoạch lồi bằng ngôn ngữ Visual Basic, để bạn đọc có thể sử dụng phần mềm này tác giả đã thực hiện đóng gói ch-ơng trình thành một Setup. Sau khi copy th- mục Setup về máy

và thực hiện cài đặt phần mềm, các bạn đã có thể giải các bài toán qui hoạch lồi trên máy tính của mình thông qua phần mềm một cách nhanh chóng và chính xác.

Tác giả đặt tên cho phần mềm giải bài toán qui hoạch lồi này là –Qui

Hoạch Lồi“.

2.3. ứng dụng của phần mềm –Qui Hoạch Lồi– 2.3.1.Hướng dẫn c¯i đặt phần mềm –Qui Hoạch Lồi–

Sau khi tải bộ cài của phần mềm về máy (hoặc cài trực tiếp từ đĩa) các bạn thực hiện cài đặt ch-ơng trình theo các b-ớc nh- sau (xem hình).

B-ớc 1. Click vào biểu tượng “setup” trong bộ c¯i đ± t°i về m²y.

B-ớc 2. Click v¯o nút “ok” (hình 7).

Hình 7.

B-ớc 3. Click v¯o biểu tượng “máy tính” (hình 8).

B-ớc 4. Click v¯o nút “Continue” (hình 9).

Hình 9.

B-ớc 5. Click vào nút “Yes” (hình 10).

Hình 10.

B-ớc 6. Chờ dữ liệu chạy trong giây lát. Sau khi hiện ra thông báo (hình 11), click v¯o nút “Ok”.

Qu² trình c¯i đặt phần mềm “Qui Ho³ch Lồi” v¯o m²y vi tính của b³n đ± hoàn thành. Và cuối cùng bạn vào Start -> Programs-> LTTU-> LTTU để chạy ch-ơng trình giải bài toán qui hoạch lồi.

2.3.2. Một số nút lệnh trong ch-ơng trình

Done: Thực hiện ch-ơng trình. Refresh: Làm sạch ch-ơng trình.

About: Giới thiệu về thuật toán Frank-Wofle. Khi bạn click vào nút này sẽ

hiện ra form giới thiệu về thuật toán Frank-Wofle (hình 6).

LoadFile: Mở các file đã đ-ợc l-u trong hệ thống. SaveFile: L-u lại file vừa nhập.

Close: đóng ch-ơng trình.

2.3.3. Ví dụ minh họa

Giải bài toán qui hoạch lồi sau

minfx xy zx yM )

, ( |

Với điều kiện:                     . ,y x y x y x y x

Lấy ph-ơng án xuất phát (x0, y0) = (4, 1).

Trên giao diện chính của phần mềm bạn thực hiện nhập lần l-ợt hàm mục tiêu, các điều kiện ràng buộc của bài toán và nhập số nghiệm (hình 12).

Hình 12. Nhập giả thiết bài toán.

Sau đó click vào nút done để thực hiện giải bài toán. Kết quả sẽ đ-ợc nh- hình d-ới (hình 13).

Hình 13. Kết quả của bài toán.

ở bên cửa sổ kết quả sẽ cho ta thấy tóm tắt về các b-ớc giải và nghiệm của bài toán cần tìm.

KếT LUậN

Kết quả của luận văn bao gồm các nội dung sau

1) Hệ thống đ-ợc các kiến thức cơ bản về tập lồi, hàm lồi và bài toán qui hoạch lồi, phục vụ cho nghiên cứu.

2) Viết ch-ơng trình thuật toán Frank – Wolfe giải bài toán qui hoạch lồi, bằng ngôn ngữ Visual Basic 6.0.

3) Ch-ơng trình có tính mở (nhập dữ liệu từ bàn phím), đã đóng gói, chạy trên đĩa CD, tiện sử dụng cho mọi đối t-ợng sinh viên.

4) Thể hiện chạy thử bằng số, cho kết quả khả thi. Vấn đề cần tiếp tục nghiên cứu:

Ngoài việc tiếp tục nâng cao và hoàn thiện ch-ơng trình giải bài toán qui hoạch lồi bằng thuật toán Frank-Wolfe, trong h-ớng tới, tác giả sẽ cố gắng xây dựng ch-ơng trình giải bài toán qui hoạch lồi bằng thuật toán Rosen.

Tuy nhiên ch-ơng trình vẫn còn nhiều nh-ợc điểm, thiếu sót cần đ-ợc hoàn thiện trong thời gian tới. Em rất mong nhận đ-ợc sự góp ý của các thầy cô và các bạn quan tâm đến vấn đề này.

Tài liệu tham khảo

[1]. Hoàng Tụy (2003), Lí thuyết tối -u, Viện toán học Việt Nam.

[2]. Nguyễn Tiến - Đặng Xuân H-ờng - Nguyễn Văn Hoài – Tr-ơng Ngọc Vân (1999), Bí quyết lập trình Visual Basic 6.0, NXB Giáo dục, Hà Nội.

[3]. Trần Xuân Sinh (2007), Bài giảng Lý thuyết tối -u, Đại học Vinh . [4]. Trần Xuân Sinh,(2003) Quy hoạch tuyến tính, NXB Đại học s- phạm Hà Nội.

[5] Tr-ơng Công Tuấn, Nguyễn Văn Long, Tự học lập trình Visual Basic 6.0, NXB Văn hoá thông tin.

Một phần của tài liệu Phương pháp giải bài toán quy hoạch lồi (Trang 27)

Tải bản đầy đủ (PDF)

(44 trang)