Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методы оптимизации.pdf
Скачиваний:
127
Добавлен:
05.06.2015
Размер:
710.9 Кб
Скачать

Этап 3. Предприятия 3 и 4.

 

 

 

max

 

y3fR3(x3) + f4(y3 c3(x3))g:

f3(y3) = x3=1:3

j

c3(x3)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

R3(x3) + f4(y3 c3(x3))

Оптимальное

 

 

 

решение

 

 

 

y3

x3 = 1

 

 

x3 = 2

x3 = 3

f3(y3)

x3

 

 

2

1+3=4

 

 

 

 

 

4

 

 

1

 

 

 

3

1+3=4

 

 

3+3=6

 

6

 

 

2

 

 

 

4

1+5=6

 

 

3+3=6

 

6

 

 

1,2

 

 

 

5

1+5=6

 

 

3+5=8

 

7+3=10

10

 

 

3

 

 

Таблица 10: Инвестиции без пустых проектов, этап 3

Этап 2. Предприятия 2, 3 и 4.

 

 

 

 

 

 

 

 

 

 

 

 

 

max

 

y2fR2(x2) + f3(y2 c2(x2))g:

f2(y2) = x2=1:3

j

c2(x2)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

R2(x2) + f3(y2 c2(x2))

Оптимальное

 

 

 

решение

 

 

 

 

 

y2

x2 = 1

 

 

 

x2 = 2

 

f2(y2)

x2

 

 

 

 

4

2+ 4=6

 

 

 

 

 

 

6

 

 

1

 

 

 

5

2+ 6=8

 

 

 

 

 

 

8

 

 

1

 

 

 

6

2+ 6=8

 

 

 

6+4=10

10

 

 

2

 

 

 

7

2+10=12

 

6+6=12

12

 

 

1, 2

 

 

Таблица 11: Инвестиции без пустых проектов, этап 2

Этап 1. Предприятия 1, 2, 3 и 4.

 

 

 

 

 

 

 

 

 

 

 

 

max

 

y1fR1(x1) + f2(y1 c1(x1))g:

f1(y1) = x1=1:2

j

c1(x1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

R1(x1) + f2(y1 c1(x1))

Оптимальное

 

 

 

решение

 

 

 

 

 

y1

x1 = 1

 

 

 

x1 = 2

 

f1(y1)

x1

 

 

 

 

5

1+ 6= 7

 

 

 

 

 

7

 

 

1

 

 

 

6

1+ 8= 9

 

 

 

 

 

9

 

 

1

 

 

 

7

1+10=11

 

4+6=10

11

 

 

1

 

 

 

8

1+12=13

 

4+8=12

13

 

 

1

 

 

Таблица 12: Инвестиции без пустых проектов, этап 1

нейшего анализа найти еще несколько строчек. Самая верхняя соответ-

ствует затратам, необходимым для реализации варианта x = (1; 1; 1; 1):

Для этого необходимо затратить j cj (1) = 1 + 2 + 1 + 1 = 5 миллионов рублей.

Итак, запишем один из ответов нашей задачи. Для того, чтобы оптимальным образом потратить 8 миллионов рублей на 4 предприятиях, надо

выбирать проекты

x = (1; 1; 3; 1):

f1(8) = 13

миллионов рублей в год при этом составит максимальный годовой доход.

3.3. Задача распределения инвестиций на компьютере.

Решаем задачу динамического программирования с помощью пакета SciLab-5.3. Программа называется InvestDi.sce. Чтобы ее напечатать на экране, надо набрать write(6, mgetl('InvestDi.sce')), чтобы запустить на выполнение, набирается текст exec('InvestDi.sce',0). Параметр 0 говорит о том, что не надо при выполнении программы печатать текст про-

14

граммы. Из протокола сессии работы с пакетом Scilab хорошо видно, как это все выполняется. Если какой-либо оператор непонятен, надо набрать слово help и имя непонятного оператора. Scilab вас просветит на английском языке (или на родном для авторов пакета французском!).

>w r i t e ( 6 , m g e t l ( ” I n v e s t D i . s c e ” ) )

/ /

 

Программа I n v e s t D i . s c e

/ /

 

Решение

задачи распределения инвестиций

/ /

 

методом

динамического

программирования .

/ /

==== 23

марта 2011 года ==== Визгунов НП .

c l e a r ,

c l c , mode ( 0 ) ,

l i n e s ( 0 , 9 0 )

y_1 = 5 ;

 

 

 

C

=

[

 

 

 

 

 

0

 

0

0

0

 

 

1

 

3

1

2

 

%inf

5

2

%inf

] ;

R

=

[

 

 

 

 

 

0

 

0

0

0

 

 

3

 

5

4

3

 

%inf

9

 

6

%inf

] ;

 

 

 

 

 

 

 

 

 

 

 

 

[ x9 , n ]

= s i z e ( C ) ;

/ /

x9

Количество

управлений

 

 

y9

 

=

y_1

+

1 ;

/ /

y9

Количество

состояний

 

 

/ /

Вычисляем

таблицы для

 

 

 

 

 

 

 

 

 

 

 

 

/ /

динамического

программирования ДП

 

 

 

 

 

 

X = %inf *

o n e s ( y9 ,

n + 1 ) ;

 

 

 

 

 

 

 

 

 

 

F

= X ;

 

 

 

 

 

 

/ /

 

 

находится сейчас в F ?

 

F ( : , n + 1 )

= z e r o s ( y9 ,

1 ) ;

что

 

f o r j = n : 1 : 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Fyx

= %inf

* o n e s ( y9 ,

x9 ) ;

 

 

 

 

 

 

 

 

 

f o r

y

= 0

:

y_1

 

 

 

/ /

y

состояние

на

шаге

j

 

 

f o r

x

=

1 : x9

 

 

 

/ /

x

управление

на

шаге

j

 

 

 

yy = y C ( x , j ) ;

 

 

 

 

 

 

 

 

 

 

 

 

 

i f

0

<= yy & yy <= y_1

 

 

 

 

 

 

 

 

 

 

 

/ /

Уравнение

Ричарда

Беллмана

 

 

 

 

 

 

 

 

Fyx ( 1 + y , x )

= R ( x , j )

+

F ( 1 + y C ( x , j ) , j + 1 ) ;

 

 

 

end

/ /

Fyx (1+ y , x )

= R ( x , j )

+

F(1+

yy ,

j + 1 ) ;

 

 

end

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

end

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/ /

F , Fyx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[ cFy ,

cX ]

=

max ( Fyx ,

 

’ c ’ ) ;

 

/ /

c

column ,

столбец

 

F ( : , j ) = cFy ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X ( : , j )

=

cX ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/ /

Печать

шапки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

xmaxi

= sum ( b o o l 2 s ( R ( : , j )

>

%inf ) ) ;

 

 

 

 

w r i t e ( 6 , ’ ’ )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w r i t e ( 6 ,

’ Этап ’

+

s t r i n g ( j ) ’ )

 

 

 

 

/ /

t i r e 4 0

=

’~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~ ’;

 

t i r e 4 0 = p a r t ( ’ ~ ’ , o n e s ( 1 , 2 0 ) ) + ’ | ’ + . . .

 

 

 

 

p a r t ( ’ ~ ’ , o n e s ( 1 , 6* xmaxi ) ) ;

 

 

 

 

 

 

w r i t e ( 6 , t i r e 4 0 ) ;

 

 

 

 

 

’ F j ( Yj ) Xj * | Fyx ’ ) ;

 

 

w r i t e ( 6 ,

’Y ’ + s t r i n g ( j )

+

 

 

w r i t e ( 6 , t i r e 4 0 ) ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/ /

Печать

только нужных

строчек

и столбцов

 

 

 

15

 

/ /

Допустимые

состояния

на

этапе

j меняются

 

/ /

в пределах

от y m i n i

до

y m a x i

включительно

 

y m i n i

= sum ( C ( 1 ,

j : $ ) ) ;

 

 

 

ymaxi

= y_1 sum ( C ( 1 ,

1 : j 1 ) ) ;

 

T a b l e

= [ ( 0

: y_1 ) ’ ,

F ( : , j ) ,

X ( : , j ) , Fyx ] ;

 

w r i t e ( 6 , T a b l e ( 1 + ( y m i n i : ymaxi ) , 1 : ( 3 + xmaxi ) ) , . . .

 

 

’ ( 3 ( i 4 , 2 x ) , ” ” | ” ” , 1 0 0 ( i 4 , 2 x ) ) ’ )

end

w r i t e ( 6 , t i r e 4 0 ) ;

 

 

 

 

 

 

 

 

 

 

 

 

/ /

Вычисление f o p t , r X o p t

и

r Y o p t

 

/ /

==============================

r X o p t =

z e r o s ( 1 , n ) ;

/ /

r

row , строка

r Y o p t = z e r o s ( 1 , n ) ;

 

 

 

 

y = y_1 ;

 

 

 

 

 

 

f o r

j

=

1 : n

 

 

 

 

 

 

r X o p t ( j ) = X( 1 + y , j ) ;

 

 

 

r Y o p t ( j ) = y ;

 

 

 

 

end

y = y C ( r X o p t ( j ) , j ) ;

 

 

 

 

 

 

 

 

 

 

/ /

Печать

ответа :

 

 

 

 

 

/ /

==============

 

 

 

 

C ,

R ,

y_1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w r i t e ( 6 , ’ =========== Ответ : ============ ’ )

w r i t e ( 6 , ’ =============================== ’ )

f o p t = F ( 1 + y_1 ,

1 ) ;

w r i t e ( 6 , ’ f o p t = ’ + s t r i n g ( f o p t ) ) ;

w r i t e ( 6 , r X o p t ,

’ ( ” ” r X o p t = ” ” , 100 i 6 ) ’ )

w r i t e ( 6 , r Y o p t ,

’ ( ” ” r Y o p t = ” ” , 100 i 6 ) ’ )

 

 

>e x e c ( ” I n v e s t D i . s c e ” , 0 )

Этап 4

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~

Y4

F j ( Yj )

Xj *

|

Fyx

 

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~

0

0

1

|

0

****

1

0

1

|

0

****

2

3

2

|

0

3

3

3

2

|

0

3

4

3

2

|

0

3

5

3

2

|

0

3

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~

 

 

 

 

 

 

Этап 3

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~

Y3 F j ( Yj ) Xj * | Fyx

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~

0

0

1

|

0

**** ****

1

4

2

|

0

4

****

2

6

3

|

3

4

6

3

7

2

|

3

7

6

4

9

3

|

3

7

9

5

9

3

|

3

7

9

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~

Этап 2

16

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~

Y2 F j ( Yj ) Xj * | Fyx

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~

0

0

1

|

0

**** ****

1

4

1

|

4

**** ****

2

6

1

|

6

**** ****

3

7

1

|

7

5

****

4

9

1

|

9

9

****

5

11

2

|

9

11

9

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~

Этап 1

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~

Y1 F j ( Yj ) Xj * | Fyx

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~

0

0

1

|

0

****

1

4

1

|

4

3

2

7

2

|

6

7

3

9

2

|

7

9

4

10

2

|

9

10

5

12

2

|

11

12

~~~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~

C=

 

0 .

0 .

0 .

0 .

 

1 .

3 .

1 .

2 .

I n f

5 .

2 .

I n f

R

=

 

 

 

 

0 .

0 .

0 .

0 .

 

3 .

5 .

4 .

3 .

I n f

9 .

6 .

I n f

y_1

=

 

 

 

 

 

 

 

 

5 .

=========== Ответ : ============

===============================

f o p t

=

12

 

 

 

r X o p t =

2

1

3

2

r Y o p t

=

5

4

4

2

 

 

 

 

 

 

>d i a r y ( 0 )

Как мы видим, решение, которые выдает наша программа, полностью совпадает с результатом, который получен вручную. Хотя результат и получен в «старинном стиле», в командном окне, но таблицы компьютер вычисляет верно и это делает достаточно простая программа. Единственный существенный недостаток этой программы — она дает один ответ. Чтобы получить все ответы, предложенную программу динамического программирования пришлось бы сильно усложнить.

Для получения всех оптимальных решений, нам проще написать другую программу, а именно, программу полного перебора. Она очень хорошо справляется с небольшими задачами и проверяет наше умение решать задачи методом динамического программирования. К тому же, теперь мы всегда будем знать все оптимальные решения. В частности, для рассмотренной задачи о распределении инвестиций из распечатки видно, что у задачи есть еще одно опмимальное решение

x = (2; 2; 2; 1):

Раз решение оптимальное, то доход также равен f1(5) = 12 миллионов рублей в год.

>w r i t e ( 6 , m g e t l ( nameF ) )

/ /

Программа I n v e s t P e . s c e

/ /

==== 23 марта 2011 года ==== Визгунов НП . .

17

mode ( 0 ) , l i n e s ( 0 , 8 0 ) ,

c l c ,

c l e a r

y1

 

=

5

 

 

 

 

C

=

[

0

0

0

0

 

 

 

 

1

3

1

2

 

 

 

 

%inf

5

2

%inf

]

R

=

[

0

0

0

0

 

 

 

 

3

5

4

3

 

 

 

 

%inf

9

6

%inf

]

 

 

 

 

 

 

 

 

[ u9 , n ]

=

s i z e ( C ) ;

 

 

/ /

u9 число возможных

управлений

x_min = o n e s ( 1 , n )

 

 

 

 

/ / [ 1

1

1

1 ]

x_max = sum ( a b s ( R )

 

~=

%inf , ’ r ’ )

/ /

[ 2

3

3

2 ]

x

 

= x_min ;

 

 

 

 

 

 

 

 

 

 

x _ o p t = x_min ;

 

 

 

 

 

 

 

 

 

 

f _ o p t

= %inf ;

 

 

 

 

 

 

 

 

 

 

j =

n ;

%t

 

 

 

 

 

 

 

 

 

 

 

 

 

w h i l e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i f

x ( j )

<=

x_max ( j )

 

 

 

 

 

 

 

c o s t

=

0 ;

 

 

 

 

 

 

 

 

 

 

 

 

f o r

i

=

1

: n

 

 

 

 

 

 

 

 

 

end

c o s t = c o s t + C ( x ( i ) , i ) ;

 

 

 

 

 

 

 

c o s t

<=

y1

 

 

 

 

 

 

 

 

 

i f

 

 

 

 

 

 

 

 

 

 

f

=

0 ;

 

 

 

 

 

 

 

 

 

 

 

 

 

f o r

i

=

1 : n

 

 

 

 

 

 

 

 

 

 

f = f + R ( x ( i ) , i ) ;

 

 

 

 

 

 

 

 

end

f _ o p t

 

< f

 

 

 

 

 

 

 

 

 

i f

 

 

 

 

 

 

 

 

 

 

 

 

/ /

Для

печати данных убрать

;

 

 

 

 

 

 

 

f _ o p t

 

=

f ;

 

 

 

 

 

 

 

 

 

 

x _ o p t

 

=

x ;

 

 

 

 

 

 

 

 

 

e l s e i f f _ o p t == f

 

 

 

 

 

 

 

 

 

f _ o p t ;

 

 

 

 

 

 

 

 

 

 

 

 

x _ o p t = [ x _ o p t ; x ] ;

 

 

 

 

 

 

 

 

end

 

 

 

 

 

 

 

 

 

 

 

 

 

end

/ /

c o s t

 

 

 

 

 

 

 

 

 

 

 

j =

n ;

 

 

 

 

 

 

 

 

 

 

 

 

e l s e

 

/ /

x ( j ) > x_max ( j )

 

 

 

 

 

 

 

x ( j ) = x_min ( j ) ;

 

 

 

 

 

 

 

 

j =

j

1 ;

 

 

 

 

 

 

 

 

 

 

 

i f

j

<=

1 e 8

 

 

 

 

 

 

 

 

 

 

/ /

Решение

получено выйти

из

цикла

 

 

 

 

 

end

break

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

end

/ /

i f

 

 

 

 

 

 

 

 

 

 

 

 

x ( j ) = x ( j ) + 1 ;

 

 

 

 

 

 

 

end

/ /

w h i l e

1

 

 

 

 

 

 

 

 

 

 

w r i t e ( 6 , [ ’ ** * * * * * * * ’

 

 

 

 

 

 

 

 

 

’ Ответ ’

 

 

 

 

 

 

 

 

 

’ ** * * * * * * * ’ ] )

 

 

 

 

 

w r i t e ( 6 , ’ f _ o p t = ’ + s t r i n g ( f _ o p t ) )

 

 

 

 

 

/ /

печать

в

одну

 

строку

 

 

 

 

 

x _ o p t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

>e x e c ( nameF , 0 )

 

 

 

 

 

 

 

 

 

y1

=

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

=

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 .

 

0 .

 

0 .

 

 

0 .

 

 

 

 

 

 

1 .

 

3 .

 

1 .

 

 

2 .

 

 

 

 

 

I n f

5 .

 

2 .

 

I n f

 

 

 

 

 

R

=

 

 

 

 

 

 

 

 

 

 

 

 

 

 

18