fix: Toleranz bei Relaxationsschranke, Grund bei fehlgeschlagenem Szenario

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-09-17 14:22:22 +02:00
commit ee9a193cd7

View file

@ -396,7 +396,9 @@ def check_sensitivity(run, sense: str) -> list:
Die Richtung hängt am Sinn der Restriktion und daran, ob maximiert oder minimiert wird.
"""
warnings = []
besser = (lambda a, b: a > b) if sense == "maximize" else (lambda a, b: a < b)
# mit Toleranz: beobachtet Schranke 0.13896862211718014 gegen Lösung ...17 als „schlechter" gemeldet
besser = ((lambda a, b: a > b + _tolerance(b)) if sense == "maximize"
else (lambda a, b: a < b - _tolerance(b)))
by_name = {c.name: c for c in run.constraints}
for s in run.sensitivity:
constraint = by_name.get(s.name)
@ -566,7 +568,9 @@ def check_multistart(run, sense: str) -> list:
if m is None:
return []
warnings = []
besser = (lambda a, b: a > b) if sense == "maximize" else (lambda a, b: a < b)
# mit Toleranz: beobachtet Schranke 0.13896862211718014 gegen Lösung ...17 als „schlechter" gemeldet
besser = ((lambda a, b: a > b + _tolerance(b)) if sense == "maximize"
else (lambda a, b: a < b - _tolerance(b)))
if m.converged > m.starts or m.converged < 0:
warnings.append(f"Mehrstart: {m.converged} erfolgreiche von {m.starts} Startpunkten ist nicht möglich.")
elif m.converged < 2:
@ -685,7 +689,9 @@ def verify_scenarios(run, code: str, timeout: int = 60, data_files=()) -> list:
data_files=data_files)
szenario.verified_value = nachlauf.objective_value
if nachlauf.status == SolverStatus.ERROR:
warnings.append(f"Szenario '{szenario.name}' ließ sich nicht nachrechnen: {(nachlauf.error or '')[:120]}")
grund = (nachlauf.error or "").strip()[:120] or (
"das Programm meldete selbst Status 'error' ohne Fehlertext (z. B. keine Lösung im Zeitlimit)")
warnings.append(f"Szenario '{szenario.name}' ließ sich nicht nachrechnen: {grund}")
elif (szenario.objective_value is not None and nachlauf.objective_value is not None
and abs(szenario.objective_value - nachlauf.objective_value)
> 1e-6 * max(1.0, abs(szenario.objective_value))):