- •Введение
- •Сущьность стохастического програмирования
- •Понятие о стохастическом программировании
- •Постановка задачи стохастического программирования
- •Модели стохастического программирования
- •2.Методы стохастического програмирования
- •Модели решения задач с постоянными вероятностными ограничениями
- •2.2. Двухэтапные задачи стохастического программирования
- •3.Реализация в среде ibmilogcplex
- •3.1. Задача Yield Management
- •Заключение
- •Список использованных источников
3.Реализация в среде ibmilogcplex
ILOG CPLEX представляет собой гибкую, надёжную, высокопроизводительную программную среду для решения задач линейного, частично-целочисленного и квадратичного программирования в критически важных приложениях. Интегрированная среда ILOG OPL-CPLEX предоставляет средства моделирования и разработки, позволяющие создавать прототипы и строить законченные программные приложения систем поддержки принятия решений.
Пакет получил свое название в честь симплекс-метода, реализованного на языке программирования С, но теперь пакет предоставляет различные методы оптимизации с интерфейсом на других языках программирования.
CPLEX через абстрактный слой (Concert) может использовать API языков C++, C#, и Java, а также Python через интерфейс С. Пакет можно использовать в связке с MicrosoftExcel и MATLAB. Отдельно приложение Interactive CPLEX Optimizer может быть использовано для отладки и других задач.
3.1. Задача Yield Management
В файле с расширением .mod , содержится программный код для реализации модели:
{string}classes= {"First","Business","Economy"};
intcapacity[classes] = [37,38,47];
// Planned periods
rangeperiods=1..3;
// 3 scenarios are studied with their corresponding probability
rangescenarios=1..3;
floatprobaScenarios[scenarios] = [0.1,0.7,0.2];
// 3 pricing options for each class and period
rangeoptions=1..3;
intpriceOptions[periods][classes][options] = ...;
// Demands given by analytics for each period, scenario, class and price option
intdemand[periods][scenarios][classes][options] = ...;
intplaneBookPrice= ...;
// Decision variables
//=====================
// Boolean variables for each period and each class on selected price option
dvarbooleanPriceLevel1[classes][options];
dvarbooleanPriceLevel2[scenarios][classes][options];
dvarbooleanPriceLevel3[scenarios][scenarios][classes][options];
// Number of seats
dvarfloat+Seats1[scenarios][classes][options];// seats sold in wk 1 for scenario s, class c, price option o
dvarfloat+Seats2[scenarios][scenarios][classes][options];// seats sold in wk 2 for scenario s1 for wk1, s2 for wk2, class c, price option o
dvarfloat+Seats3[scenarios][scenarios][scenarios][classes][options];//seats sold in wk 3 for scenario s1 for wk1, s2 for wk2, s3 for wk3, class c, price option o
// Slack and Excess of capacity per class
dvarint+U[scenarios][scenarios][scenarios][classes];
dvarint+V[scenarios][scenarios][scenarios][classes];
// Number of planes to book (up to 6)
dvarintNbPlanesin1..6;
dvarintRevenue1[s1inscenarios][cinclasses][oinoptions] ;
dvarintRevenue2[s1inscenarios][s2inscenarios][cinclasses][oinoptions] ;
dvarintRevenue3[s1inscenarios][s2inscenarios][s3inscenarios][cinclasses][oinoptions];
// Objective
//============
dexprfloatrevenue1=sum(s1inscenarios,cinclasses,oinoptions)probaScenarios[s1]*Revenue1[s1][c][o];
dexprfloatrevenue2=sum(s1,s2inscenarios,cinclasses,oinoptions)probaScenarios[s1]*probaScenarios[s2]*Revenue2[s1][s2][c][o];
dexprfloatrevenue3=sum(s1,s2,s3inscenarios,cinclasses,oinoptions)probaScenarios[s1]*probaScenarios[s2]*probaScenarios[s3]*Revenue3[s1][s2][s3][c][o];
dexprfloatplaneCost=planeBookPrice*NbPlanes;
dexprfloattotalObj=revenue1+revenue2+revenue3-planeCost;
maximizerevenue1+revenue2+revenue3-planeCost;
subjectto{
// linearisation
forall(s1inscenarios,cinclasses,oinoptions) {
Revenue1[s1][c][o] -priceOptions[1][c][o]*Seats1[s1][c][o] <=0;
priceOptions[1][c][o]*Seats1[s1][c][o] -Revenue1[s1][c][o] +priceOptions[1][c][o]*demand[1][s1][c][o]*PriceLevel1[c][o] <=priceOptions[1][c][o]*demand[1][s1][c][o];
}
forall(s1,s2inscenarios,cinclasses,oinoptions) {
Revenue2[s1][s2][c][o] -priceOptions[2][c][o]*Seats2[s1][s2][c][o] <=0;
priceOptions[2][c][o]*Seats2[s1][s2][c][o] -Revenue2[s1][s2][c][o] +priceOptions[2][c][o]*demand[2][s2][c][o]*PriceLevel2[s1][c][o] <=priceOptions[2][c][o]*demand[2][s2][c][o];
}
forall(s1,s2,s3inscenarios,cinclasses,oinoptions) {
Revenue3[s1][s2][s3][c][o] -priceOptions[3][c][o]*Seats3[s1][s2][s3][c][o] <=0;
priceOptions[3][c][o]*Seats3[s1][s2][s3][c][o] -Revenue3[s1][s2][s3][c][o] +priceOptions[3][c][o]*demand[3][s3][c][o]*PriceLevel3[s1][s2][c][o] <=priceOptions[3][c][o]*demand[3][s3][c][o];
}
// At each period, and for each class, only one price option is selected.
forall(cinclasses)
sum(oinoptions)PriceLevel1[c][o] ==1;
forall(cinclasses,s1inscenarios)
sum(oinoptions)PriceLevel2[s1][c][o] ==1;
forall(cinclasses,s1,s2inscenarios)
sum(oinoptions)PriceLevel3[s1][s2][c][o] ==1;
// Seat Capacity
forall(s1,s2,s3inscenarios,cinclasses)
ctSeatCapacities:
sum(oinoptions) (Seats1[s1][c][o] +Seats2[s1][s2][c][o] +Seats3[s1][s2][s3][c][o])
<=capacity[c]*NbPlanes+U[s1][s2][s3][c] -V[s1][s2][s3][c];
forall(s1,s2,s3inscenarios,cinclasses) {
U[s1][s2][s3][c] <=0.1*capacity[c];
V[s1][s2][s3][c] <=0.1*capacity[c];
}
forall(s1,s2,s3inscenarios)
sum(cinclasses) (U[s1][s2][s3][c] -V[s1][s2][s3][c]) ==0;
// Number of seats sold is lower than demand at each period
forall(s1inscenarios,cinclasses,oinoptions)
ctDemand1:Seats1[s1][c][o] <=demand[1][s1][c][o]*PriceLevel1[c][o];
forall(s1,s2inscenarios,cinclasses,oinoptions)
ctDemand2:Seats2[s1][s2][c][o] <=demand[2][s2][c][o]*PriceLevel2[s1][c][o];
forall(s1,s2,s3inscenarios,cinclasses,oinoptions)
ctDemand3:Seats3[s1][s2][s3][c][o] <=demand[3][s3][c][o]*PriceLevel3[s1][s2][c][o];
};
executeDISPLAY_RESULTS{
writeln("(Provisionally) book ",NbPlanes," planes");
writeln("expectedprofit = ",totalObj);
};
Решимнесколькозадачэтимметодом.
Задача 1. Найти оптимальный портфель максимальной эффективности для 10 ценных бумаг (х1,х2, … , х10), при начальном капитале равном 100 и неустойке 0,01.
Таблица 1 – среднее значение (mj) и стандартное отклонение (σj) доходности активов (в %)
|
х1 |
х2 |
х3 |
х4 |
х5 |
х6 |
х7 |
х8 |
х9 |
х10 |
mj |
175.53 |
97.56 |
62.88 |
75.15 |
114.73 |
7.7 |
8.55 |
6.99 |
8.87 |
6.93 |
σj |
65.51 |
48.93 |
19.66 |
25.47 |
22.76 |
0.46 |
0.29 |
0.22 |
0.61 |
0.12 |
На основе исходных данных была построена матрица ковариации представленная в таблице 2.
Таблица 2 –Ковариационная матрица доходностей ценных бумаг
|
х1 |
х2 |
х3 |
х4 |
х5 |
х6 |
х7 |
х8 |
х9 |
х10 |
х1 |
4291.560 |
2628.432 |
888.669 |
1017.809 |
596.403 |
-15.067 |
-1.900 |
8.936 |
11.589 |
2.909 |
х2 |
2628.432 |
2394.145 |
480.982 |
286.637 |
412.049 |
-7.878 |
-0.284 |
4.952 |
7.163 |
|
х3 |
888.669 |
480.982 |
386.516 |
220.326 |
120.815 |
-3.075 |
0.627 |
2.076 |
4.317 |
0.731 |
х4 |
1017.809 |
286.637 |
220.326 |
648.721 |
214.488 |
-3.515 |
-0.665 |
2.409 |
1.709 |
1.650 |
х5 |
596.403 |
412.049 |
120.815 |
214.488 |
518.018 |
-1.675 |
1.914 |
2.203 |
1.250 |
0.956 |
х6 |
-15.067 |
-7.878 |
-3.075 |
-3.515 |
-1.675 |
0.212 |
0.023 |
-0.018 |
-0.011 |
0.004 |
х7 |
-1.900 |
-0.284 |
0.627 |
-0.665 |
1.914 |
0.023 |
0.084 |
0.014 |
0.007 |
0.006 |
х8 |
8.936 |
4.952 |
2.076 |
2.409 |
2.203 |
-0.018 |
0.014 |
0.048 |
0.034 |
0.019 |
Х9 |
11.589 |
7.163 |
4.317 |
1.709 |
1.250 |
0.000 |
0.007 |
0.034 |
0.372 |
0.014 |
Х10 |
2.909 |
0.75 |
0.731 |
1.650 |
0.956 |
0.004 |
0.006 |
0.019 |
0.014 |
0.014 |
Решение задачи реализуется в файле с расширением .dat
Заносим данные в соответствии с условием задачи и запускаем.
Кодпрограммы:
priceOptions =
[[[1200,1000,950],
[900,800,600],
[500,300,200]],
[[1400,1300,1150],
[1100,900,750],
[700,400,350]],
[[1500,900,850],
[820,800,500],
[480,470,450]]];
demand =
[[[[10,15,20],
[20,25,35],
[45,55,60]],
[[20,25,35],
[40,42,45],
[50,52,63]],
[[45,50,60],
[45,46,47],
[55,56,64]]
]
[
[[20, 25, 35],
[42,45,46],
[50,52,60]]
[[10,40,50],
[50,60,80],
[60,65,90]]
[[50,55,80],
[20,30,50],
[10,40,60]]
]
[
[[30,35,40],
[40,50,55],
[50,60,80]],
[[30,40,60],
[10,40,45],
[50,60,70]],
[[50,70,80],
[40,45,60],
[60,65,70]]
]
];
planeBookPrice = 50000;
Ответ:
Рисунок 1 – Результат выполнения задачи 1
Оптимальный портфель будет состоять из распределения инвестиций в акции таким образом:
X1 = 0.014077, X2 ≈ 0, X3=0.55455, X4=0.45667 X5=1.5521 X6=23.01X7=57.906,X8 ≈ 0, X9=16.506 ,X10 ≈ 0, это позволит достичь максимальной прибыли портфеля.