Ứ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
                
              
                                            
                                
            
 
            
                 44 trang
44 trang | 
Chia sẻ: maiphuongtl | Lượt xem: 2260 | Lượt tải: 1 
              
            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