private void BackTrack(PfadKandidat kandidat) { if (this.Reject(kandidat)) { return; } if (this.Accept(kandidat)) { this.akzeptiertePfadKandidaten.Add(kandidat); return; } Haltestelle zielhaltestelle; if (kandidat.StreckenCount == 0) { zielhaltestelle = kandidat.Starthaltestelle; } else { var zielhaltestellenname = kandidat.Zielhaltestellenname; zielhaltestelle = this.FindHaltestelle(zielhaltestellenname); } foreach (var strecke in zielhaltestelle.Strecken) { var nextKandidat = kandidat.Clone(); nextKandidat.AddStrecke(strecke); this.kandidaten.Add(nextKandidat); } }
public void Alle_Pfade_bestimmen(Netzplan netzplan, string starthaltestellenname, string zielhaltestellenname) { this.netzplan = netzplan; if (this.netzplan == null) { throw new ArgumentNullException("netzplan"); } this.starthaltestelle = this.FindHaltestelle(starthaltestellenname); if (this.starthaltestelle == null) { throw new InvalidOperationException("Starthaltestelle nicht gefunden"); } this.zielhaltestelle = FindHaltestelle(zielhaltestellenname); if (this.zielhaltestelle == null) { throw new InvalidOperationException("Zielhaltestelle nicht gefunden"); } var initialKandidat = new PfadKandidat(starthaltestelle); this.StarteSuche(initialKandidat, numberOfWorkers: 7); this.StarteAusgabe(); this.OutputEndOfSteam(); }
private Boolean Accept(PfadKandidat kandidat) { if (kandidat.StreckenCount == 0) { return false; } if (kandidat.Zielhaltestellenname == this.zielhaltestelle.Name) { return true; } return false; }
private void StarteSuche(PfadKandidat initial_kandidat, int numberOfWorkers) { this.kandidaten = new ConcurrentBag<PfadKandidat>(new[] { initial_kandidat }); this.akzeptiertePfadKandidaten = new ConcurrentBag<PfadKandidat>(); while (numberOfWorkers > 0) { var handle = Task.Run(() => this.ProduziereKandidat()); numberOfWorkers--; } while (this.numberOfRunningWorkers == 0) { Thread.Yield(); } }
private Boolean Reject(PfadKandidat kandidat) { if (kandidat.StreckenCount == 0) { return false; } var lastHaltestellenname = kandidat.Zielhaltestellenname; if (lastHaltestellenname == this.starthaltestelle.Name) { return true; } if (kandidat.Strecken.Skip(1).Any(s => s.Zielhaltestellenname == lastHaltestellenname)) { return true; } return false; }
private void Output(PfadKandidat kandidat) { if (this.OnPfad != null) { this.OnPfad(kandidat.ErstellePfad()); } }