Created
March 21, 2014 00:02
-
-
Save battermann/9676752 to your computer and use it in GitHub Desktop.
ISOP
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Das sieht für mich komisch aus (DRY). Warum das zweite if nicht als || in die erste Bedingung?