Mephistopheles_

Симплексный метод

Apr 6th, 2022
1,222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.68 KB | None | 0 0
  1. import copy
  2. import math
  3.  
  4. import numpy as np
  5.  
  6. f = np.array([320, 290])
  7.  
  8. X = np.array([
  9.     [0.5, 0.2, 600],
  10.     [0.2, 0.6, 870],
  11.     [0.3, 0.2, 430]
  12. ])
  13. zv = [320, 290, 0, 0, 0]  # 3 последние фиктивные
  14. bz = [0, 0, 0, 0, 0]  # 2 последних фиктивные
  15. # f=np.array([3,2,0,0,0,0])
  16. # b=np.array([6,8,1,2])
  17. # data=np.array([
  18. #     [0.5,0.2,1,0,0],
  19. #     [0.2,0.6,0,1,0],
  20. #     [0.3,0.2,0,0,1]
  21. # ])
  22. #
  23. # X=np.array([
  24. #     [1,2,6],
  25. #     [2,1,8],
  26. #     [-1,1,1],
  27. #     [0,1,2]
  28. # ])
  29. # zv=[3,2,0,0,0,0] # 2 последние фиктивные
  30. # bz=[0,0,0,0,0,0] # 2 последних фиктивные
  31. res = None
  32.  
  33. np.set_printoptions(suppress=True)
  34. def ck(X, f, zv, bz):
  35.     global res
  36.     X = X.astype(float)
  37.     k = np.array([X[:, i] @ bz[0:3] - zv[i] for i in range(X.shape[1])])  # скалярное произведение
  38.     print(X)
  39.     print(k[0:3])
  40.     if k[0] >= 0 and k[1] >= 0:  # больше 0, значит результат найден
  41.         res = (np.round(X[:, -1], 3)[np.array(bz)[:3] > 0], np.round(k[-1], 3))
  42.         return  # нашли решение
  43.     t = np.argmin(k)  # разрешающий столбец
  44.     ot = []
  45.     for i in range(X.shape[0]):  # поиск минимальной положительной строки
  46.         if X[i][t] != 0:
  47.             ot.append(X[i][2] / X[i][t])
  48.         else:
  49.             ot.append(1e6)
  50.         if ot[-1] < 0:
  51.             ot[-1] = 1e6
  52.     s = np.argmin(ot)  # разрешающая строка
  53.     bz[s], zv[t] = zv[t], bz[s]  # замена базизных элементов
  54.     x = X[s][t]  # разрешающий элемент
  55.     A = copy.deepcopy(X)
  56.     for i in range(X.shape[0]):  # вычисление новых элементов на разрешающем столбце
  57.         X[i][t] = A[i][t] / x * -1
  58.     for i in range(X.shape[1]):  # вычисление новых элементов на разрешающей строке
  59.         X[s][i] = A[s][i] / x
  60.     for i in range(X.shape[0]):  # вычисление всех оставшихся элементов
  61.         for j in range(X.shape[1]):
  62.             if i == s or j == t:
  63.                 continue
  64.             X[i][j] = (A[i][j] * A[s][t] - A[i][t] * A[s][j]) / x
  65.     X[s][t] = 1 / x  # перевычисление разрешающего элемента
  66.     ck(X, f, zv, bz)  # переход на следующуюю итерацию
  67.  
  68.  
  69. ck(X, f, zv, bz)
  70. print()
  71. if res[0][0] * f[0] + res[0][1] * f[1] != res[1]:
  72.     print("x1 =", res[0][1], " ;", "x2 =", res[0][0], " ;", "f =", res[1])
  73. else:
  74.     print("x1 =", res[0][0], " ;", "x2 =", res[0][1], " ;", "f =", res[1])
  75.  
Advertisement
Add Comment
Please, Sign In to add comment