DmitrMakeev commited on
Commit
a86b75b
·
verified ·
1 Parent(s): 53d6f1e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -6
app.py CHANGED
@@ -710,12 +710,12 @@ def nutri_call():
710
 
711
 
712
 
713
-
714
 
715
 
716
  from tabulate import tabulate
717
  import numpy as np
718
- import numpy as np
 
719
 
720
  # Глобальные параметры
721
  TOTAL_NITROGEN = 120.0 # Общее количество азота
@@ -778,14 +778,26 @@ class NutrientCalculator:
778
  # Формирование вектора B (целевые значения в ppm)
779
  B = self.target_vector * self.volume / 1000 # Перевод ppm в граммы
780
 
781
- # Решение системы уравнений A @ X = B
782
- X, residuals, rank, s = np.linalg.lstsq(A, B, rcond=None)
 
 
 
 
 
 
 
 
 
 
 
 
783
 
784
  # Формирование результата
785
  results = {}
786
  for i, fert_name in enumerate(fertilizer_names):
787
- if X[i] > 0:
788
- results[fert_name] = X[i]
789
 
790
  return results
791
 
@@ -806,6 +818,17 @@ class NutrientCalculator:
806
  raise
807
 
808
 
 
 
 
 
 
 
 
 
 
 
 
809
 
810
  @app.route('/calculation', methods=['POST'])
811
  def handle_calculation():
 
710
 
711
 
712
 
 
713
 
714
 
715
  from tabulate import tabulate
716
  import numpy as np
717
+ from scipy.optimize import linprog
718
+
719
 
720
  # Глобальные параметры
721
  TOTAL_NITROGEN = 120.0 # Общее количество азота
 
778
  # Формирование вектора B (целевые значения в ppm)
779
  B = self.target_vector * self.volume / 1000 # Перевод ppm в граммы
780
 
781
+ # Ограничения: количество удобрений >= 0
782
+ bounds = [(0, None) for _ in fertilizer_names]
783
+
784
+ # Добавляем допустимый перебор (до 10%)
785
+ tolerance = 0.10
786
+ B_max = B * (1 + tolerance) # Максимальные значения с учетом допуска
787
+ B_min = B * (1 - tolerance) # Минимальные значения с учетом допуска
788
+
789
+ # Решение системы уравнений с ограничениями
790
+ c = np.ones(len(fertilizer_names)) # Минимизируем сумму отклонений
791
+ result = linprog(c, A_ub=A, b_ub=B_max, A_eq=A, b_eq=B, bounds=bounds, method='highs')
792
+
793
+ if not result.success:
794
+ raise ValueError("Не удалось найти решение с текущими ограничениями.")
795
 
796
  # Формирование результата
797
  results = {}
798
  for i, fert_name in enumerate(fertilizer_names):
799
+ if result.x[i] > 0:
800
+ results[fert_name] = result.x[i]
801
 
802
  return results
803
 
 
818
  raise
819
 
820
 
821
+ if __name__ == "__main__":
822
+ try:
823
+ calculator = NutrientCalculator()
824
+ results = calculator.calculate()
825
+ if results:
826
+ print(calculator.generate_report(results))
827
+ else:
828
+ print("Решение не найдено.")
829
+ except Exception as e:
830
+ print(f"Критическая ошибка: {str(e)}")
831
+
832
 
833
  @app.route('/calculation', methods=['POST'])
834
  def handle_calculation():