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.
44 trang |
Chia sẻ: vietpd | Lượt xem: 1354 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Ứng dụng toán ưu hóa trong kinh tế sử dụng chương trình 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) IVEdrawpoi