Luận văn Ứng dụng tối ưu trong kinh tế với Xpress-MP

ỨNG DỤNG TỐI ƯU TRONG KINH TẾ VỚI XPRESS-MP NGUYỄN PHƯỚC THỌ Trang nhan đề Mục lục Lời cảm ơn Lời nói đầu Ký hiệu và các quy ước Chương 1: Các bài toán tối ưu Chương 2: Ứng dụng toán ưu trong kinh tế sử dụng Chương 3: Kết luận Tài liệu tham khảo MỤC LỤC Trang MỤC LỤC .i LỜI CẢM ƠN .iii LỜI NÓI ĐẦU iv KÝ HIỆU VÀ CÁC QUY ƯỚC .vi CHƯƠNG 1. CÁC BÀI TOÁN TỐI ƯU 1 1.1 Định nghĩa .1 1.2 Các loại bài toán tối ưu 2 1.2.1 Tối ưu trong không gian hữu hạn chiều 2 1.2.2 Tối ưu trong không gian vô số chiều 3 1.3 Các bước của quá trình ra quyết định 4 1.4. Các bước của quá trình ra quyết định .5 1.4.1 Quy hoạch tuyến tính 5 1.4.2 Quy hoạch nguyên 7 1.4.3 Quy hoạch toàn phương 11 CHƯƠNG 2. ỨNG DỤNG TOÁN ƯU HÓA TRONG KINH TẾ SỬ DỤNG CHƯƠNG TRÌNH XPRESS-MP 14 2.1 Chương trình Xpress-MP 14 2.1.1 Giới thiệu 14 2.1.2 Cấu trúc của mô hình xưởng mộc và mô hình Mosel tổng quát .19 i 2.2 Ứng dụng tối ưu hóa trong kinh tế 23 Thí dụ 2.1 Bài toán lựa chọn danh mục đầu tư BT1 .23 Thí dụ 2.2 Bài toán lựa chọn danh mục đầu tư BT2 .32 Thí dụ 2.3 Bài toán lựa chọn danh mục đầu tư BT3 .41 Thí dụ 2.4 Bài toán lựa chọn danh mục đầu tư BT4 .47 KẾT LUẬN 58 TÀI LIỆU THAM KHẢO 59 ii

pdf44 trang | Chia sẻ: maiphuongtl | Lượt xem: 2023 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Luận văn Ứng dụng tối ưu trong kinh tế với Xpress-MP, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 2: ỨNG DỤNG TOÁN ƯU HÓA TRONG KINH TẾ SỬ DỤNG CHƯƠNG TRÌNH XPRESS-MP 2.1 Chương trình Xpress-MP 2.1.1 Giới thiệu Sản phẩm FICOTM XPRESS cho ta nhiều cách làm việc với mô hình và công cụ tối ưu. Xpress-MP có cấu trúc như Hình 2.1: Hình 2.1 Mô hình Xpress-MP • Ngôn ngữ cấp cao Ngôn ngữ Xpress-Mosel cho phép người dùng định nghĩa mô hình dưới dạng mô hình toán học và giải quyết chúng. Chương trình Mosel có thể được ứng dụng để giải các thuật toán trong ngôn ngữ cấp cao này, Mosel có thể được dùng độc lập hoặc thông qua môi trường Xpress-IVE, có nhiều chức năng khác, và cho giao diện đồ họa về thông tin hình ảnh. 14 Mosel dùng Xpress-Optimizer để giải các mô hình toán (quy hoạch tuyến tính, quy hoạch nguyên, và quy hoạch toàn phương, quy hoạch ngẫu nhiên và quy hoạch ràng buộc), lấy được dữ liệu tĩnh và động (thông qua ODBC) và lấy được các hàm hệ thống. Hơn nữa Mosel có thể xuất dữ liệu (nghiệm bài toán và giá trị hàm mục tiêu) ra ngoài dưới dạng tập tin. • Thư viện tích hợp Có 2 cách để nhúng mô hình toán vào ứng dụng của người dùng: - Sử dụng các ngôn ngữ lập trình (C, C++, C#, Visual Basic, Java). - Sử dụng Xpress-BCL. • Giải trực tiếp BCL: ở mức thấp nhất, BCL làm trực tiếp với Xpress- Optimizer hoặc Xpress-SLP dưới dạng thư viện. Chương trình Xpress-IVE được dùng để giải các bài toán trong luận văn này. Giao diện Xpress-IVE như Hình 2.2: Hình 2.2 Giao diện chương trình Xpress-IVE 15 xét Thí dụ 1.1 bài toán kế hoạch sản xuất của xưởng mộc có: Mô hình toán 1 2 1 2 1 2 1 2 max 5. 20. 3. 2. 160 1. 3. 200 0 0 z x x x x x x x x= + + ≤ + ≤ ≥ ≥ (2.1) Bây giờ chúng ta đưa mô hình (2.1) về mô hình Mosel để giải trên Xpress-MP Mô hình Mosel model "Thi du 1.1 bai toan ke hoach san xuat cua xuong moc" uses "mmxprs"; declarations x1: mpvar ! So luong bo co loai nho x2: mpvar ! So luong bo co loai lon muctieu:linctr end-declarations muctieu := 5*x1 + 20*x2 3*x1 + 2*x2 <= 160 1*x1 + 3*x2 <= 200 x1 >= 0 x2 >= 0 maximize(muctieu) !hien thi ket qua writeln("ham muc tieu muctieu = ", getobjval) writeln("nghiem x(1) = ", getsol(x1)) writeln("nghiem x(2) = ", getsol(x2)) end-model Đối với bài toán có số lượng biến và ràng buộc lớn thì ta thường đưa về dạng ma trận. Bài toán xưởng mộc có thể được đưa về mô hình toán ma trận 16 Dạng chính tắc: min 0 Tz c x Ax b x = ≤ ≥ Với c = (5, 20), x = (x1, x2), b = (160, 200), 3 2 1 3 A ⎛ ⎞= ⎜ ⎟⎝ ⎠ Mô hình Mosel 1: Dữ liệu được khai báo trực tiếp trong mô hình model "Thi du 1.1 bai toan ke hoach san xuat cua xuong moc" uses "mmxprs"; declarations c : array(1..2) of real ! vecto he so ham muc tieu b : array(1..2) of real ! vecto he so A : array(1..2,1..2) of real ! ma tran he so x : array(1..2) of mpvar ! vecto bien so luong bo co muctieu:linctr end-declarations c :: [5,20] b :: [160, 200] A :: [3, 2, 1, 3] muctieu := sum(j in 1..2) c(j)*x(j) forall(i in 1..2) sum(j in 1..2)A(i,j)* x(j) <= b(i) forall(j in 1..2) x(j) >= 0 maximize(muctieu) !hien thi ket qua writeln("ham muc tieu muctieu = ", getobjval) forall(j in 1..2) writeln("nghiem x(", j ,") = ", getsol(x(j))) end-model 17 Mô hình Mosel 2: Tách dữ liệu độc lập với mô hình Mosel model "Bai toan xuong moc" uses "mmxprs"; !gain access to the Xpress-Optimizer solver parameters SoDong = 2 SoCot = 2 end-parameters declarations M = 1..SoDong ! so dong N = 1..SoCot ! so cot !N = {"bo co nho","bo co lon"} c : array(N) of real ! vecto he so ham muc tieu b : array(M) of real ! vecto he so A : array(M,N) of real ! ma tran he so x : array(N) of mpvar ! vecto bien muctieu:linctr end-declarations initializations from "XuongMoc.dat" c b A end-initializations muctieu := sum(j in N) c(j)*x(j) forall(i in M) sum(j in N)A(i,j)* x(j) <= b(i) forall(j in N) x(j) >= 0 maximize(muctieu) !hien thi ket qua writeln("Doanh thu cua cong ty xuong moc: ", getobjval) forall(j in N) writeln("nghiem x(", j ,")=", getsol(x(j))) end-model 18 Mô hình Mosel đọc dữ liệu từ tập tin XuongMoc.dat. và tập tinh XuongMoc.dat như sau: c : [5 20] b : [160 200] A : [3, 2, 1, 3] Kết quả chạy các mô hình Doanh thu cua cong ty xuong moc: 1333.33 nghiem x(1)=0 nghiem x(2)=66.6667 2.1.2 Cấu trúc của mô hình xưởng mộc và mô hình Mosel tổng quát model ModelName uses "mmxprs","mmquad","mmive","mmodbc" parameters !... end-parameters declarations !.. end-declarations initializations !... end-initializations (! Phat trien mo hinh !muc tieu !cac rang buoc !) writeln("hien thi nghiem") !... writeln("hien thi muc tieu") end-model 19 • Bắt đầu mô hình Mosel Mỗi mô hinh Mosel bắt đầu với từ khóa model, và kết thúc với end-model. model ModelName … end-model • Khai báo thư viện trong Mosel uses "mmxprs","mmquad","mmive","mmodbc" mmxprs: thư viện chứa các hàm giải bài toán quy hoạch tuyến, quy hoạch nguyên. mmquad: thư viện chứa các hàm giải bài toán quy hoạch toàn phương. mmodbc: thư viện chứa các hàm kết nối đến bảng tính Excel, và database (SQL, Access). mmive: thư viện chứa các hàm vẽ đồ thị. • Khai báo khối tham số parameters !... end-parameters • Khai báo các đối tượng dùng trong mô hình declarations !.. end-declarations Nếu mô hình kết nối dữ liệu từ các tập tin khác thì sẽ dùng khối lệnh initializations !... end-initializations Dữ liệu có thể kết nối từ: - Tập tin *.dat, *.txt. - Bảng tính Exel. - SQL, Access. 20 • Định nghĩa bài toán Chuyển mô hình từ ngôn ngữ toán học sang ngôn ngữ Xpress-MP gồm có: - Hàm mục tiêu - Các ràng buộc đẳng thức và bất đẳng thức Tìm mục tiêu của bài toán: để cực đại (hoặc cực tiểu) mục tiêu chúng ta sử dụng hàm maximize (hoặc minimize) tương ứng. • Hiển thị kết quả ra màn hình: dùng lệnh writeln("nghiem bai toan"). • Xuống dòng: dùng dấu chấm phẩy ; để ngăn hai câu lệnh. • Lời chú giải: dùng ký tự ! trước dòng cần ghi chú, nếu có nhiều hơn một dòng thì ta dùng: (! Dòng 1 … Dòng N !) • Dãy và tập chỉ số M = 1..2 dãy chỉ số từ 1 đến 2, chỉ số dòng N = 1..2 dãy chỉ số từ 1 đến 2, chỉ số cột hoặc N = {"bo co nho","bo co lon"} • Mảng một chiều hoặc nhiều chiều c : array(N) of real ! vecto he so ham muc tieu b : array(M) of real ! vecto he so A : array(M,N) of real ! ma tran he so x : array(N) of mpvar ! vecto bien • Các kiểu dữ liệu cơ bản trong Mosel real: có giá trị trong khoảng (-1.7e+308, 1.7e+308), mặc định giá trị bằng 0. integer: có giá trị trong khoảng (-214783648, 2147483647), mặc định giá trị bằng 0. string: chuỗi ký tự, mặc định chuỗi ký tự trống. boolean: kiểu logic (true hoặc false), mặc định false. mpvar : biến quyết định. linctr: ràng buộc tuyến tính (dùng cho hàm mục tiêu hoặc ràng buộc). 21 Hơn nữa phầm mêm Xpress-MP có khả năng lập trình như các ngôn ngữ lập trình cao cấp khác như C, C++, C#, Visual Basic… • Cấu trúc lựa chọn if … then … [elif … then .. ] [else …] end-if case truonghop_0 of truonghop_1: … [ truongho_2: … ] [ else … ] end-case Nếu thực hiện nhiều dòng lệnh thì ta đặt chúng trong khối: do … end-do • Vòng lặp Vòng lặp forall: forall(tapchiso) donglenh tapchiso: tập chỉ số N Vòng lặp while: while(bt_logic) donglenh bt_logic: trả về kết quả true hoặc false Vòng lặp repeat: repeat donglenh until(bt_logic) • Lệnh break và next break: được dùng để thoát khỏi vòng lặp. next: được dùng để nhảy tới vòng lặp tiếp theo. • Tổng các phần tử sum(tapchiso)… Thí dụ: forall(i in M)sum(j in N)A(i,j)* x(j) <= b(i) 22 2.2 Ứng dụng tối ưu hóa trong kinh tế Toán tối ưu được phát triển và ứng dụng mạnh trong nhiều lĩnh vực, đặc biệt được phát triển mạnh hơn cả trong lĩnh vực kinh tế, kinh doanh, quản lý, sản xuất, xây dựng, … Một ứng dụng thực tế lý thuyết tối ưu được chúng tôi chọn là bài toán lựa chọn danh mục đầu tư, đây là bài toán rất được quan tâm ở thời điểm này. Và chúng tôi sẽ giới thiệu cách sử dụng chương trình Xpress-IVE chi tiết để giải một bài toán tối ưu. Bài toán lựa chọn danh mục đầu tư có nhiều dạng, sau đây ta sẽ xét một số dạng cơ bản: Thí dụ 2.1: xét bài toán lựa chọn danh mục đầu tư (BT1) Một người đầu tư muốn vào 10 loại chứng khoán khác nhau, Anh ta tính thu lại nguồn đầu tư sau 1 năm. Bảng các loại cổ phiếu như sau: STT Lĩnh vực Quốc gia Rủi ro Lợi nhuận mong đợi 1 Tài chính Canada N 5 2 Phần cứng Mỹ R 17 3 Nhạc kịch Mỹ R 26 4 Viễn thông Mỹ R 12 5 Rượu bia Anh N 8 6 Xây dựng Pháp N 9 7 Xe hơi Đức N 7 8 Ngân hàng Thụy sĩ N 6 9 Phần mềm Ấn độ R 31 10 Điện tử Nhật R 21 Bảng 2.1 Bảng các loại cổ phiếu 23 và có một số ràng buộc sau: - Đầu tư vào mỗi loại cổ phiếu nhiều nhất không quá 30% số tiền đầu tư ban đầu. - Mong muốn đầu tư 50% vào Bắc Mỹ. - Và nhiều nhất 3 loại cổ phiếu có mức độ rủi ro cao. Đầu tư như thế nào để có thu nhập mong đợi là cao nhất? Mô hình toán: Gọi CP là tập các cổ phiếu trong danh mục đầu tư. CPRuiRo tập các cổ phiếu có độ rủi ro cao trong danh mục đầu tư. Gọi biến voni là tỉ lệ tiền đầu tư vào cổ phiếu i, i CP∈ - Đầu tư vào mỗi loại cổ phiếu nhiều nhất không quá 30% số tiền đầu tư ban đầu: , 0 0,3ii CP von∀ ∈ ≤ ≤ - Tổng tỉ lệ tiền đầu tư bằng 100%: 1i i CP von ∈ =∑ - Tổng tỉ lệ tiền đầu tư vào cổ phiếu có độ rủi ro không quá 1/3 tổng số tiền đầu tư ban đầu: 1 3ii CPRuiRo von ∈ ≤∑ Đầu tư ít nhất 50% ở các nước Bắc Mỹ: Gọi CPBacMy tập các cổ phiếu ở các nước Bắc Mỹ 0,5i i CPBacMy von ∈ ≥∑ Gọi CoTuci là thu nhập mong đợi của cổ phiếu i sau 1 năm đầu tư. Mục tiêu của nhà đầu tư là thu nhập mong đợi cao nhất từ đầu tư trên tất cả các cổ phiếu, có dạng: max .i i i CP CoTuc von ∈ ∑ 24 Mô hình hoàn chỉnh: max . 1 3 0,5 ,0 0,3 i i i CP i i CPRuiRo i i CPBacMy i CoTuc von von von i CP von ∈ ∈ ∈ ≤ ≥ ∀ ∈ ≤ ≤ ∑ ∑ ∑ Mô hình Mosel: model "Toi uu Danh Muc Dau Tu voi LP" uses "mmxprs"; declarations CP = 1..10 ! Tap cac co phieu CPRuiRo = {2,3,4,9,10} ! Tap cac co phieu co do rui ro cao CPBacMy = {1,2,3,4} ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung von: array(CP) of mpvar ! ti le von dau tu vao co phieu end-declarations CoTuc:: [5,17,26,12,8,9,7,6,31,21] ! muc tieu: tong loi nhuan thu duoc TongCoTuc:= sum(i in CP) CoTuc(i)*von(i) ! gioi han dau tu vao co phieu co rui ro cao sum(i in CPRuiRo) von(i) <= 1/3 ! ti le von dau tu vao co phieu o Bac My sum(i in CPBacMy) von(i) >= 0.5 ! tong so von dau tu sum(i in CP) von(i) = 1 ! chan tren moi co phieu forall(i in CP) von(i) <= 0.3 ! Solve the problem maximize(TongCoTuc) ! Xuat ket qua writeln("Tong thu nhap mong doi: ", getobjval) 25 forall(i in CP) writeln("Ti le von dau tu vao co phieu ", i, " = ", getsol(von(i))*100, "%") end-model Kết quả: Giải mô hình ta được kết quả: Tong thu nhap mong doi: 14.0667 Ti le von dau tu vao co phieu 1 = 30% Ti le von dau tu vao co phieu 2 = 0% Ti le von dau tu vao co phieu 3 = 20% Ti le von dau tu vao co phieu 4 = 0% Ti le von dau tu vao co phieu 5 = 6.66667% Ti le von dau tu vao co phieu 6 = 30% Ti le von dau tu vao co phieu 7 = 0% Ti le von dau tu vao co phieu 8 = 0% Ti le von dau tu vao co phieu 9 = 13.3333% Ti le von dau tu vao co phieu 10 = 0% Mô hình Mosel và kết quả của bài toán BT1 trên Xpress-IVE như Hình 2.3: 26 Hình 2.3 Cửa sổ soạn thảo và hiển thị kết quả chương trình Xpress-IVE. 27 Chi tiết về nghiệm của bài toán BT1 như Hình 2.4: Hình 2.4 Thông tin chi tiết nghiệm bài toán. 28 Bây giờ chúng ta thay dãy chỉ số bởi tập các chuỗi ký tự Trong mô hình Mosel của bài toán BT1, chúng ta thay các khai báo sau: CP = 1..10 ! Tap cac co phieu CPRuiRo = {2,3,4,9,10} ! Tap cac co phieu co do rui ro cao CPBacMy = {1,2,3,4} ! Tap cac co phieu o Bac My Bởi CP = {"Tai chinh","Phan cung","Nhac kich","Vien thong","Ruou bia","Xay dung","Xe hoi","Ngan hang","Phan mem","Ðien tu"} CPRuiRo={"Phan cung","Nhac kich","Vien thong","Phan mem","Ðien tu"} CPBacMy={"Tai chinh","Phan cung","Nhac kich","Vien thong"} CoTuc:: (["Tai chinh","Phan cung","Nhac kich","Vien thong","Ruou bia","Xay dung","Xe hoi","Ngan hang","Phan mem","Ðien tu"])[5,17,26,12,8,9,7,6,31,21] Kết quả Tong thu nhap mong doi: 14.0667 Ti le von dau tu vao co phieu Ngan hang = 0% Ti le von dau tu vao co phieu Nhac kich = 20% Ti le von dau tu vao co phieu Phan cung = 0% Ti le von dau tu vao co phieu Phan mem = 13.3333% Ti le von dau tu vao co phieu Ruou bia = 6.66667% Ti le von dau tu vao co phieu Tai chinh = 30% Ti le von dau tu vao co phieu Vien thong = 0% Ti le von dau tu vao co phieu Xay dung = 30% Ti le von dau tu vao co phieu Xe hoi = 0% Ti le von dau tu vao co phieu Ðien tu = 0% Làm việc với dữ liệu Trong mô hình trên, chúng ta thấy các số liệu nằm trong cùng mô hình toán. Bây giờ ta muốn tách rời các số liệu này nằm trong một tập tin khác để dễ quản lý và làm cho mô hình Mosel đơn giản và linh động hơn. 29 Dùng tham số Khai báo hằng số và gán giá trị parameters DATAFILE = "DanhMucLPdata.dat" ! File with problem data OUTFILE = "KetQuaDanhMucLPdata.dat" ! Output file MAXCPRuiRo = 1/3 ! Max. dau tu vao co phieu rui ro cao MAXVon = 0.3 ! Max. dau tu tren moi co phieu MINCPBacMy = 0.5 ! Min. gia tri dau tu vao Bac My end-parameters Khai báo các biến, tham số declarations CP : set of string ! Tap cac co phieu CPRuiRo : set of string ! Tap cac co phieu co do rui ro cao CPBacMy : set of string ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung von: array(CP) of mpvar ! ti le von dau tu vao co phieu end-declarations Kết nối dữ liệu từ tập tin initializations from DATAFILE CPRuiRo CPBacMy CoTuc end-initializations Tập tin DanhMucLPdata.dat CPRuiRo : ["Phan cung" "Nhac kich" "Vien thong" "Phan mem" "Ðien tu"] CPBacMy : ["Tai chinh" "Phan cung" "Nhac kich" "Vien thong"] CoTuc: [("Tai chinh") 5 ("Phan cung") 17 ("Nhac kich") 26 ("Vien thong") 12 ("Ruou bia") 8 ("Xay dung") 9 ("Xe hoi") 7 ("Ngan hang") 6 ("Phan mem") 31 ("Ðien tu") 21] 30 Mô hình Mosel hoàn chỉnh model "Toi uu Danh Muc Dau Tu voi LP" uses "mmxprs"; parameters DATAFILE = "DanhMucLPdata.dat" ! File with problem data OUTFILE = "KetQuaDanhMucLPdata.dat" ! Output file MAXCPRuiRo = 1/3 ! Max. dau tu vao co phieu rui ro cao MAXVon = 0.3 ! Max. dau tu tren moi co phieu MINCPBacMy = 0.5 ! Min. gia tri dau tu vao Bac My end-parameters declarations CP : set of string ! Tap cac co phieu CPRuiRo : set of string ! Tap cac co phieu co do rui ro cao CPBacMy : set of string ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung von: array(CP) of mpvar ! ti le von dau tu vao co phieu end-declarations initializations from DATAFILE CPRuiRo CPBacMy CoTuc end-initializations ! muc tieu: tong loi nhuan thu duoc TongCoTuc:= sum(i in CP) CoTuc(i)*von(i) ! gioi han dau tu vao co phieu co rui ro cao sum(i in CPRuiRo) von(i) <= MAXCPRuiRo ! ti le von dau tu vao co phieu o Bac My sum(i in CPBacMy) von(i) >= MINCPBacMy ! tong so von dau tu sum(i in CP) von(i) = 1 ! chan tren moi co phieu forall(i in CP) von(i) <= MAXVon ! Solve the problem maximize(TongCoTuc) ! Xuat ket qua ra file .dat 31 fopen(OUTFILE, F_OUTPUT) writeln("Tong thu nhap mong doi: ", getobjval) forall(i in CP) writeln("Ti le von dau tu vao co phieu ", i, " = ", getsol(von(i))*100, "%") fclose(F_OUTPUT) end-model Kết quả chạy chương trình Xuất ra tập tin có tên KetQuaDanhMucLPdata.dat và có Tong thu nhap mong doi: 14.0667 Ti le von dau tu vao co phieu Tai chinh = 30.000% Ti le von dau tu vao co phieu Phan cung = 0.000% Ti le von dau tu vao co phieu Nhac kich = 20.000% Ti le von dau tu vao co phieu Vien thong = 0.000% Ti le von dau tu vao co phieu Ruou bia = 6.667% Ti le von dau tu vao co phieu Xay dung = 30.000% Ti le von dau tu vao co phieu Xe hoi = 0.000% Ti le von dau tu vao co phieu Ngan hang = 0.000% Ti le von dau tu vao co phieu Phan mem = 13.333% Ti le von dau tu vao co phieu Ðien tu = 0.000% Giải bài toán tối ưu với vòng lặp, Vẽ đồ thị người dùng Thí dụ 2.2: xét thí dụ 2.1 bài toán danh mục đầu tư (BT1), Người đầu tư tính toán phương sai từ thu nhập mong đợi trên cổ phiếu được Bảng 2.2. Khi đó chúng ta được bài toán lựa chọn danh mục đầu tư (BT2). 32 Số Lĩnh vực Phương sai 1 Tài chính 0.1 2 Phần cứng 19 3 Nhạc kịch 28 4 Viễn thông 22 5 Rượu bia 4 6 Xây dựng 3.5 7 Xe hơi 5 8 Ngân hàng 0.5 9 Phần mềm 25 10 Điện tử 16 Bảng 2.2 Bảng phương sai. với dữ liệu được thêm vào, người đầu tư quyết định chạy mô hình quy hoạch tuyến tính với các giới hạn rủi ro khác nhau trên danh mục đầu của cổ phiếu có mức rủ ro cao và cho kết quả bằng đồ thị, đường kết quả cho tổng thu nhập mong đợi. phương sai là đại lượng chỉ rủi ro của cổ phiếu: - Định nghĩa mô hình thay đổi theo tham số rủi ro. - Với mỗi giá trị tham số rủi ro: + Định nghĩa lại ràng buộc giới hạn phần trăm rủi ro. + Giải tìm kết quả bài toán. + Nếu bài toán là có nghiệm: lưu nghiệm. - Vẽ đồ thị. 33 Khai báo biến lưu nghiệm thu nhập mong đợi và phương sai declarations NghiemCoTuc: array(range) of real ! gia tri nghiem (tong thu nhap mong doi ) NghiemPhuongsai: array(range) of real ! Gia tri nghiem (trung binh phuong sai) TongCoTuc, RuiRoCao: linctr end-declarations giải bài toán theo vòng lặp là 20 ct:=0 forall(r in 0..20) do ! Limit the percentage of high-risk values RuiRoCao:= sum(i in CPRuiRo) von(i) <= r/20 maximize(TongCoTuc) ! Solve the problem if (getprobstat = XPRS_OPT) then ! Save the optimal solution value ct+=1 NghiemCoTuc(ct):= getobjval NghiemPhuongsai(ct):= getsol(sum(i in CP) PhuongSai(i)*von(i)) writeln("Nghiem cho cp co rui ro <= ", 100*r/20, "% ", " = ", NghiemCoTuc(ct), " voi phuong sai = ", NghiemPhuongsai(ct) ) else writeln("Vo nghiem cho cp co rui ro <= ", 100*r/20, "%") end-if end-do Kết quả Vo nghiem cho cp co rui ro <= 0% Vo nghiem cho cp co rui ro <= 5% Vo nghiem cho cp co rui ro <= 10% Vo nghiem cho cp co rui ro <= 15% Nghiem cho cp co rui ro <= 20% = 11 voi phuong sai = 7.48 Nghiem cho cp co rui ro <= 25% = 12.15 voi phuong sai = 8.53 Nghiem cho cp co rui ro <= 30% = 13.3 voi phuong sai = 9.58 34 Nghiem cho cp co rui ro <= 35% = 14.45 voi phuong sai = 10.63 Nghiem cho cp co rui ro <= 40% = 15.6 voi phuong sai = 11.68 Nghiem cho cp co rui ro <= 45% = 16.7 voi phuong sai = 12.755 Nghiem cho cp co rui ro <= 50% = 17.8 voi phuong sai = 13.83 Nghiem cho cp co rui ro <= 55% = 18.85 voi phuong sai = 15.225 Nghiem cho cp co rui ro <= 60% = 19.9 voi phuong sai = 16.62 Nghiem cho cp co rui ro <= 65% = 20.5 voi phuong sai = 17.245 Nghiem cho cp co rui ro <= 70% = 21.1 voi phuong sai = 18.51 Nghiem cho cp co rui ro <= 75% = 21.7 voi phuong sai = 19.455 Nghiem cho cp co rui ro <= 80% = 22.3 voi phuong sai = 20.4 Nghiem cho cp co rui ro <= 85% = 22.9 voi phuong sai = 21.025 Nghiem cho cp co rui ro <= 90% = 23.5 voi phuong sai = 21.65 Nghiem cho cp co rui ro <= 95% = 24.1 voi phuong sai = 22.275 Nghiem cho cp co rui ro <= 100% = 24.7 voi phuong sai = 22.9 Vẽ đồ thị người dùng Bắt đầu mô hình ta thêm “mmive”, cung cấp các hàm vẽ đồ thị uses "mmive" Và các lệnh vẽ đồ thị như sau: declarations plot1: integer end-declarations plot1 := IVEaddplot("Gia tri cua nghiem", IVE_BLACK) forall(r in 1..ct) IVEdrawpoint(dothi1, NghiemCoTuc(r), NghiemPhuongsai(r)); forall(r in 2..ct) IVEdrawline(dothi1, NghiemCoTuc(r-1), NghiemPhuongsai(r-1), NghiemCoTuc(r), NghiemPhuongsai(r)) 35 và có đồ thị nghiệm bài toán BT2 như Hình 2.5: Hình 2.5 Đồ thị hiển thị các nghiệm bài toán. Hơn nữa, chúng ta có thể hiển thị các điểm tương ứng với dữ liệu đầu vào ( ‘dothi2’ cho cổ phiếu có rủi ro thấp, ‘dothi3’ cho cổ phiếu có rủi ro cao). declarations dothi2, dothi3: integer 36 end-declarations dothi2 := IVEaddplot("Low risk", IVE_YELLOW) dothi3 := IVEaddplot("High risk", IVE_RED) forall (i in CP - CPRuiRo) do IVEdrawpoint(dothi2, CoTuc(i), PhuongSai(i)) IVEdrawlabel(dothi2, CoTuc(i)+3.4, 1.3*(PhuongSai(i)-1), i) end-do forall (i in CPRuiRo) do IVEdrawpoint(dothi3, CoTuc(i), PhuongSai(i)) IVEdrawlabel(dothi3, CoTuc(i)-2.5, PhuongSai(i)-2, i) end-do 37 Bài toán BT2 có đồ thị như Hình 2.6: Hình 2.6 Đồ thị nghiệm bài toán và dữ liệu ban đầu. Mô hình Mosel hoàn chỉnh model "Toi uu Danh Muc Dau Tu voi LP" uses "mmxprs", "mmive"; parameters DATAFILE = "DanhMucLPdata.dat" ! File with problem data PHUONGSAI_FILE = "DanhMucPhuongSai.dat" MAXCPRuiRo = 1/3 ! Max. dau tu vao co phieu rui ro cao MAXVon = 0.3 ! Max. dau tu tren moi co phieu MINCPBacMy = 0.5 ! Min. gia tri dau tu vao Bac My 38 end-parameters declarations CP : set of string ! Tap cac co phieu CPRuiRo : set of string ! Tap cac co phieu co do rui ro cao CPBacMy : set of string ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung PhuongSai: array(CP) of real ! phuong sai(rui ro) cua co phieu von: array(CP) of mpvar ! ti le von dau tu vao co phieu end-declarations declarations NghiemCoTuc: array(range) of real ! gia tri nghiem (tong thu nhap mong doi ) NghiemPhuongsai: array(range) of real ! Gia tri nghiem (trung binh phuong sai) TongCoTuc, RuiRoCao: linctr end-declarations initializations from DATAFILE CPRuiRo CPBacMy CoTuc end-initializations initializations from PHUONGSAI_FILE PhuongSai end-initializations ! muc tieu: tong loi nhuan thu duoc TongCoTuc:= sum(i in CP) CoTuc(i)*von(i) ! gioi han dau tu vao co phieu co rui ro cao !sum(i in CPRuiRo) von(i) <= MAXCPRuiRo ! ti le von dau tu vao co phieu o Bac My sum(i in CPBacMy) von(i) >= MINCPBacMy ! tong so von dau tu sum(i in CP) von(i) = 1 ! chan tren moi co phieu forall(i in CP) von(i) <= MAXVon ct:=0 39 forall(r in 0..20) do ! Limit the percentage of high-risk values RuiRoCao:= sum(i in CPRuiRo) von(i) <= r/20 maximize(TongCoTuc) ! Solve the problem if (getprobstat = XPRS_OPT) then ! Save the optimal solution value ct+=1 NghiemCoTuc(ct):= getobjval NghiemPhuongsai(ct):= getsol(sum(i in CP) PhuongSai(i)*von(i)) writeln("Nghiem cho cp co rui ro <= ", 100*r/20, "% ", " = ", NghiemCoTuc(ct), " voi phuong sai = ", NghiemPhuongsai(ct) ) else writeln("Vo nghiem cho cp co rui ro <= ", 100*r/20, "%") end-if end-do declarations dothi1, dothi2, dothi3: integer end-declarations dothi1 := IVEaddplot("Gia tri cua nghiem", IVE_BLACK) dothi2 := IVEaddplot("rui ro thap", IVE_YELLOW) dothi3 := IVEaddplot("rui ro cao", IVE_RED) forall(r in 1..ct) IVEdrawpoint(dothi1, NghiemCoTuc(r), NghiemPhuongsai(r)); forall(r in 2..ct) IVEdrawline(dothi1, NghiemCoTuc(r-1), NghiemPhuongsai(r-1), NghiemCoTuc(r), NghiemPhuongsai(r)) forall (i in CP - CPRuiRo) do IVEdrawpoint(dothi2, CoTuc(i), PhuongSai(i)) IVEdrawlabel(dothi2, CoTuc(i)+3.4, 1.3*(PhuongSai(i)-1), i) end-do forall (i in CPRuiRo) do IVEdrawpoint(dothi3, CoTuc(i), PhuongSai(i)) IVEdrawlabel(dothi3, CoTuc(i)-2.5, PhuongSai(i)-2, i) end-do end-model 40 Mở rộng bài toán lựa chọn danh mục đầu tư Thí dụ 2.3: xét thí dụ 2.1 bài toán danh mục đầu tư (BT1) và người đầu tư không sẵn sàn mua cổ phiếu với số lượng quá ít. Anh ta xét hai khả năng có thể xảy ra: - Giới hạn số loại cổ phiếu trong danh mục đầu tư. - Nếu cổ phiếu được bán, thì mất một khoản phí mà MinChiPhi = 10% cho mỗi lần thực hiện lệnh bán cổ phiếu. Ta được bài toán lựa chọn danh mục đầu tư (BT3). Bây giờ chúng ta đưa hai ràng buộc trên vào 2 mô hình khác nhau: Mô hình 1 bài toán (BT3): Giới hạn số loại cổ phiếu trong danh mục đầu tư Gọi: MAXLOAICP: số cổ phiếu nhiều nhất có trong danh mục đầu tư muai : biến nhị phân, i CP∀ ∈ nếu muai = 1 thì mua cổ phiếu i, ngược lại muai = 0 thì không mua Tổng số cổ phiếu trong danh mục không quá MAXLOAICP: i i CP mua MAXLOAICP ∈ ≤∑ Tìm mối quan hệ của biến muai và voni Nếu một cổ phiếu được chọn vào danh mục, thi cổ phiếu đó được đếm hay nói cách khác Nếu voni > 0 thì muai = 1. Ta có công thức ràng buộc: : i ii CP von mua∀ ∈ ≤ 41 Mô hình toán hoàn chỉnh max .i i i CP CoTuc von ∈ ∑ 1 3ii CPRuiRo von ∈ ≤∑ 0,5i i CPBacMy von ∈ ≥∑ ,0 0,3ii CP von∀ ∈ ≤ ≤ i i CP mua MAXLOAICP ∈ ≤∑ : i ii CP von mua∀ ∈ ≤ : {0ii CP mua ,1}∀ ∈ ∈ Mô hình Mosel model "Toi uu Danh Muc Dau Tu voi LP" uses "mmxprs"; parameters DATAFILE = "DanhMucLPdata.dat" ! File with problem data MAXCPRuiRo = 1/3 ! Max. dau tu vao co phieu rui ro cao MAXVon = 0.3 ! Max. dau tu tren moi co phieu MINCPBacMy = 0.5 ! Min. gia tri dau tu vao Bac My MAXLOAICP = 4 ! Max. so tai san khac nhau end-parameters declarations CP : set of string ! Tap cac co phieu CPRuiRo : set of string ! Tap cac co phieu co do rui ro cao CPBacMy : set of string ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung von: array(CP) of mpvar ! ti le von dau tu vao co phieu ! bien nhi phan mua co phien mua : array(CP) of mpvar end-declarations initializations from DATAFILE 42 CPRuiRo CPBacMy CoTuc end-initializations ! muc tieu: tong loi nhuan thu duoc TongCoTuc:= sum(i in CP) CoTuc(i)*von(i) ! gioi han dau tu vao co phieu co rui ro cao sum(i in CPRuiRo) von(i) <= MAXCPRuiRo ! ti le von dau tu vao co phieu o Bac My sum(i in CPBacMy) von(i) >= MINCPBacMy ! tong so von dau tu sum(i in CP) von(i) = 1 ! chan tren moi co phieu forall(i in CP) von(i) <= MAXVon !chan tren tong so cac loai co phieu sum(i in CP) mua(i) <= MAXLOAICP forall(i in CP) do mua(i) is_binary ! gan bien nhi phan von(i) <= mua(i) ! lien he giua bien von va mua end-do ! Solve the problem maximize(TongCoTuc) ! Xuat ket qua ra file .dat writeln("Tong thu nhap mong doi: ", getobjval) forall(i in CP) writeln("Ti le von dau tu vao co phieu ", i, " = ", getsol(von(i))*100, "%") end-model Kết quả Tong thu nhap mong doi: 13.1 Ti le von dau tu vao co phieu Tai chinh = 20% Ti le von dau tu vao co phieu Phan cung = 0% Ti le von dau tu vao co phieu Nhac kich = 30% Ti le von dau tu vao co phieu Vien thong = 0% Ti le von dau tu vao co phieu Ruou bia = 20% 43 Ti le von dau tu vao co phieu Xay dung = 30% Ti le von dau tu vao co phieu Xe hoi = 0% Ti le von dau tu vao co phieu Ngan hang = 0% Ti le von dau tu vao co phieu Phan mem = 0% Ti le von dau tu vao co phieu Ðien tu = 0% Phân tích nghiệm Ma trận ràng buộc của bài toán quy hoạch nguyên BT3 như Hình 2.7: Hình 2.7 Ma trận ràng buộc của bài toán quy hoạch nguyên. 44 Mô hình 2 bài toán (BT3): Tính phí trên mỗi cổ phiếu MAXChiPhi : chi phí lớn nhất mỗi lần giao dịch cổ phiếu MINChiPhi : chi phí nhỏ nhất mỗi lần giao dịch cổ phiếu thì voni sẽ nhận giá trị hoặc bằng 0 hoặc nằm trong khoảng (MINChiPhi, MAXChiPhi) : 0 or i ii CP von MINChiPhi von MAXCPRuiRo∀ ∈ = ≤ ≤ Mô hình Mosel model "Toi uu Danh Muc Dau Tu voi LP" uses "mmxprs"; parameters DATAFILE = "DanhMucLPdata.dat" ! File with problem data MAXCPRuiRo = 1/3 ! Max. dau tu vao co phieu rui ro cao MAXVon = 0.3 ! Max. dau tu tren moi co phieu MINCPBacMy = 0.5 ! Min. gia tri dau tu vao Bac My MAXChiPhi = 0.3 ! Max. chi phi dau tu tren co phieu MINChiPhi = 0.1 ! Min. chi phi dau tu tren co phieu end-parameters declarations CP : set of string ! Tap cac co phieu CPRuiRo : set of string ! Tap cac co phieu co do rui ro cao CPBacMy : set of string ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung von: array(CP) of mpvar ! ti le von dau tu vao co phieu end-declarations initializations from DATAFILE CPRuiRo CPBacMy CoTuc end-initializations ! muc tieu: tong loi nhuan thu duoc TongCoTuc:= sum(i in CP) CoTuc(i)*von(i) ! gioi han dau tu vao co phieu co rui ro cao 45 sum(i in CPRuiRo) von(i) <= MAXCPRuiRo ! ti le von dau tu vao co phieu o Bac My sum(i in CPBacMy) von(i) >= MINCPBacMy ! tong so von dau tu sum(i in CP) von(i) = 1 ! chan tren moi co phieu forall(i in CP) von(i) <= MAXVon ! Upper and lower bounds on the investment per share forall(i in CP) do von(i) <= MAXChiPhi von(i) is_semcont MINChiPhi end-do ! Solve the problem maximize(TongCoTuc) ! Xuat ket qua ra file .dat writeln("Tong thu nhap mong doi: ", getobjval) forall(i in CP) writeln("Ti le von dau tu vao co phieu ", i, " = ", getsol(von(i))*100, "%") end-model Kết quả Tong thu nhap mong doi: 14.0333 Ti le von dau tu vao co phieu Tai chinh = 30% Ti le von dau tu vao co phieu Phan cung = 0% Ti le von dau tu vao co phieu Nhac kich = 20% Ti le von dau tu vao co phieu Vien thong = 0% Ti le von dau tu vao co phieu Ruou bia = 10% Ti le von dau tu vao co phieu Xay dung = 26.6667% Ti le von dau tu vao co phieu Xe hoi = 0% Ti le von dau tu vao co phieu Ngan hang = 0% Ti le von dau tu vao co phieu Phan mem = 13.3333% Ti le von dau tu vao co phieu Ðien tu = 0% 46 Dạng khác của bài toán lựa chọn danh mục đầu tư (BT4) Thí dụ 2.4: người đầu tư có thể xem xét danh mục của anh ta từ nhiều góc độ khác nhau: thay vì tính thu lợi mong đợi cao nhất và giới hạn đầu tư rủi ro cao anh ta mong muốn rủi ro thấp nhất trong khi vẫn đạt mục đích. Từ ý tưởng Markowitz, tính toán ma trận phương sai/ hiệp phương sai như Bảng 2.3: Tài chính Phần cứng Nhạc kịch Viễn thông Rượu bia Xây dựng Xe hơi Ngân hàng Phần mềm Điện tử Tài chính 0.1 0 0 0 0 0 0 0 0 0 Phần cứng 0 19 -2 4 1 1 1 0.5 10 5 Nhạc kịch 0 -2 28 1 2 1 1 0 -2 -1 Viễn thông 0 4 1 22 0 1 2 0 3 4 Rượu bia 0 1 2 0 4 -1.5 -2 -1 1 1 Xây dựng 0 1 1 1 -1.5 3.5 2 0.5 1 1.5 Xe hơi 0 1 1 2 -2 2 5 0.5 1 2.5 Ngân hàng 0 0.5 0 0 -1 0.5 0.5 1 0.5 0.5 Phần mềm 0 10 -2 3 1 1 2 0.5 25 8 Điện tử 0 5 -1 4 1 1.5 2.5 0.5 8 16 Bảng 2.3 Bảng ma trận phương sai/hiệp phương sai. 47 và có 2 bài toán sau: Bài toán BT4a: Đầu tư như thế nào để có danh mục đầu tư ít rủi ro nhất và đạt được mục tiêu đề ra ban đầu? Bài toán BT4b : Với chiến lược đầu tư có độ rủi ro nhỏ nhất nếu người đầu tư muốn chọn nhiều nhất 4 loại chứng khoán và đạt được mục tiều đề ra ban đầu? Xét bài toán BT4a: Phát triển bài toán (BT1) chúng ta có một số thay đổi - Hàm mục tiêu mới. - Bỏ điều kiện về rủi ro. - Thêm ràng buộc mới. Hàm mục tiêu mới là trung binh phương sai của danh mục: , min . .i j i j i j CP VAR von von ∈ ∑ Ràng buộc mới được thêm vào: .i i i CP CoTuc von MUCTIEU ∈ ≥∑ Với MUCTIEU là mục tiêu thu nhập mong đợi của danh mục đầu tư Mô hình hoàn chỉnh: , min . .i j i j i j CP VAR von von ∈ ∑ i i CPBacMy von MINCPBacMy ∈ ≥∑ 1 i i CP von ∈ =∑ .i i i CP CoTuc von MUCTIEU ∈ ≥∑ : 0 ii CP von MAXTYGIACP∀ ∈ ≤ ≤ 48 Xét bài toán BT4b: MAXLOAICP: số loại cổ phiếu nhiều nhất được chọn vào danh mục muai : biến nhị phân, i CP∀ ∈ nếu muai = 1 thì mua cổ phiếu i, ngược lại muai = 0 thì không mua Tổng số cổ phiếu trong danh mục không quá MAXLoaiCP i i CP mua MAXLoaiCP ∈ ≤∑ Tìm mối quan hệ của biến muai và voni Nếu một cổ phiếu được chọn vào danh mục, thi cổ phiếu đó được đếm hay nói cách khác Nếu voni > 0 thì muai = 1. Ta có công thức ràng buộc : i ii CP von mua∀ ∈ ≤ Khai báo "mmquad" trong mô hình Mosel, chức năng gọi thư viện giải bài toán quy hoạch toàn phương. Mô hình Mosel model "Toi uu Danh Muc Dau Tu voi LP" uses "mmxprs", "mmquad"; parameters DATAFILE = "DanhMucQPdata.dat" ! File with problem data MAXVon = 0.3 ! Max. dau tu tren moi co phieu MINCPBacMy = 0.5 ! Min. gia tri dau tu vao Bac My MUCTIEU = 9 ! Muc tieu thu loi mong doi cua danh muc MAXLoaiCP = 4 ! Max loai co phieu end-parameters declarations CP = 1..10 ! Tap cac co phieu CPRuiRo : set of integer ! Tap cac co phieu co do rui ro cao CPBacMy : set of integer ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung VAR : array(CP,CP) of real von: array(CP) of mpvar ! ti le von dau tu vao co phieu 49 end-declarations initializations from DATAFILE CPRuiRo CPBacMy CoTuc VAR end-initializations !Bai toan 1 dat ra muc tieu loi nhuan mong doi ! muc tieu: tong loi nhuan thu duoc TongPhuongSai:= sum(i,j in CP) VAR(i,j)*von(i)*von(j) ! ti le von dau tu vao co phieu o Bac My sum(i in CPBacMy) von(i) >= MINCPBacMy ! tong so von dau tu sum(i in CP) von(i) = 1 ! chan tren moi co phieu forall(i in CP) von(i) <= MAXVon ! Muc tieu thu nhap mong doi sum(i in CP) CoTuc(i)*von(i) >= MUCTIEU ! Solve the problem minimize(TongPhuongSai) ! Xuat ket qua writeln("Voi Muc tieu ", MUCTIEU," va phuong sai nho nhat ", getobjval) forall(i in CP) writeln("Ti le von dau tu vao co phieu ", i, " = ", getsol(von(i))*100, "%") !Bai toan 2 gioi han so chung khoan declarations mua: array(CP) of mpvar ! 1 if asset is in portfolio, 0 otherwise end-declarations ! Limit the total number of assets sum(i in CP) mua(i) <= MAXLoaiCP forall(i in CP) do mua(i) is_binary 50 von(i) <= mua(i) end-do ! Solve the problem minimize(TongPhuongSai) writeln("Voi Muc tieu ", MUCTIEU," va nhieu nhat ", MAXLoaiCP, " co phieu,\n phuong sai nho nhat la ", getobjval) forall(i in CP) writeln("Ti le von dau tu vao co phieu " ,i, ": ", getsol(von(i))*100, "%") end-model Kết quả Bài toán BT4a Voi Muc tieu 9 va phuong sai nho nhat 0.557394 Ti le von dau tu vao co phieu 1 = 30% Ti le von dau tu vao co phieu 2 = 7.15401% Ti le von dau tu vao co phieu 3 = 7.38237% Ti le von dau tu vao co phieu 4 = 5.46362% Ti le von dau tu vao co phieu 5 = 12.6561% Ti le von dau tu vao co phieu 6 = 5.91283% Ti le von dau tu vao co phieu 7 = 0.333491% Ti le von dau tu vao co phieu 8 = 29.9979% Ti le von dau tu vao co phieu 9 = 1.0997% Ti le von dau tu vao co phieu 10 = 7.0038e-006% Bài toán BT4b phuong sai nho nhat la 1.24876 Ti le von dau tu vao co phieu 1: 30% Ti le von dau tu vao co phieu 2: 20% Ti le von dau tu vao co phieu 3: 0% Ti le von dau tu vao co phieu 4: 0% Ti le von dau tu vao co phieu 5: 23.8095% Ti le von dau tu vao co phieu 6: 26.1905% Ti le von dau tu vao co phieu 7: 0% Ti le von dau tu vao co phieu 8: 0% 51 Ti le von dau tu vao co phieu 9: 0% Ti le von dau tu vao co phieu 10: 0% Hiển thị cây nhánh và cận Bài toán BT4b có thị cây nhánh và cận như Hình 2.8: Hình 2.8 Cây nhánh và cận. 52 Bây giờ ta sẽ vẽ đồ thị cho bài toán BT4a với mục tiêu mong đợi thay đổi Tương tự như vẽ đồ thị mô hình quy hoạch bài toán BT2, chúng ta xây dựng được mô hình Mosel sau : model "Toi uu Danh Muc Dau Tu voi QP" uses "mmxprs", "mmquad", "mmive"; parameters DATAFILE = "DanhMucQPdata.dat" ! File with problem data PHUONGSAI_FILE = "DanhMucPhuongSaiQP.dat" MAXVon = 0.3 ! Max. dau tu tren moi co phieu MINCPBacMy = 0.5 ! Min. gia tri dau tu vao Bac My !MUCTIEU = 9 ! Muc tieu thu loi mong doi cua danh muc MAXLoaiCP = 4 ! Max loai co phieu end-parameters declarations CP = 1..10 ! Tap cac co phieu CPRuiRo : set of integer ! Tap cac co phieu co do rui ro cao CPBacMy : set of integer ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung VAR : array(CP,CP) of real von: array(CP) of mpvar ! ti le von dau tu vao co phieu NghiemCoTuc: array(range) of real ! gia tri nghiem (tong thu nhap mong doi ) NghiemPhuongsai: array(range) of real ! Gia tri nghiem (trung binh phuong sai) end-declarations initializations from DATAFILE CPRuiRo CPBacMy CoTuc VAR end-initializations 53 !Bai toan 1 dat ra muc tieu loi nhuan mong doi ! muc tieu: tong loi nhuan thu duoc TongPhuongSai:= sum(i,j in CP) VAR(i,j)*von(i)*von(j) ! ti le von dau tu vao co phieu o Bac My sum(i in CPBacMy) von(i) >= MINCPBacMy ! tong so von dau tu sum(i in CP) von(i) = 1 ! chan tren moi co phieu forall(i in CP) von(i) <= MAXVon MUCTIEU:= min(i in CP) CoTuc(i) MAXMUCTIEU:= max(i in CP) CoTuc(i) while(MUCTIEU < MAXMUCTIEU) do RBThuNhapMongDoi:= sum(i in CP) CoTuc(i)*von(i) >= MUCTIEU ! Muc tieu thu nhap mong doi minimize(TongPhuongSai) !Giai bài toan if (getprobstat = XPRS_OPT) then ! Luu nghiem bai toan ct+=1 NghiemPhuongsai(ct):= getobjval NghiemCoTuc(ct):= MUCTIEU writeln("phuong sai: ",NghiemPhuongsai(ct)," va thu nhap mong doi: ", NghiemCoTuc(ct), "%") else writeln("") writeln("Bai toan khong co nghiem cho muc tieu >", NghiemCoTuc(ct) , "%") break end-if MUCTIEU += 1 end-do ! Drawing a graph to represent results (`dothi1') and data (`dothi2' & `dothi3') declarations dothi1, dothi2, dothi3: integer PhuongSai: array(CP) of real ! Standard PhuongSaiiation TenCP: array(CP) of string ! TenCP of CP 54 end-declarations initializations from PHUONGSAI_FILE PhuongSai TenCP end-initializations dothi1 := IVEaddplot("Gia tri nghiem", IVE_BLACK) dothi2 := IVEaddplot("Rui ro thap", IVE_YELLOW) dothi3 := IVEaddplot("Rui ro cao", IVE_RED) forall(r in 1..ct) IVEdrawpoint(dothi1, NghiemCoTuc(r), NghiemPhuongsai(r)); forall(r in 2..ct) IVEdrawline(dothi1, NghiemCoTuc(r-1), NghiemPhuongsai(r-1), NghiemCoTuc(r), NghiemPhuongsai(r)) forall (s in CP-CPRuiRo) do IVEdrawpoint(dothi2, CoTuc(s), PhuongSai(s)) IVEdrawlabel(dothi2, CoTuc(s)+3.4, 1.3*(PhuongSai(s)-1), TenCP(s)) end-do forall (s in CPRuiRo) do IVEdrawpoint(dothi3, CoTuc(s), PhuongSai(s)) IVEdrawlabel(dothi3, CoTuc(s)-2.5, PhuongSai(s)-2, TenCP(s)) end-do end-model Kết quả mô hình phuong sai: 0.527108 va thu nhap mong doi: 5% phuong sai: 0.527108 va thu nhap mong doi: 6% phuong sai: 0.527109 va thu nhap mong doi: 7% phuong sai: 0.527108 va thu nhap mong doi: 8% phuong sai: 0.557394 va thu nhap mong doi: 9% phuong sai: 0.670317 va thu nhap mong doi: 10% phuong sai: 0.831049 va thu nhap mong doi: 11% phuong sai: 1.03941 va thu nhap mong doi: 12% 55 phuong sai: 1.29539 va thu nhap mong doi: 13% phuong sai: 1.599 va thu nhap mong doi: 14% phuong sai: 1.95024 va thu nhap mong doi: 15% phuong sai: 2.34911 va thu nhap mong doi: 16% phuong sai: 2.79309 va thu nhap mong doi: 17% phuong sai: 3.27725 va thu nhap mong doi: 18% phuong sai: 3.8015 va thu nhap mong doi: 19% phuong sai: 4.3672 va thu nhap mong doi: 20% phuong sai: 4.97753 va thu nhap mong doi: 21% phuong sai: 5.63548 va thu nhap mong doi: 22% phuong sai: 6.34364 va thu nhap mong doi: 23% phuong sai: 7.1939 va thu nhap mong doi: 24% Bai toan khong co nghiem cho muc tieu > 24% 56 và đồ thị của bài toán BT4a với thu nhập mong đợi từ 5% đến 24% : Hình 2.9 Đồ thị nghiệm bài toán và dữ liệu ban đầu. 57

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

  • pdf6_4.pdf
  • pdf0_2.pdf
  • pdf1_3.pdf
  • pdf2_2.pdf
  • pdf3.pdf
  • pdf4.pdf
  • pdf5_2.pdf
  • pdf7.pdf
  • pdf8.pdf