From 6628f663b636675bcaea316f2deaddf337de480e Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期五, 13 三月 2026 10:23:31 +0800
Subject: [PATCH] feat(米重分析): 新增稳态识别和预测功能页面并优化现有模型
---
app/services/parameter_adjustment_service.py | 495 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 495 insertions(+), 0 deletions(-)
diff --git a/app/services/parameter_adjustment_service.py b/app/services/parameter_adjustment_service.py
new file mode 100644
index 0000000..a791835
--- /dev/null
+++ b/app/services/parameter_adjustment_service.py
@@ -0,0 +1,495 @@
+import pandas as pd
+import numpy as np
+
+# 灏濊瘯瀵煎叆torch锛屽鏋滃け璐ュ垯鏍囪涓轰笉鍙敤
+try:
+ import torch
+except ImportError:
+ torch = None
+
+class ParameterAdjustmentAdvisor:
+ """
+ 鎸ゅ嚭鏈哄弬鏁拌皟鑺傚缓璁櫒
+ 鏍规嵁瀹炴椂绫抽噸涓庢爣鍑嗙背閲嶇殑鍋忓樊锛岀粰鍑鸿灪鏉嗚浆閫熷拰娴佺▼涓婚�熺殑璋冩暣寤鸿
+ """
+
+ def __init__(self):
+ # 鍒濆鍖栭粯璁ゅ弬鏁板叧绯荤郴鏁�
+ # 杩欎簺绯绘暟琛ㄧず绫抽噸鍋忓樊1%鏃讹紝鍙傛暟闇�瑕佽皟鏁寸殑鐧惧垎姣�
+ # 鍙互鏍规嵁瀹為檯鐢熶骇鏁版嵁杩涜浼樺寲
+ self.default_coefficients = {
+ 'screw_speed': 0.1, # 绫抽噸鍋忓樊1%锛岃灪鏉嗚浆閫熻皟鏁�0.3%锛堥檷浣庤皟鏁村箙搴︼級
+ 'process_main_speed': -0.1 # 绫抽噸鍋忓樊1%锛屾祦绋嬩富閫熻皟鏁�-0.2%锛堥檷浣庤皟鏁村箙搴︼級
+ }
+
+ # 榛樿鍙傛暟涓婁笅闄愶紙鍙牴鎹疄闄呰澶囨儏鍐佃皟鏁达級
+ self.default_limits = {
+ 'screw_speed': {'min': 30, 'max': 500},
+ 'process_main_speed': {'min': 0, 'max': 200}
+ }
+
+ # 鏈�澶ц皟鏁村箙搴﹂檺鍒讹紙鐧惧垎姣旓級
+ self.max_adjustment_percentage = {
+ 'screw_speed': 15.0, # 铻烘潌杞�熷崟娆℃渶澶ц皟鏁�15%
+ 'process_main_speed': 10.0 # 娴佺▼涓婚�熷崟娆℃渶澶ц皟鏁�10%
+ }
+
+ def calculate_adjustment(self, real_time_weight, standard_weight, upper_limit, lower_limit,
+ current_screw_speed, current_process_speed,
+ current_screw_temperature=None, current_rear_barrel_temperature=None,
+ current_front_barrel_temperature=None, current_head_temperature=None,
+ coefficients=None, limits=None):
+ """
+ 璁$畻鍙傛暟璋冩暣寤鸿
+
+ :param real_time_weight: 瀹炴椂绫抽噸 (Kg/m)
+ :param standard_weight: 鏍囧噯绫抽噸 (Kg/m)
+ :param upper_limit: 绫抽噸涓婇檺 (Kg/m)
+ :param lower_limit: 绫抽噸涓嬮檺 (Kg/m)
+ :param current_screw_speed: 褰撳墠铻烘潌杞�� (rpm)
+ :param current_process_speed: 褰撳墠娴佺▼涓婚�� (m/min)
+ :param current_screw_temperature: 褰撳墠铻烘潌娓╁害 (掳C)
+ :param current_rear_barrel_temperature: 褰撳墠鍚庢満绛掓俯搴� (掳C)
+ :param current_front_barrel_temperature: 褰撳墠鍓嶆満绛掓俯搴� (掳C)
+ :param current_head_temperature: 褰撳墠鏈哄ご娓╁害 (掳C)
+ :param coefficients: 鑷畾涔夊弬鏁板叧绯荤郴鏁� (鍙��)
+ :param limits: 鑷畾涔夊弬鏁颁笂涓嬮檺 (鍙��)
+ :return: 璋冩暣寤鸿瀛楀吀
+ """
+ # 浣跨敤榛樿绯绘暟鎴栬嚜瀹氫箟绯绘暟
+ coeffs = coefficients if coefficients else self.default_coefficients
+
+ # 浣跨敤榛樿涓婁笅闄愭垨鑷畾涔変笂涓嬮檺
+ param_limits = limits if limits else self.default_limits
+
+ # 璁$畻绫抽噸鍋忓樊
+ weight_deviation = real_time_weight - standard_weight
+ deviation_percentage = (weight_deviation / standard_weight) * 100 if standard_weight != 0 else 0
+
+ # 纭畾绫抽噸鐘舵��
+ if real_time_weight > upper_limit:
+ status = "瓒呬笂闄�"
+ elif real_time_weight < lower_limit:
+ status = "瓒呬笅闄�"
+ else:
+ status = "姝e父鑼冨洿"
+
+ # 璁$畻娓╁害褰卞搷鍥犲瓙 - 鑰冭檻娓╁害瀵规尋鍑鸿繃绋嬬殑褰卞搷
+ # 娓╁害瓒婇珮锛岀墿鏂欐祦鍔ㄦ�ц秺濂斤紝鐩稿悓铻烘潌杞�熶笅鎸ゅ嚭閲忚秺澶�
+ temperature_factor = 1.0
+
+ # 濡傛灉鎻愪緵浜嗘俯搴﹀弬鏁帮紝璁$畻娓╁害褰卞搷鍥犲瓙
+ if current_screw_temperature is not None and current_head_temperature is not None:
+ # 璁$畻骞冲潎娓╁害涓庡弬鑰冩俯搴︾殑鍋忓樊
+ reference_temperature = 80.0 # 鍙傝�冩俯搴︼紝鍙牴鎹疄闄呭伐鑹鸿皟鏁�
+ avg_temperature = (current_screw_temperature + current_head_temperature) / 2
+ temperature_deviation = avg_temperature - reference_temperature
+
+ # 娓╁害鍋忓樊姣忓彉鍖�10掳C锛屽奖鍝嶅洜瀛愬彉鍖�5%
+ temperature_factor = 1.0 + (temperature_deviation / 10.0) * 0.05
+
+ # 闄愬埗娓╁害褰卞搷鍥犲瓙鐨勮寖鍥�
+ temperature_factor = max(0.8, min(1.2, temperature_factor))
+
+ # 璁$畻璋冩暣閲� - 鑰冭檻娓╁害褰卞搷鍥犲瓙
+ # 绫抽噸鍋忓樊 * 绯绘暟 * 娓╁害鍥犲瓙 = 璋冩暣鐧惧垎姣�
+ screw_speed_adjustment_percent = -deviation_percentage * coeffs['screw_speed'] * temperature_factor
+ process_speed_adjustment_percent = -deviation_percentage * coeffs['process_main_speed'] * temperature_factor
+
+ # 闄愬埗璋冩暣骞呭害锛岄伩鍏嶈皟鏁撮噺杩囧ぇ
+ screw_speed_adjustment_percent = max(
+ -self.max_adjustment_percentage['screw_speed'],
+ min(self.max_adjustment_percentage['screw_speed'],
+ screw_speed_adjustment_percent)
+ )
+
+ process_speed_adjustment_percent = max(
+ -self.max_adjustment_percentage['process_main_speed'],
+ min(self.max_adjustment_percentage['process_main_speed'],
+ process_speed_adjustment_percent)
+ )
+
+ # 璁$畻瀹為檯璋冩暣閲�
+ screw_speed_adjustment = (screw_speed_adjustment_percent / 100) * current_screw_speed
+ process_speed_adjustment = (process_speed_adjustment_percent / 100) * current_process_speed
+
+ # 璁$畻璋冩暣鍚庣殑鍙傛暟鍊�
+ new_screw_speed = current_screw_speed + screw_speed_adjustment
+ new_process_speed = current_process_speed + process_speed_adjustment
+
+ # 纭繚鍙傛暟鍦ㄥ悎鐞嗚寖鍥村唴
+ new_screw_speed = max(param_limits['screw_speed']['min'],
+ min(param_limits['screw_speed']['max'], new_screw_speed))
+
+ new_process_speed = max(param_limits['process_main_speed']['min'],
+ min(param_limits['process_main_speed']['max'], new_process_speed))
+
+ # 閲嶆柊璁$畻瀹為檯璋冩暣鐧惧垎姣旓紙鑰冭檻浜嗘渶澶ц皟鏁村箙搴﹀拰鍙傛暟涓婁笅闄愶級
+ screw_speed_adjust_percent = ((new_screw_speed - current_screw_speed) / current_screw_speed) * 100 if current_screw_speed != 0 else 0
+ process_speed_adjust_percent = ((new_process_speed - current_process_speed) / current_process_speed) * 100 if current_process_speed != 0 else 0
+
+ # 鐢熸垚璋冩暣寤鸿 - 鏃犺绫抽噸鏄惁鍦ㄨ寖鍥村唴锛岄兘鎻愪緵璋冩暣寤鸿锛岀洰鏍囨槸璁╁疄鏃剁背閲嶅敖鍙兘鎺ヨ繎鏍囧噯绫抽噸
+ recommendation = self._generate_recommendation(
+ deviation_percentage,
+ screw_speed_adjust_percent,
+ new_screw_speed,
+ process_speed_adjust_percent,
+ new_process_speed
+ )
+
+ return {
+ 'status': status,
+ 'real_time_weight': real_time_weight,
+ 'standard_weight': standard_weight,
+ 'upper_limit': upper_limit,
+ 'lower_limit': lower_limit,
+ 'deviation': weight_deviation,
+ 'deviation_percentage': deviation_percentage,
+ 'current_screw_speed': current_screw_speed,
+ 'current_process_speed': current_process_speed,
+ 'new_screw_speed': new_screw_speed,
+ 'new_process_speed': new_process_speed,
+ 'screw_speed_adjustment': screw_speed_adjustment,
+ 'process_speed_adjustment': process_speed_adjustment,
+ 'screw_speed_adjust_percent': screw_speed_adjust_percent,
+ 'process_speed_adjust_percent': process_speed_adjust_percent,
+ 'recommendation': recommendation
+ }
+
+ def _generate_recommendation(self, deviation_percentage, screw_speed_adjust_percent,
+ new_screw_speed, process_speed_adjust_percent, new_process_speed):
+ """
+ 鐢熸垚璋冩暣寤鸿鏂囨湰
+
+ :param deviation_percentage: 绫抽噸鍋忓樊鐧惧垎姣�
+ :param screw_speed_adjust_percent: 铻烘潌杞�熻皟鏁寸櫨鍒嗘瘮
+ :param new_screw_speed: 璋冩暣鍚庣殑铻烘潌杞��
+ :param process_speed_adjust_percent: 娴佺▼涓婚�熻皟鏁寸櫨鍒嗘瘮
+ :param new_process_speed: 璋冩暣鍚庣殑娴佺▼涓婚��
+ :return: 璋冩暣寤鸿鏂囨湰
+ """
+ # 鏍规嵁鍋忓樊鏂瑰悜鍜屽ぇ灏忕敓鎴愬缓璁�
+ abs_deviation = abs(deviation_percentage)
+
+ if abs_deviation < 0.5:
+ # 鍋忓樊寰堝皬锛屾帴杩戞爣鍑嗗��
+ return f"绫抽噸鍋忓樊寰堝皬 ({abs_deviation:.2f}%)锛屾帴杩戞爣鍑嗗�笺�俓n" \
+ f"寤鸿寰皟浠ヨ繘涓�姝ユ帴杩戞爣鍑嗗�硷細\n" \
+ f"1. 灏嗚灪鏉嗚浆閫熻皟鏁磋嚦 {new_screw_speed:.1f} rpm " \
+ f"( {'闄嶄綆' if screw_speed_adjust_percent < 0 else '鎻愰珮'} {abs(screw_speed_adjust_percent):.2f}% )\n" \
+ f"2. 灏嗘祦绋嬩富閫熻皟鏁磋嚦 {new_process_speed:.1f} m/min " \
+ f"( {'闄嶄綆' if process_speed_adjust_percent < 0 else '鎻愰珮'} {abs(process_speed_adjust_percent):.2f}% )"
+ elif deviation_percentage > 0:
+ # 绫抽噸鍋忛珮锛岄渶瑕侀檷浣庣背閲�
+ return f"绫抽噸鍋忓樊 {abs_deviation:.2f}%锛堝亸楂橈級锛屽缓璁皟鏁达細\n" \
+ f"1. 灏嗚灪鏉嗚浆閫熶粠褰撳墠鍊艰皟鏁磋嚦 {new_screw_speed:.1f} rpm " \
+ f"( {'闄嶄綆' if screw_speed_adjust_percent < 0 else '鎻愰珮'} {abs(screw_speed_adjust_percent):.2f}% )\n" \
+ f"2. 灏嗘祦绋嬩富閫熶粠褰撳墠鍊艰皟鏁磋嚦 {new_process_speed:.1f} m/min " \
+ f"( {'闄嶄綆' if process_speed_adjust_percent < 0 else '鎻愰珮'} {abs(process_speed_adjust_percent):.2f}% )"
+ else:
+ # 绫抽噸鍋忎綆锛岄渶瑕佹彁楂樼背閲�
+ return f"绫抽噸鍋忓樊 {abs_deviation:.2f}%锛堝亸浣庯級锛屽缓璁皟鏁达細\n" \
+ f"1. 灏嗚灪鏉嗚浆閫熶粠褰撳墠鍊艰皟鏁磋嚦 {new_screw_speed:.1f} rpm " \
+ f"( {'闄嶄綆' if screw_speed_adjust_percent < 0 else '鎻愰珮'} {abs(screw_speed_adjust_percent):.2f}% )\n" \
+ f"2. 灏嗘祦绋嬩富閫熶粠褰撳墠鍊艰皟鏁磋嚦 {new_process_speed:.1f} m/min " \
+ f"( {'闄嶄綆' if process_speed_adjust_percent < 0 else '鎻愰珮'} {abs(process_speed_adjust_percent):.2f}% )"
+
+ def predict_weight(self, model_info, screw_speed, head_pressure, process_speed,
+ screw_temperature, rear_barrel_temperature,
+ front_barrel_temperature, head_temperature):
+ """
+ 浣跨敤妯″瀷棰勬祴绫抽噸
+
+ :param model_info: 鍖呭惈妯″瀷鍜岀缉鏀惧櫒鐨勬ā鍨嬩俊鎭瓧鍏�
+ :param screw_speed: 铻烘潌杞�� (rpm)
+ :param head_pressure: 鏈哄ご鍘嬪姏 (bar)
+ :param process_speed: 娴佺▼涓婚�� (m/min)
+ :param screw_temperature: 铻烘潌娓╁害 (掳C)
+ :param rear_barrel_temperature: 鍚庢満绛掓俯搴� (掳C)
+ :param front_barrel_temperature: 鍓嶆満绛掓俯搴� (掳C)
+ :param head_temperature: 鏈哄ご娓╁害 (掳C)
+ :return: 棰勬祴鐨勭背閲嶅�� (Kg/m)
+ """
+ try:
+ # 鑾峰彇妯″瀷闇�瑕佺殑鐗瑰緛
+ required_features = model_info['features']
+
+ # 鍑嗗杈撳叆鏁版嵁锛屼繚鎸佷笌妯″瀷鐗瑰緛椤哄簭涓�鑷�
+ input_features = {
+ '铻烘潌杞��': screw_speed,
+ '鏈哄ご鍘嬪姏': head_pressure,
+ '娴佺▼涓婚��': process_speed,
+ '铻烘潌娓╁害': screw_temperature,
+ '鍚庢満绛掓俯搴�': rear_barrel_temperature,
+ '鍓嶆満绛掓俯搴�': front_barrel_temperature,
+ '鏈哄ご娓╁害': head_temperature
+ }
+
+ # 鏍规嵁妯″瀷鐗瑰緛鍒涘缓杈撳叆DataFrame
+ input_df = pd.DataFrame([input_features])[required_features]
+
+ # 鍒濆鍖栭娴嬬粨鏋�
+ predicted_weight = None
+
+ # 鑾峰彇妯″瀷
+ model = model_info['model']
+
+ # 鏍规嵁妯″瀷绫诲瀷鎵ц涓嶅悓鐨勯娴嬮�昏緫
+ if model_info['model_type'] in ['LSTM', 'GRU', 'BiLSTM']:
+ # 娣卞害瀛︿範妯″瀷棰勬祴
+ if torch is None:
+ print("PyTorch not available, cannot predict with deep learning models")
+ return None
+
+ # 鏁版嵁鏍囧噯鍖�
+ scaler_X = model_info['scaler_X']
+ scaler_y = model_info['scaler_y']
+ input_scaled = scaler_X.transform(input_df)
+
+ # 鑾峰彇搴忓垪闀垮害
+ sequence_length = model_info['sequence_length']
+
+ # 涓烘繁搴﹀涔犳ā鍨嬪垱寤哄簭鍒�
+ input_seq = np.tile(input_scaled, (sequence_length, 1)).reshape(1, sequence_length, -1)
+
+ # 杞崲涓篜yTorch寮犻噺
+ device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
+ input_tensor = torch.tensor(input_seq, dtype=torch.float32).to(device)
+
+ # 棰勬祴
+ model.eval()
+ with torch.no_grad():
+ y_pred_scaled_tensor = model(input_tensor)
+ y_pred_scaled = y_pred_scaled_tensor.cpu().numpy().ravel()[0]
+
+ # 鍙嶅綊涓�鍖�
+ predicted_weight = scaler_y.inverse_transform(np.array([[y_pred_scaled]]))[0][0]
+
+ elif model_info['model_type'] in ['SVR', 'MLP', 'GradientBoosting']:
+ # 闇�瑕佺壒寰佺缉鏀剧殑妯″瀷
+ scaler_X = model_info['scaler_X']
+ scaler_y = model_info['scaler_y']
+ input_scaled = scaler_X.transform(input_df)
+
+ # 棰勬祴
+ y_pred_scaled = model.predict(input_scaled)[0]
+
+ # 鍙嶅綊涓�鍖�
+ predicted_weight = scaler_y.inverse_transform(np.array([[y_pred_scaled]]))[0][0]
+
+ else:
+ # 鍏朵粬妯″瀷锛堝闅忔満妫灄銆佺嚎鎬у洖褰掔瓑锛�
+ predicted_weight = model.predict(input_df)[0]
+
+ return predicted_weight
+ except Exception as e:
+ print(f"妯″瀷棰勬祴澶辫触: {e}")
+ import traceback
+ traceback.print_exc()
+ return None
+ def iterative_adjustment(self, initial_params, model_info, max_iterations=5, tolerance=0.5):
+ """
+ 杩唬璋冩暣鍙傛暟锛岀洿鍒伴娴嬬背閲嶆弧瓒冲亸宸姹�
+
+ :param initial_params: 鍒濆鍙傛暟瀛楀吀锛屽寘鍚�:
+ - real_time_weight: 瀹炴椂绫抽噸
+ - standard_weight: 鏍囧噯绫抽噸
+ - upper_limit: 绫抽噸涓婇檺
+ - lower_limit: 绫抽噸涓嬮檺
+ - current_screw_speed: 褰撳墠铻烘潌杞��
+ - current_process_speed: 褰撳墠娴佺▼涓婚��
+ - current_screw_temperature: 铻烘潌娓╁害
+ - current_rear_barrel_temperature: 鍚庢満绛掓俯搴�
+ - current_front_barrel_temperature: 鍓嶆満绛掓俯搴�
+ - current_head_temperature: 鏈哄ご娓╁害
+ - current_head_pressure: 鏈哄ご鍘嬪姏
+ :param model_info: 妯″瀷淇℃伅瀛楀吀
+ :param max_iterations: 鏈�澶ц凯浠f鏁�
+ :param tolerance: 鍏佽鐨勭背閲嶅亸宸櫨鍒嗘瘮闃堝��
+ :return: 杩唬璋冩暣缁撴灉瀛楀吀锛屽寘鍚�:
+ - final_result: 鏈�缁堣皟鏁寸粨鏋�
+ - iteration_history: 姣忔杩唬鐨勫巻鍙茶褰�
+ - converged: 鏄惁鏀舵暃
+ """
+ iteration_history = []
+ converged = False
+
+ # 淇濆瓨鍒濆鍙傛暟锛岀敤浜庢渶缁堢粨鏋滆绠�
+ original_params = initial_params.copy()
+
+ # 鍒濆鍖栧綋鍓嶅弬鏁颁负鍒濆鍙傛暟
+ current_params = initial_params.copy()
+
+ for i in range(max_iterations):
+ # 璁$畻褰撳墠杩唬鐨勮皟鏁村缓璁�
+ adjustment_result = self.calculate_adjustment(
+ real_time_weight=current_params['real_time_weight'],
+ standard_weight=current_params['standard_weight'],
+ upper_limit=current_params['upper_limit'],
+ lower_limit=current_params['lower_limit'],
+ current_screw_speed=current_params['current_screw_speed'],
+ current_process_speed=current_params['current_process_speed'],
+ current_screw_temperature=current_params['current_screw_temperature'],
+ current_rear_barrel_temperature=current_params['current_rear_barrel_temperature'],
+ current_front_barrel_temperature=current_params['current_front_barrel_temperature'],
+ current_head_temperature=current_params['current_head_temperature']
+ )
+
+ # 浣跨敤妯″瀷棰勬祴璋冩暣鍚庣殑绫抽噸
+ predicted_weight = self.predict_weight(
+ model_info=model_info,
+ screw_speed=adjustment_result['new_screw_speed'],
+ head_pressure=current_params['current_head_pressure'],
+ process_speed=adjustment_result['new_process_speed'],
+ screw_temperature=current_params['current_screw_temperature'],
+ rear_barrel_temperature=current_params['current_rear_barrel_temperature'],
+ front_barrel_temperature=current_params['current_front_barrel_temperature'],
+ head_temperature=current_params['current_head_temperature']
+ )
+
+ # 妫�鏌ユā鍨嬮娴嬫槸鍚︽垚鍔�
+ if predicted_weight is None:
+ print(f"妯″瀷棰勬祴澶辫触锛岀粓姝㈣凯浠h皟鏁�")
+ iteration_history.append({
+ 'iteration': i + 1,
+ 'current_screw_speed': current_params['current_screw_speed'],
+ 'current_process_speed': current_params['current_process_speed'],
+ 'adjusted_screw_speed': adjustment_result['new_screw_speed'],
+ 'adjusted_process_speed': adjustment_result['new_process_speed'],
+ 'predicted_weight': None,
+ 'predicted_deviation': None,
+ 'predicted_deviation_percent': None,
+ 'screw_speed_adjustment': adjustment_result['screw_speed_adjustment'],
+ 'process_speed_adjustment': adjustment_result['process_speed_adjustment']
+ })
+ break
+
+ # 璁$畻棰勬祴鍋忓樊
+ predicted_deviation = predicted_weight - current_params['standard_weight']
+ predicted_deviation_percent = (predicted_deviation / current_params['standard_weight']) * 100
+
+ # 淇濆瓨杩唬鍘嗗彶
+ iteration_history.append({
+ 'iteration': i + 1,
+ 'current_screw_speed': current_params['current_screw_speed'],
+ 'current_process_speed': current_params['current_process_speed'],
+ 'adjusted_screw_speed': adjustment_result['new_screw_speed'],
+ 'adjusted_process_speed': adjustment_result['new_process_speed'],
+ 'predicted_weight': predicted_weight,
+ 'predicted_deviation': predicted_deviation,
+ 'predicted_deviation_percent': predicted_deviation_percent,
+ 'screw_speed_adjustment': adjustment_result['screw_speed_adjustment'],
+ 'process_speed_adjustment': adjustment_result['process_speed_adjustment']
+ })
+
+ # 妫�鏌ユ槸鍚︽敹鏁�
+ if abs(predicted_deviation_percent) <= tolerance:
+ converged = True
+ break
+
+ # 鏇存柊褰撳墠鍙傛暟锛屽噯澶囦笅涓�娆¤凯浠�
+ current_params.update({
+ 'real_time_weight': predicted_weight,
+ 'current_screw_speed': adjustment_result['new_screw_speed'],
+ 'current_process_speed': adjustment_result['new_process_speed']
+ })
+
+ # 鑾峰彇鏈�缁堣皟鏁村悗鐨勫弬鏁�
+ final_screw_speed = iteration_history[-1]['adjusted_screw_speed']
+ final_process_speed = iteration_history[-1]['adjusted_process_speed']
+ final_predicted_weight = iteration_history[-1]['predicted_weight']
+
+ # 璁$畻浠庡垵濮嬪弬鏁板埌鏈�缁堝弬鏁扮殑鎬昏皟鏁�
+ # 鍒涘缓涓�涓寘鍚垵濮嬪弬鏁扮殑璋冩暣缁撴灉
+ final_result = {
+ 'status': '姝e父鑼冨洿' if abs((final_predicted_weight - original_params['standard_weight']) / original_params['standard_weight'] * 100) <= tolerance else '瓒呬笂闄�' if final_predicted_weight > original_params['upper_limit'] else '瓒呬笅闄�',
+ 'real_time_weight': original_params['real_time_weight'], # 鍒濆瀹炴椂绫抽噸
+ 'standard_weight': original_params['standard_weight'],
+ 'upper_limit': original_params['upper_limit'],
+ 'lower_limit': original_params['lower_limit'],
+ 'deviation': original_params['real_time_weight'] - original_params['standard_weight'], # 鍒濆鍋忓樊
+ 'deviation_percentage': (original_params['real_time_weight'] - original_params['standard_weight']) / original_params['standard_weight'] * 100, # 鍒濆鍋忓樊鐧惧垎姣�
+ 'current_screw_speed': original_params['current_screw_speed'], # 鍒濆铻烘潌杞��
+ 'current_process_speed': original_params['current_process_speed'], # 鍒濆娴佺▼涓婚��
+ 'new_screw_speed': final_screw_speed, # 鏈�缁堣皟鏁村悗鐨勮灪鏉嗚浆閫�
+ 'new_process_speed': final_process_speed, # 鏈�缁堣皟鏁村悗鐨勬祦绋嬩富閫�
+ 'screw_speed_adjustment': final_screw_speed - original_params['current_screw_speed'], # 鎬昏皟鏁撮噺
+ 'process_speed_adjustment': final_process_speed - original_params['current_process_speed'], # 鎬昏皟鏁撮噺
+ 'screw_speed_adjust_percent': ((final_screw_speed - original_params['current_screw_speed']) / original_params['current_screw_speed']) * 100 if original_params['current_screw_speed'] != 0 else 0, # 鎬昏皟鏁寸櫨鍒嗘瘮
+ 'process_speed_adjust_percent': ((final_process_speed - original_params['current_process_speed']) / original_params['current_process_speed']) * 100 if original_params['current_process_speed'] != 0 else 0, # 鎬昏皟鏁寸櫨鍒嗘瘮
+ 'predicted_weight': final_predicted_weight # 鏈�缁堥娴嬬背閲�
+ }
+
+ # 鐢熸垚璋冩暣寤鸿鏂囨湰
+ final_deviation_percent = (final_predicted_weight - original_params['standard_weight']) / original_params['standard_weight'] * 100
+ final_result['recommendation'] = self._generate_recommendation(
+ final_deviation_percent,
+ final_result['screw_speed_adjust_percent'],
+ final_screw_speed,
+ final_result['process_speed_adjust_percent'],
+ final_process_speed
+ )
+
+ # 娣诲姞娓╁害鐩稿叧鍙傛暟锛堢敤浜庨娴嬶級
+ final_result['current_screw_temperature'] = original_params['current_screw_temperature']
+ final_result['current_rear_barrel_temperature'] = original_params['current_rear_barrel_temperature']
+ final_result['current_front_barrel_temperature'] = original_params['current_front_barrel_temperature']
+ final_result['current_head_temperature'] = original_params['current_head_temperature']
+
+ # 娣诲姞鏈�缁堥娴嬬浉鍏充俊鎭�
+ final_predicted_deviation = final_predicted_weight - original_params['standard_weight']
+ final_predicted_deviation_percent = (final_predicted_deviation / original_params['standard_weight']) * 100
+ final_result['final_predicted_deviation'] = final_predicted_deviation
+ final_result['final_predicted_deviation_percent'] = final_predicted_deviation_percent
+
+ return {
+ 'final_result': final_result,
+ 'iteration_history': iteration_history,
+ 'converged': converged,
+ 'total_iterations': len(iteration_history),
+ 'initial_params': original_params # 淇濆瓨鍒濆鍙傛暟锛岀敤浜庣粨鏋滃睍绀�
+ }
+ def analyze_historical_adjustments(self, df):
+ """
+ 鍒嗘瀽鍘嗗彶璋冩暣鏁版嵁锛屼紭鍖栬皟鏁寸郴鏁�
+
+ :param df: 鍖呭惈鍘嗗彶璋冩暣鏁版嵁鐨凞ataFrame锛岄渶瑕佸寘鍚互涓嬪垪锛�
+ - real_time_weight: 瀹炴椂绫抽噸
+ - standard_weight: 鏍囧噯绫抽噸
+ - current_screw_speed: 褰撳墠铻烘潌杞��
+ - current_process_speed: 褰撳墠娴佺▼涓婚��
+ - adjusted_screw_speed: 璋冩暣鍚庣殑铻烘潌杞��
+ - adjusted_process_speed: 璋冩暣鍚庣殑娴佺▼涓婚��
+ - result_weight: 璋冩暣鍚庣殑绫抽噸
+ :return: 浼樺寲鍚庣殑绯绘暟
+ """
+ if df is None or df.empty:
+ return self.default_coefficients
+
+ try:
+ # 璁$畻绫抽噸鍋忓樊
+ df['weight_deviation'] = df['real_time_weight'] - df['standard_weight']
+ df['deviation_percentage'] = (df['weight_deviation'] / df['standard_weight']) * 100
+
+ # 璁$畻鍙傛暟璋冩暣鐧惧垎姣�
+ df['screw_speed_adjust_percent'] = ((df['adjusted_screw_speed'] - df['current_screw_speed']) / df['current_screw_speed']) * 100
+ df['process_speed_adjust_percent'] = ((df['adjusted_process_speed'] - df['current_process_speed']) / df['current_process_speed']) * 100
+
+ # 璁$畻璋冩暣鏁堟灉
+ df['adjustment_effect'] = df['result_weight'] - df['real_time_weight']
+
+ # 浣跨敤绾挎�у洖褰掕绠椾紭鍖栫郴鏁�
+ # 绯绘暟 = 鍙傛暟璋冩暣鐧惧垎姣� / 绫抽噸鍋忓樊鐧惧垎姣�
+ screw_speed_coeff = df['screw_speed_adjust_percent'].sum() / df['deviation_percentage'].sum() if df['deviation_percentage'].sum() != 0 else self.default_coefficients['screw_speed']
+ process_speed_coeff = df['process_speed_adjust_percent'].sum() / df['deviation_percentage'].sum() if df['deviation_percentage'].sum() != 0 else self.default_coefficients['process_main_speed']
+
+ # 鍙栫粷瀵瑰�硷紝纭繚鏂瑰悜姝g‘
+ optimized_coeffs = {
+ 'screw_speed': abs(screw_speed_coeff),
+ 'process_main_speed': -abs(process_speed_coeff) # 娴佺▼涓婚�熶笌绫抽噸璐熺浉鍏�
+ }
+
+ return optimized_coeffs
+ except Exception as e:
+ print(f"鍒嗘瀽鍘嗗彶璋冩暣鏁版嵁澶辫触: {e}")
+ return self.default_coefficients
--
Gitblit v1.9.3