Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мезенцев Имитационное моделирование / КП Среда реализации IBM ILOG CPLEX. Спрос – случайная величина. по ИМ.docx
Скачиваний:
70
Добавлен:
04.01.2020
Размер:
487.57 Кб
Скачать

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 ценных бумаг (х12, … , х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, это позволит достичь максимальной прибыли портфеля.

Соседние файлы в папке Мезенцев Имитационное моделирование