Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
|
|
|
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 |
-
#
|
782 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
783 |
|
784 |
# Формирование результата
|
785 |
results = {}
|
786 |
for i, fert_name in enumerate(fertilizer_names):
|
787 |
-
if
|
788 |
-
results[fert_name] =
|
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():
|