Skip to content

Instantly share code, notes, and snippets.

@battermann
Created March 21, 2014 00:02
Show Gist options
  • Save battermann/9676752 to your computer and use it in GitHub Desktop.
Save battermann/9676752 to your computer and use it in GitHub Desktop.
ISOP
public class Optimalstrategie : IStrategie
{
private List<Schnitt> _ausgangsgroessen;
private Schnittverteilung _best;
private ILaufzeitMonitor _monitor;
public Optimalstrategie(ILaufzeitMonitor monitor)
{
_monitor = monitor;
_best = null;
_ausgangsgroessen = new List<Schnitt>() { new Schnitt(2), new Schnitt(3), new Schnitt(4), new Schnitt(5) };
}
public Schnittverteilung Berechne(IAuftrag auftrag)
{
Task task = new Task(() => BerechneRek(auftrag.Auftragsstuecke, new Schnittverteilung()));
task.Start();
_monitor.Pruefe(task);
task.Wait();
return _best;
}
private void BerechneRek(List<double> reste, Schnittverteilung verteilung)
{
Action<List<double>, Schnittverteilung> berechneRek = (l, sv) => BerechneRek(l, sv);
Action pruefeLoesung = () => PruefeLoesung(verteilung, () => { _best = new Schnittverteilung(verteilung); });
Action verarbeiteReststuecke = () => VerarbeiteReststuecke(reste, verteilung, berechneRek);
PruefenObRestVorhandenIst(reste, verarbeiteReststuecke, pruefeLoesung);
}
private void PruefenObRestVorhandenIst(List<double> reste, Action onRest, Action onKeinRest)
{
if (reste.Count == 0)
{
onKeinRest();
}
else
{
onRest();
}
}
private void PruefeLoesung(Schnittverteilung verteilung, Action onBessereGefunden)
{
if (_best == null || verteilung.Gesamtverschnitt < _best.Gesamtverschnitt)
{
onBessereGefunden();
}
else if (verteilung.Gesamtverschnitt == _best.Gesamtverschnitt && verteilung.Schnittanzahl < _best.Schnittanzahl)
{
onBessereGefunden();
}
}
private void VerarbeiteReststuecke(List<double> reste, Schnittverteilung verteilung, Action<List<double>, Schnittverteilung> berechneRek)
{
var restStueck = reste[0];
reste.RemoveAt(0);
for (int i = 0; i < verteilung.Schnitte.Count(); i++)
{
if (restStueck <= Math.Round(verteilung.Schnitte[i].Verschnitt, 2))
{
var verteilungKopie = new Schnittverteilung(verteilung);
verteilungKopie.Schnitte[i].FuegeHinzu(restStueck);
berechneRek(reste, verteilungKopie);
}
}
foreach (var neuesStueck in _ausgangsgroessen)
{
if (restStueck <= Math.Round(neuesStueck.Laenge, 2))
{
var neuesStueckKopie = new Schnitt(neuesStueck.Laenge);
neuesStueckKopie.FuegeHinzu(restStueck);
var verteilungKopie = new Schnittverteilung(verteilung);
verteilungKopie.Schnitte.Add(neuesStueckKopie);
berechneRek(reste, verteilungKopie);
}
}
reste.Add(restStueck);
}
}
@thomasw-mitutoyo-ctl
Copy link

    if (_best == null || verteilung.Gesamtverschnitt < _best.Gesamtverschnitt)
    {
        onBessereGefunden();
    }
    else if (verteilung.Gesamtverschnitt == _best.Gesamtverschnitt && verteilung.Schnittanzahl < _best.Schnittanzahl)
    {
        onBessereGefunden();
    }

Das sieht für mich komisch aus (DRY). Warum das zweite if nicht als || in die erste Bedingung?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment