Ejemplo n.º 1
0
    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;
                    }
                }
            }
        }
    }