bug似乎解决了

This commit is contained in:
AgentLabCn
2025-12-02 10:08:45 +08:00
parent 135b762a29
commit ef93f0cc6a
4 changed files with 165 additions and 149 deletions

View File

@@ -848,6 +848,8 @@ class SimulationModel(Model):
)
def _finalize_factory_errors(self, write_files: bool):
# Always reset cached factory error table so callers don't see stale data.
self.factory_error_df = None
if not self.production_log:
self.error = float("inf")
return
@@ -889,17 +891,31 @@ class SimulationModel(Model):
use_max=self.use_error_max,
)
cum_ratio_by_factory = stats["factory_cum_ratio"]
metric_fn = (lambda pct: pct.abs().max()) if self.use_error_max else (lambda pct: pct.abs().mean())
factory_metric = {fname: float(metric_fn(pct)) for fname, pct in cum_ratio_by_factory.items()}
# Aggregate factory-level errors (mean across factories of max/mean per-month absolute ratio)
factory_errors = []
for ratio_series in cum_ratio_by_factory.values():
metric_val = ratio_series.abs().max() if self.use_error_max else ratio_series.abs().mean()
factory_errors.append(float(metric_val))
factory_errors = list(factory_metric.values())
if not factory_errors:
self.error = float("inf")
else:
# Aggregate across factories: max when use_error_max=True, otherwise mean.
self.error = max(factory_errors) if self.use_error_max else sum(factory_errors) / len(factory_errors)
# Expose per-factory error (unitless ratio) even when files are not written (used by GA).
factory_df = pd.DataFrame(
{
"name": list(factory_metric.keys()),
"error_ratio": list(factory_metric.values()),
}
)
if not factory_df.empty:
factory_df = factory_df.sort_values(by="error_ratio")
factory_df["error_pct"] = factory_df["error_ratio"] * 100
else:
factory_df["error_pct"] = []
self.factory_error_df = factory_df.reset_index(drop=True)
if not write_files:
return
@@ -910,12 +926,12 @@ class SimulationModel(Model):
factory_pivot.to_csv(factory_report_path, index=False, encoding="utf-8-sig")
# Error summary based on cumulative deviation ratio (unitless, consistent with GA)
err_rows = []
metric_col = "最大累计偏差" if self.use_error_max else "平均累计偏差"
for fname, ratio_series in cum_ratio_by_factory.items():
metric_val = ratio_series.abs().max() if self.use_error_max else ratio_series.abs().mean()
err_rows.append({"工厂名称": fname, metric_col: float(metric_val)})
error_df = pd.DataFrame(err_rows) if err_rows else pd.DataFrame(columns=["工厂名称", metric_col])
error_df = (
pd.DataFrame([{ "工厂名称": name, metric_col: val} for name, val in factory_metric.items()])
if factory_metric
else pd.DataFrame(columns=["工厂名称", metric_col])
)
error_path = os.path.join(output_dir, f"factory_error_{timestamp}.csv")
error_df.to_csv(error_path, index=False, encoding="utf-8-sig")
@@ -938,22 +954,11 @@ class SimulationModel(Model):
plt.savefig(month_plot_path)
plt.close()
factory_df = pd.DataFrame(
{
"name": list(cum_ratio_by_factory.keys()),
"error_ratio": [
(pct.abs().max() if self.use_error_max else pct.abs().mean()) for pct in cum_ratio_by_factory.values()
],
}
)
factory_df = factory_df.sort_values(by="error_ratio")
factory_df["error_pct"] = factory_df["error_ratio"] * 100
self.factory_error_df = factory_df.reset_index(drop=True)
plt.figure(figsize=(12, 6))
ax = factory_df["error_pct"].reset_index(drop=True).plot(kind="bar")
metric_label = "最大" if self.use_error_max else "平均"
plt.ylabel(f"{metric_label}????[%]")
plt.title(f"????{metric_label}?????????")
plt.ylabel(f"{metric_label}误差[%]")
plt.title(f"工厂{metric_label}累计偏差分布")
plt.tight_layout()
for idx, row in factory_df.reset_index(drop=True).iterrows():
val = row["error_pct"]