public override Csucs KeresCiklussal(Csucs start) { Csucs akt = start; while (akt != null) { if (akt.TerminalisE()) { return(akt); } if (akt.Melyseg >= melysegiKorlat) { akt = akt.Szulo; } Csucs gyermek = akt.KovetkezoGyermek(); if (gyermek == null) { akt = akt.Szulo; } else { akt = gyermek; } } return(null); }
/// <summary> /// Két naprendszer összekötő útat keres meg /// </summary> /// <param name="startSystem"></param> /// <param name="endSystem"></param> /// <returns>Az útvonal elemeinek a listájával tér vissza</returns> public List <SolarSystem> FindWay(SolarSystem startSystem, SolarSystem endSystem) { List <SolarSystem> path = new List <SolarSystem>(); AbsztraktAllapot Szk = new SolarSystemAllapot(startSystem, endSystem, game.Systems); GrafKereso Gk = new BackTrack(5); Csucs celcsucs = Gk.Keres(new Csucs(Szk)); if (celcsucs == null) { Debug.Log("Nemjó"); } else { Csucs cs = celcsucs; path.Add(cs.allapot.getCurrentSolarSystem()); while (cs != null) { cs = cs.Szulo; path.Add(cs.allapot.getCurrentSolarSystem()); } } return(path); }
public override Csucs Keres(Csucs akt) { // ha akt terminális, akkor kész, visszadom őt if (akt.TerminalisE()) { return(akt); } // ha alértem a mélységi korlátot, akkor visszalépés if (akt.Melyseg >= melysegiKorlat) { return(null); } // elenkező esetben lépek egyet előre // azaz legyártom a gyermeket Csucs terminalis = null; while (terminalis == null) { Csucs gyermek = akt.KovetkezoGyermek(); if (gyermek == null) { return(null); // ha reku, akkor ez a visszalépés } terminalis = Keres(gyermek); //reku ameddig, level elemhez nem erunk } return(terminalis); }
public Csucs(Allapot allapot, Operator eloallito, Csucs szulo, double heurisztika) { this.allapot = allapot; this.eloallito = eloallito; this.szulo = szulo; this.heurisztika = heurisztika; }
public Csucs KovetkezoGyermek() { AbsztraktAllapot kovAllapot = null; while (kovAllapot == null || KorFigyeles(kovAllapot)) { if (legutobbiOp == allapot.OperatorokSzama()) { break; } kovAllapot = allapot.SzuperOperator(this.legutobbiOp); legutobbiOp++; } if (kovAllapot == null) { return(null); } Csucs gyermek = new Csucs(kovAllapot); gyermek.allapot = kovAllapot; gyermek.melyseg = this.melyseg + 1; gyermek.szulo = this; gyermek.legutobbiOp = 0; return(gyermek); }
//Konstruktor public Csucs(AbsztraktAllapot k) { this.allapot = k; this.melyseg = 0; this.szulo = null; this.legutobbiOp = 0; // hívás után kell növelni }
//Medódusok bool KorFigyeles(AbsztraktAllapot ujAllapot) { Csucs cs = this; while (cs != null) { if (cs.allapot.Equals(ujAllapot)) { return(true); } cs = cs.szulo; } return(false); }
public static float RandomEl(Csucs honnan, Csucs hova, List <El> elek) { var el = elek.FirstOrDefault(e => e.Honnan == honnan && e.Hova == hova); if (el == null) { throw new ArgumentException("Random élbeállítás hiba. Nincs él a két csúcs között"); } var rdn = new Random(); el.Tavolsag = rdn.Next(1, 11); return(el.Tavolsag); }
public abstract Csucs KeresCiklussal(Csucs start);
public abstract Csucs Keres(Csucs start);
public El(Csucs honnan, Csucs hova, float tavolsag) { Honnan = honnan; Hova = hova; Tavolsag = tavolsag; }
public List <Operator> keres(Problema p, Heurisztika h) { LinkedList <Csucs> nyiltak = new LinkedList <Csucs>(); LinkedList <Csucs> zartak = new LinkedList <Csucs>(); int aktualisBabu = 500; int babu = Utes(p.kezdo(), p); h.heurisztika = h.heur(p.kezdo(), babu); nyiltak.AddLast(new Csucs(p.kezdo(), null, null, h.heurisztika)); while (true) { if (!nyiltak.Any()) { return(null); } Csucs kivalasztott = null; foreach (Csucs c in nyiltak) { //0 = király, 1 = huszár 500=rossz int cBabu = Utes(c.allapot, p); if (cBabu != 500) { c.heurisztika = h.heur(c.allapot, cBabu); if ((kivalasztott == null || kivalasztott.heurisztika > c.heurisztika)) { kivalasztott = c; aktualisBabu = cBabu; } } else { continue; } } if (kivalasztott.allapot.cel()) { LinkedList <Operator> megoldas = new LinkedList <Operator>(); for (Csucs c = kivalasztott; c.szulo != null; c = c.szulo) { megoldas.AddFirst(c.eloallito); } return(megoldas.ToList()); } nyiltak.Remove(kivalasztott); zartak.AddLast(kivalasztott); if (aktualisBabu != 500) { foreach (Operator o in p.operatorok) { if (o.babu == aktualisBabu) { if (o.alkalmazhato(kivalasztott.allapot)) { Allapot uj = o.lepes(kivalasztott.allapot); bool voltMar = false; foreach (Csucs c in nyiltak) { if (c.allapot.GetHashCode() == uj.GetHashCode()) { voltMar = true; break; } } if (!voltMar) { foreach (Csucs c in zartak) { if (c.allapot.GetHashCode() == uj.GetHashCode()) { voltMar = true; break; } } } if (!voltMar) { nyiltak.AddLast(new Csucs(uj, o, kivalasztott, h.heur(uj, aktualisBabu))); } } } else { continue; } } } } }
static void Main(string[] args) { try { var m1 = new HadtortenetiMuzeum(); var csucs1 = new Csucs(m1); var m2 = new IparmuveszetiMuzeum(); var csucs2 = new Csucs(m2); var m3 = new NeprajziMuzeum(); var csucs3 = new Csucs(m3); var m4 = new SzepmuveszetiMuzeum(); var csucs4 = new Csucs(m4); var m5 = new Babamuzeum(); var csucs5 = new Csucs(m5); m1.HasonloMuzeumokElejereBeszur(m2); m1.HasonloMuzeumokElejereBeszur(m3); m1.HasonloMuzeumokElejereBeszur(m4); var hasonlo = m1.HasonloMuzeumok(); m1.HasonloMuzeumTorol(m3); var hasonlo2 = m1.HasonloMuzeumok(); var graf = new Graf(); graf.CsucsHozzaad(csucs1); graf.CsucsHozzaad(csucs2); graf.CsucsHozzaad(csucs3); graf.CsucsHozzaad(csucs4); graf.CsucsHozzaad(csucs5); var el1_2 = new El(csucs1, csucs2, 10); var el1_3 = new El(csucs1, csucs3, 1); var el1_4 = new El(csucs1, csucs4, 1); var el2_3 = new El(csucs3, csucs2, 2); var el2_4 = new El(csucs2, csucs2, 4); var el3_4 = new El(csucs3, csucs4, 1); var el4_5 = new El(csucs4, csucs5, 1); graf.ElHozzaad(el1_2); graf.ElHozzaad(el1_3); graf.ElHozzaad(el1_4); graf.ElHozzaad(el2_3); graf.ElHozzaad(el2_4); graf.ElHozzaad(el3_4); graf.ElHozzaad(el4_5); var utvonalGraf = graf.UtvonalGraf(csucs1, csucs5, new[] { csucs3 }); graf.EleketFrissit(RandomEl); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
static void Main(string[] args) { #region Látványosságokat és csúcsokat létrehoz var budaiVar = new Var("Budai vár", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var budaivarCsucs = new Csucs(budaiVar); var matyasTemplom = new Templom("Mátyás Templom", 1800, Latvanyossagok.ErdekessegiSzint.NagyonJó); var matyasTemplomCsucs = new Csucs(matyasTemplom); var halaszBastya = new Kilato("Halászbástya", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var halaszBastyaCsucs = new Csucs(halaszBastya); var citadella = new Kilato("Citadella", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var citadellaCsucs = new Csucs(citadella); var parlament = new Egyeb("Parlament", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var parlamentCsucs = new Csucs(parlament); var gellertFurdo = new Furdo("Gellért fürdő", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var gellertFurdoCsucs = new Csucs(gellertFurdo); var margitSziget = new Egyeb("Margit Sziget", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var margitSzigetCsucs = new Csucs(margitSziget); var budapestEye = new Kilato("Budapest Eye", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var budapestEyeCsucs = new Csucs(budapestEye); var bazilika = new Templom("Szent István Bazilika", 1000, Latvanyossagok.ErdekessegiSzint.NagyonJó); var bazilikaCsucs = new Csucs(bazilika); var zsinagoga = new Templom("Dohány utcai Zsinagóga", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var zsinagogaCsucs = new Csucs(zsinagoga); var hosokTere = new Egyeb("Hősök tere", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var hosokTereCsucs = new Csucs(hosokTere); var vajdaHunyadVara = new Var("Vajdahunyad vára", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var vajdaHunyadVaraCsucs = new Csucs(vajdaHunyadVara); var szechenyiFurdo = new Furdo("Széchenyi fürdő", 4500, Latvanyossagok.ErdekessegiSzint.EgészJó); var szechenyiFurdoCsucs = new Csucs(szechenyiFurdo); //Várak budaiVar.HasonloLatvanyossagHozzaad(vajdaHunyadVara); vajdaHunyadVara.HasonloLatvanyossagHozzaad(budaiVar); //Egyéb parlament.HasonloLatvanyossagHozzaad(margitSziget); parlament.HasonloLatvanyossagHozzaad(hosokTere); margitSziget.HasonloLatvanyossagHozzaad(parlament); margitSziget.HasonloLatvanyossagHozzaad(hosokTere); hosokTere.HasonloLatvanyossagHozzaad(parlament); hosokTere.HasonloLatvanyossagHozzaad(margitSziget); //Fürdők gellertFurdo.HasonloLatvanyossagHozzaad(szechenyiFurdo); szechenyiFurdo.HasonloLatvanyossagHozzaad(gellertFurdo); //Kilátók halaszBastya.HasonloLatvanyossagHozzaad(citadella); halaszBastya.HasonloLatvanyossagHozzaad(budapestEye); citadella.HasonloLatvanyossagHozzaad(halaszBastya); citadella.HasonloLatvanyossagHozzaad(budapestEye); budapestEye.HasonloLatvanyossagHozzaad(halaszBastya); budapestEye.HasonloLatvanyossagHozzaad(citadella); //Templomok matyasTemplom.HasonloLatvanyossagHozzaad(bazilika); matyasTemplom.HasonloLatvanyossagHozzaad(zsinagoga); bazilika.HasonloLatvanyossagHozzaad(matyasTemplom); bazilika.HasonloLatvanyossagHozzaad(zsinagoga); zsinagoga.HasonloLatvanyossagHozzaad(matyasTemplom); zsinagoga.HasonloLatvanyossagHozzaad(bazilika); #endregion #region gráfok #region gráf létrehozása, csúcsok felvétele Graf graf = new Graf(); graf.UjCsucs(budaivarCsucs); graf.UjCsucs(matyasTemplomCsucs); graf.UjCsucs(halaszBastyaCsucs); graf.UjCsucs(citadellaCsucs); graf.UjCsucs(parlamentCsucs); graf.UjCsucs(gellertFurdoCsucs); graf.UjCsucs(margitSzigetCsucs); graf.UjCsucs(budapestEyeCsucs); graf.UjCsucs(bazilikaCsucs); graf.UjCsucs(zsinagogaCsucs); graf.UjCsucs(hosokTereCsucs); graf.UjCsucs(vajdaHunyadVaraCsucs); graf.UjCsucs(szechenyiFurdoCsucs); #endregion #region Élek hozzáadása graf.ElHozzaad(new El(budaivarCsucs, matyasTemplomCsucs, 1)); graf.ElHozzaad(new El(budaivarCsucs, halaszBastyaCsucs, 1)); graf.ElHozzaad(new El(matyasTemplomCsucs, parlamentCsucs, 3)); graf.ElHozzaad(new El(halaszBastyaCsucs, matyasTemplomCsucs, 1)); // graf.ElHozzaad(new El(citadellaCsucs, budaivarCsucs, 5)); // graf.ElHozzaad(new El(parlamentCsucs, gellertFurdoCsucs, 3)); graf.ElHozzaad(new El(parlamentCsucs, margitSzigetCsucs, 5)); graf.ElHozzaad(new El(parlamentCsucs, budapestEyeCsucs, 2)); graf.ElHozzaad(new El(parlamentCsucs, bazilikaCsucs, 2)); graf.ElHozzaad(new El(parlamentCsucs, zsinagogaCsucs, 2)); graf.ElHozzaad(new El(parlamentCsucs, hosokTereCsucs, 4)); // graf.ElHozzaad(new El(parlamentCsucs, citadellaCsucs, 5)); graf.ElHozzaad(new El(gellertFurdoCsucs, parlamentCsucs, 3)); graf.ElHozzaad(new El(margitSzigetCsucs, budapestEyeCsucs, 3)); graf.ElHozzaad(new El(budapestEyeCsucs, bazilikaCsucs, 1)); // graf.ElHozzaad(new El(bazilikaCsucs, parlamentCsucs, 2)); graf.ElHozzaad(new El(bazilikaCsucs, zsinagogaCsucs, 2)); graf.ElHozzaad(new El(zsinagogaCsucs, hosokTereCsucs, 4)); graf.ElHozzaad(new El(hosokTereCsucs, vajdaHunyadVaraCsucs, 1)); graf.ElHozzaad(new El(vajdaHunyadVaraCsucs, szechenyiFurdoCsucs, 1)); // graf.ElHozzaad(new El(szechenyiFurdoCsucs, parlamentCsucs, 5)); #endregion #endregion Console.WriteLine("------------------ FŐ PROGRAM -------"); Turista turista; string nev; Console.WriteLine("Kérlek, add meg a neved!"); nev = Console.ReadLine(); turista = new Turista(nev); while (true) { Console.Clear(); GrafCsucsokFelhasznaloValasztashoz(graf); Console.WriteLine("Kedves {0}! Kérlek, válassz kiindulási pontot!\n", turista.Nev); int indulas = Convert.ToInt16(Console.ReadLine()); Console.WriteLine(graf.Csucsok[indulas].Latvanyossag.Nev); Console.WriteLine("Kedves {0}! Kérlek, válassz célpontot!\n", turista.Nev); int erkezes = Convert.ToInt16(Console.ReadLine()); Console.WriteLine(graf.Csucsok[erkezes].Latvanyossag.Nev); Console.WriteLine(); // Dijkstra.DijkstraAlgo(GrafToMatrix(graf), 0, 8, graf); //TombKiir(GrafToMatrix(graf)); Map terkep = new Map(); List <Csucs> utvonal = Utkereses.LegrovidebbUt(terkep, graf.Csucsok[indulas], graf.Csucsok[erkezes], graf); turista.Utvonal = utvonal; turista.Utvonal.Add(budaivarCsucs); turista.Utvonal.Add(parlamentCsucs); foreach (Csucs latvany in turista.Utvonal) { Console.Write(latvany.Latvanyossag.Nev + " => "); } Console.WriteLine("VEGE"); Console.ReadLine(); } }