Ứ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 |
Chia sẻ: maiphuongtl | Lượt xem: 2000 | 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