Skip to content

Centipes/dynamic-programming-tasks

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Задачи динамического программирования

В этом репозитории предложены алгоритмы решения трех задач динамического программирования.

Стандартная задача

Планируется распределение начальной суммы средств x между N предприятиями. Выделенные средства xi приносят доход gi(xi) i-предприятию в начале планового периода. Определить, какое количество средств нужно, чтобы суммарный доход был максимальным.

Пример использования. Планируется распределение начальной суммы средств 16 млн.руб. между 6 предприятиями. Средства выделяются только в размерах, кратных 2 млн.руб. Функции дохода на каждом из четырех предприятий заданы таблично. Определить, какое количество средств нужно, чтобы суммарный доход был максимальным.

x g1(x) g2(x) g3(x) g4(x) g5(x) g6(x)
0 0 0 0 0 0 0
2 6 7 5 5 6 6
4 8 10 8 9 10 11
6 12 13 11 14 11 14
8 14 15 16 15 13 15
10 16 19 17 19 17 16
12 18 22 20 22 20 18
14 20 23 23 24 23 22
16 22 26 26 25 25 24
import numpy as np
from std_dynprog_task import optimal_res

inc = 2
income_matrix = np.array([[ 0, 0, 0, 0, 0, 0],
                          [ 6, 7, 5, 5, 6, 6],
                          [ 8,10, 8, 9,10,11],
                          [12,13,11,14,11,14],
                          [14,15,16,15,13,15],
                          [16,19,17,19,17,16],
                          [18,22,20,22,20,18],
                          [20,23,23,24,23,22],
                          [22,26,26,25,25,24]])
                          
optimal_res(income_matrix, inc)

Вывод

---matrix of objective functions---

 [[ 0  0  0  0  0  0]
  [ 6  6  6  6  7  7]
  [11 12 12 12 13 13]
  [14 17 17 17 19 19]
  [15 21 22 22 24 25]
  [16 24 26 27 29 30]
  [18 25 31 31 34 35]
  [22 28 35 36 38 40]
  [24 31 38 40 43 44]]
  
-----------state matrix------------

 [[ 0.   0.   0.   0.   0.   0.]
  [ 1.  10.   0.   0.   1.   0.]
  [ 2.   1.   0.   0.   1.  10.]
  [ 3.   1.  10.  10.   1.  10.]
  [ 4.   2.   1.  10.   1.   1.]
  [ 5.   2. 321.   1.   1.   1.]
  [ 6.  32.   3.  10.   1.   1.]
  [ 7.   5.   3.   1.   1.   1.]
  [ 8.  65.   3.   1.   1.   1.]]
  
-----optimal options to invest-----

  [2, 2, 0, 6, 2, 4]
  [2, 2, 2, 2, 4, 4]
  [2, 2, 2, 4, 2, 4]
  [2, 2, 2, 6, 2, 2]
  
-----------------------------------

Следовательно, всего есть 4 способа вложения средств в 6 предприятий при наличии начальных средств в размере 16 млн. руб. при которых получается максимальный доход в размере 44 млн. руб.

Многомерная задача распределения средств

Задача 1. Планируется деятельность двух предприятий в течение n лет. Начальные средства составляют S0. Средства x, вложенные в предприятие 1 приносят доход g1(x) и возвращаются в размере 𝜑1(x) < x. Предприятие 2 при вложении средств x приносит доход g1(x) и возвращаются в размере 𝜑2(x) < x. Ежегодно распределяются все наличные средства, получаемые из возвращенных средств.

Пример использования. Найти максимальный доход и оптимальный план от ежегодного распределения средств между двумя предприятиями в течение 3-х планового периода. Начальная сумма составляет 60 млн. руб. Вложенные средства в размере x приносят на предприятии 1 доход g1(x) и возвращается в размере 40% от x, а на предприятии 2 – соответственно g2(x) и 30%. Функции доходы от предприятий g1(x) и g2(x) заданы в таблице.

x 20 40 60
g1(x) 22 50 90
g2(x) 24 70 80
import numpy as np
from multi_dynprog_v1 import optimal_res

inc = 20
period = 3

per_1 = 0.4
per_2 = 0.3

income_matrix = np.array([[ 0, 0],
                          [22,24],
                          [50,70],
                          [90,80]])
                          
optimal_res(income_matrix, inc, per_1, per_2, period)

Вывод

---matrix of objective functions---

  [[ 0.    0.    0.     0. ]
   [ 0.   24.   31.6   34.64]
   [ 0.   70.   84.4   88.96]
   [ 0.   92.  123.2  132.16]]
 
-----------state matrix------------

  [[0. 0. 0.]
   [0. 1. 1.]
   [0. 0. 0.]
   [1. 3. 3.]]
   
-----optimal options to invest-----

[(60.0, 0.0), (20.0, 4.0), (0.0, 9.2)]

-----------------------------------

Следовательно, максимальный доход при распределении начальных средств в размере 60 млн. руб. в течение 3-х лет в два предприятия составляет 132.16 млн. руб.

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


Задача 2. Двум корпорациям, в состав правлений которых входят одни и те же лица, на основании законов о трестах запрещено помещать деньги в одни и те же предприятия. Первая корпорация намерена поместить капитал x, а вторая – капитал y. gi(z) – доходы от помещения капитал z в i-е предприятие из N различных предприятий. Руководители хотят максимизировать доход по двум корпорациям.

Пример использования. Пусть первая корпорация намерена поместить капитал в 4 предприятия в размере 3 млн. руб., а вторая – в размере 4 млн. руб. Доходы от вложения средств в каждое из 4-х предприятий представлены в таблице.

z g1(z) g2(z) g3(z) g4(z)
1 2 3 2 4
2 4 5 4 6
3 6 6 5 7
4 7 7 8 7
import numpy as np
from multi_dynprog_v2 import optimal_res

inc = 1
x = 3
y = 4

income_matrix = np.array([[0,0,0,0],
                          [2,3,2,4],
                          [4,5,4,6],
                          [6,6,5,7],
                          [7,7,8,7]])
                          
optimal_res(income_matrix, inc, x, y)

Вывод

---matrix of objective functions---

  [[ 0.  4.  7.  9. 11.]
   [ 4.  7.  9. 11. 13.]
   [ 7.  9. 11. 13. 15.]
   [ 9. 11. 13. 15. 17.]]
   
-----------state matrix y------------

[array([[ 0.,  1., 21., 21., 21.],
        [inf,  1.,  2., inf, inf],
        [inf,  1.,  2., inf, inf],
        [inf,  1.,  2.,  3.,  4.]]), 
 array([[ 0.,  0.,   10., 210., 210.],
        [ 0.,  10., 210., 210., 421.],
        [ 0.,  10., 210., 210., 421.],
        [ 0.,  10., 210.,  21.,  42.]]), 
 array([[ 0.,  1.,  1., 21., 21.],
        [inf,  1., 21., 21., 21.],
        [inf,  1., 21., 21., 21.],
        [inf,  1., 21., 21., 21.]])]
        
-----------state matrix x------------

[array([[ 0., inf, inf, inf, inf],
        [ 1.,  1.,  1.,  1.,  1.],
        [21.,  2.,  2.,  2.,  2.],
        [21., inf, inf,  3.,  3.]]), 
 array([[  0.,   0.,   0.,   0.,   0.],
        [  0.,  10.,  10.,  10.,   1.],
        [ 10., 210., 210., 210.,   2.],
        [210., 210., 210.,  21.,  inf]]), 
 array([[ 0., inf, inf, inf, inf],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1., 21., 21., 21., 21.],
        [21., 21., 21., 21., 21.]])]
        
-----optimal options to invest-----

  [(3, 0), (0, 2), (0, 1), (0, 1)]
  [(3, 0), (0, 1), (0, 2), (0, 1)]
  [(0, 3), (2, 0), (0, 1), (0, 1)]
  [(0, 3), (1, 0), (2, 0), (0, 1)]
  [(3, 0), (0, 2), (0, 0), (0, 2)]
  [(3, 0), (0, 1), (0, 1), (0, 2)]
  [(2, 0), (0, 1), (0, 2), (0, 2)]
  [(1, 0), (2, 0), (0, 2), (0, 2)]
  [(3, 0), (0, 2), (0, 0), (0, 2)]
  [(0, 2), (2, 0), (0, 1), (0, 2)]
  [(0, 2), (1, 0), (2, 0), (0, 2)]
  [(0, 3), (2, 0), (0, 1), (0, 1)]
  [(0, 2), (2, 0), (0, 2), (0, 1)]
  [(1, 0), (0, 1), (0, 4), (0, 1)]
  [(0, 0), (2, 0), (0, 4), (0, 1)]
  [(0, 3), (0, 1), (2, 0), (0, 1)]
  [(0, 2), (0, 2), (2, 0), (0, 1)]
  [(0, 3), (1, 0), (0, 1), (2, 0)]
  [(0, 2), (1, 0), (0, 2), (2, 0)]
  [(0, 0), (1, 0), (0, 4), (2, 0)]
  [(0, 3), (0, 1), (1, 0), (2, 0)]
  [(0, 2), (0, 2), (1, 0), (2, 0)]

В этом примере получилось 22 оптимальных варианта распределения средств в 6 предприятий при наличии начальных средств в размере 3 млн. руб. от первой корпорации и 4 млн. руб. от второй корпорации, при которых получается максимальный доход в размере 17 млн. руб.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages