private void GetDrum(Retea retea, Nod nodStoc, Nod nodSursa)
        {
            nodStoc.Distanta = 0;
            Stack <Nod> stack = new Stack <Nod>();

            List <Drum> drumuri = new List <Drum>();

            List <Nod> noduriDrum = new List <Nod>();

            stack.Push(nodStoc);

            while (stack.Count() != 0)
            {
                Nod nodCurent = stack.Pop();
                noduriDrum.Add(nodCurent);

                if (nodCurent.Id == nodSursa.Id)
                {
                    noduriDrum.Reverse();
                    drumuri.Add(new Drum(retea, noduriDrum));
                    noduriDrum = new List <Nod>();
                }

                List <Arc> arce = retea.Arce.Where(arc => arc.Y.Id == nodCurent.Id && arc.X.Id == nodCurent.Predecesor.Id).ToList();

                arce.ForEach(a => {
                    stack.Push(a.X);
                });
            }
        }
Ejemplo n.º 2
0
        public double GetValoareMaxima(Retea retea)
        {
            Console.WriteLine("Retea initiala: \n");
            Console.WriteLine(retea.ToString());

            Retea reteaUpdatata = UpdateRetea(retea);

            return(reteaUpdatata.GetValoareMaxima());
        }
Ejemplo n.º 3
0
        private void InaintareReetichetare(Retea retea, Nod x)
        {
            List <Arc> arceDinX = retea.Arce.Where(a => a.X.Id == x.Id).OrderBy(a => a.Y.Id).ToList();

            Queue <Arc> coadaArce = new Queue <Arc>(arceDinX);
            Arc         arc       = coadaArce.Dequeue();

            bool esteReetichetat = false;

            do
            {
                if (arc.EsteAdmisibil(retea))
                {
                    arc.Flux += Math.Min(x.GetExces(retea), arc.GetCapacitateReziduala(retea));

                    Arc arcInvers = retea.Arce.FirstOrDefault(a => a.X.Id == arc.Y.Id && a.Y.Id == arc.X.Id);

                    if (arcInvers == null)
                    {
                        arcInvers = new Arc(arc.Y, arc.X, 0, 0);
                        retea.Arce.Add(arcInvers);
                    }

                    if (!_L.Contains(arc.Y) && !arc.Y.EsteNodSursa && !arc.Y.EsteNodStoc)
                    {
                        _L.Enqueue(arc.Y);
                    }
                }

                if (x.GetExces(retea) > 0)
                {
                    if (coadaArce.Count() > 0)
                    {
                        arc = coadaArce.Dequeue();
                    }
                    else
                    {
                        x.Distanta = arceDinX.Where(a => a.GetCapacitateReziduala(retea) > 0).Min(a => a.Y.Distanta + 1);

                        esteReetichetat = true;
                    }
                }

                Console.WriteLine(retea.ToString());

                Console.Write("Distante:");
                retea.Noduri.Select(n => n.Distanta).ToList().ForEach(d => Console.Write($"{d}, "));
                Console.WriteLine("\n");
            } while (x.GetExces(retea) != 0 && !esteReetichetat);

            if (x.GetExces(retea) > 0)
            {
                _L.Enqueue(x);
            }
        }
Ejemplo n.º 4
0
        public Retea UpdateRetea(Retea retea)
        {
            Initializare(retea);

            while (_L.Count() != 0)
            {
                Nod nod = _L.Dequeue();
                InaintareReetichetare(retea, nod);
            }

            return(retea);
        }
Ejemplo n.º 5
0
        //private void Marire(Retea retea)
        //{
        //   Console.WriteLine("\n\n");
        //   Console.WriteLine(retea.ToString());

        //   Drum drum = CreeazaDrum(retea);
        //   Console.WriteLine(drum.AsString(retea));

        //   drum.Arce.ForEach(arc => arc.Flux += drum.GetCapacitateRezidualaMin(retea));

        //   //todo: check if arcs are updated by reference
        //}

        private void Marire(Retea retea)
        {
            //Console.WriteLine("\n\n");
            //Console.WriteLine(retea.ToString());

            Drum drum = CreeazaDrum(retea);
            //Console.WriteLine(drum.AsString(retea));


            double r = drum.GetCapacitateRezidualaMin(retea);

            Console.WriteLine($"{drum.AsString(retea)} | r(D)={r}");
            if (r > 0)
            {
                drum.Arce.ForEach(arc => {
                    arc.Flux += r;

                    Arc arcRetea   = retea.Arce.FirstOrDefault(a => a.X.Id == arc.X.Id && a.Y.Id == arc.Y.Id);
                    arcRetea.Flux += r;

                    Arc arcInvers = retea.Arce.FirstOrDefault(a => a.X.Id == arc.Y.Id && a.Y.Id == arc.X.Id);

                    if (arcInvers == null)
                    {
                        arcInvers = new Arc(arc.Y, arc.X, 0, 0);
                        retea.Arce.Add(arcInvers);
                    }
                    else
                    {
                        if (arcInvers.GetCapacitateReziduala(retea) <= 0)
                        {
                            retea.Arce.Remove(arcInvers);
                        }
                    }

                    if (arcRetea.GetCapacitateReziduala(retea) <= 0)
                    {
                        retea.Arce.Remove(arcRetea);
                    }
                });

                Console.WriteLine("\n\n");
                Console.WriteLine(retea.ToString());
                Console.WriteLine($"Max value: {retea.GetValoareMaxima()}");
            }

            //todo: check if arcs are updated by reference
        }
        public Retea UpdateRetea(Retea retea)
        {
            // Initializarea listei de noduri etichetate si neanalizate din retea (V)
            Queue <Nod> V = new Queue <Nod>();

            Nod nodSursa = retea.Noduri.FirstOrDefault(nod => nod.EsteNodSursa);
            Nod nodStoc  = retea.Noduri.FirstOrDefault(nod => nod.EsteNodStoc);

            do
            {
                V = new Queue <Nod>();

                // Setarea predecesorilor nodurilor din retea cu 0/null
                retea.Noduri.ForEach(n => { n.Predecesor = null; });

                // Adaugarea nodului sursa in lista V, lista de noduri etichetate si neanalizate
                V.Enqueue(nodSursa);

                nodSursa.Predecesor = nodStoc;

                while (V?.Count() > 0 && nodStoc.Predecesor == null)
                {
                    // Se extrage un nod x din NoduriEtichetateNeanalizate (V)
                    Nod x = V.Dequeue();

                    // FOR (x,y) din A(f) do
                    List <Arc> arceDinX = retea.Arce.Where(arc => arc.X.Id == x.Id).ToList();

                    arceDinX.Where(arc => arc.GetCapacitateReziduala(retea) > 0)
                    .OrderBy(arc => arc.Y.Id).ToList()
                    .ForEach(arc => {
                        // IF p[y]!=0 THEN
                        if (arc.Y.Predecesor == null)
                        {
                            arc.Y.Predecesor = arc.X; // p[y] = x
                            V.Enqueue(arc.Y);         // V = V U {y}
                        }
                    });
                }

                if (nodStoc.Predecesor != null)
                {
                    Marire(retea);
                }
            } while (nodStoc.Predecesor != null);

            return(retea);
        }
Ejemplo n.º 7
0
        private bool TryGetArcAdmisibil(Retea retea, Nod nod, out Arc arcAdmisibil)
        {
            List <Arc> arce = retea.Arce.Where(arc => arc.X.Id == nod.Id && arc.EsteAdmisibil(retea)).ToList();

            if (arce?.Count() == 0)
            {
                arcAdmisibil = null;
                return(false);
            }

            Random random = new Random();
            int    index  = random.Next(0, arce.Count - 1);

            arcAdmisibil = arce[index];

            return(true);
        }
Ejemplo n.º 8
0
        public Retea UpdateRetea(Retea retea)
        {
            Nod nodSursa = retea.Noduri.FirstOrDefault(nod => nod.EsteNodSursa);
            Nod nodStoc  = retea.Noduri.FirstOrDefault(nod => nod.EsteNodStoc);

            retea.Arce.ForEach(arc => arc.Flux = 0);
            Nod x = nodSursa;

            SetDistances(retea, nodStoc);

            while (nodSursa.Distanta < retea.Noduri.Count)
            {
                if (TryGetArcAdmisibil(retea, x, out Arc arcAdmisibil))
                {
                    arcAdmisibil.Y.Predecesor = x;
                    x = arcAdmisibil.Y;

                    if (x.Id == nodStoc.Id)
                    {
                        Marire(retea);
                        x = nodSursa;
                    }
                }
                else
                {
                    List <Arc> arceDinX = retea.Arce.Where(arc => arc.X.Id == x.Id).ToList();

                    if (arceDinX?.Count() == 0)
                    {
                        x.Distanta++;
                    }
                    else
                    {
                        x.Distanta = arceDinX.Min(a => a.Y.Distanta + 1);
                    }

                    if (x.Id != nodSursa.Id)
                    {
                        x = x.Predecesor;
                    }
                }
            }

            return(retea);
        }
Ejemplo n.º 9
0
        private void SetDistances(Retea retea, Nod nodStoc)
        {
            nodStoc.Distanta = 0;
            Queue <Nod> noduriVizitate = new Queue <Nod>();

            noduriVizitate.Enqueue(nodStoc);

            while (noduriVizitate.Count() != 0)
            {
                Nod        nodCurent = noduriVizitate.Dequeue();
                List <Arc> arce      = retea.Arce.Where(arc => arc.Y.Id == nodCurent.Id).ToList();

                arce.ForEach(a => {
                    a.X.Distanta = a.Y.Distanta + 1;
                    noduriVizitate.Enqueue(a.X);
                });
            }
        }
Ejemplo n.º 10
0
        private Drum CreeazaDrum(Retea retea)
        {
            List <Nod> noduri = new List <Nod>();

            Nod nodStoc   = retea.Noduri.FirstOrDefault(nod => nod.EsteNodStoc);
            Nod nodCurent = nodStoc;

            while (nodCurent.Predecesor != null && nodCurent.Predecesor.Id != nodStoc.Id)
            {
                noduri.Add(nodCurent);
                nodCurent = nodCurent.Predecesor;
            }
            noduri.Add(nodCurent);
            noduri.Reverse();

            Drum drum = new Drum(retea, noduri);

            return(drum);
        }
        private void Marire(Retea retea)
        {
            Console.WriteLine("\n\n");
            Console.WriteLine($"MARIRE FLUX NR.{_nrIteratie}: ");

            _nrIteratie++;

            // Predecesori
            List <Nod> predecesori = new List <Nod>();

            retea.Noduri.ForEach(n => predecesori.Add(n.Predecesor));

            Console.Write("Predecesori: ");
            predecesori.ForEach(p => Console.Write($"{((p != null) ? p.ToString() : "-")}, "));

            // Creare drum
            Drum   drum  = CreeazaDrum(retea);
            double rDrum = drum.GetCapacitateRezidualaMin(retea);

            Console.WriteLine($"{drum.AsString(retea)} | r(D)={rDrum}");
            Console.WriteLine();

            if (rDrum > 0)
            {
                drum.Arce.ForEach(arc => {
                    arc.Flux += rDrum;

                    Arc arcInvers = retea.Arce.FirstOrDefault(a => a.X.Id == arc.Y.Id && a.Y.Id == arc.X.Id);

                    if (arcInvers == null)
                    {
                        arcInvers = new Arc(arc.Y, arc.X, 0, 0);
                        retea.Arce.Add(arcInvers);
                    }
                });

                Console.WriteLine(retea.ToString());
                Console.WriteLine($"Max value: {retea.GetValoareMaxima()}");
            }
        }
Ejemplo n.º 12
0
        private void Initializare(Retea retea)
        {
            _nodSursa = retea.Noduri.FirstOrDefault(nod => nod.EsteNodSursa);
            _nodStoc  = retea.Noduri.FirstOrDefault(nod => nod.EsteNodStoc);

            retea.Arce.ForEach(arc => arc.Flux = 0);

            _L = new Queue <Nod>();
            SetDistances(retea, _nodStoc);

            retea.Arce.Where(a => a.X.Id == _nodSursa.Id).ToList()
            .ForEach(arc => {
                arc.Flux += arc.GetCapacitateReziduala(retea);

                Arc arcInvers = retea.Arce.FirstOrDefault(a => a.X.Id == arc.Y.Id && a.Y.Id == arc.X.Id);

                if (arcInvers == null)
                {
                    arcInvers = new Arc(arc.Y, arc.X, 0, 0);
                    retea.Arce.Add(arcInvers);
                }

                if (arc.Y.GetExces(retea) > 0 && arc.Y.Id != _nodStoc.Id)
                {
                    _L.Enqueue(arc.Y);
                }
            });

            _nodSursa.Distanta = retea.Noduri.Count();

            Console.WriteLine("\nRetea initializata in Preflux FIFO");
            Console.WriteLine(retea.ToString());

            Console.Write("Distante: ");
            retea.Noduri.Select(n => n.Distanta).ToList().ForEach(d => Console.Write($"{d}, "));

            Console.WriteLine("\n");
        }
Ejemplo n.º 13
0
        public double GetMaxValue(Retea retea)
        {
            Retea reteaUpdatata = UpdateRetea(retea);

            return(reteaUpdatata.GetValoareMaxima());
        }
        public static void Main(string[] args)
        {
            Data data = DataProvider.Instance.ReadData("DateProblema.txt");

            Retea retea = new Retea();

            int nrNoduri = data.NrAsociatii + data.NrLocuitori + data.NrPartidePolitice + 2;

            Nod nodSursa = new Nod {
                Id           = 1,
                EsteNodSursa = true,
                EsteNodStoc  = false,
            };

            Nod nodStoc = new Nod {
                Id           = nrNoduri,
                EsteNodSursa = false,
                EsteNodStoc  = true,
            };

            retea.Noduri.Add(nodSursa);
            int idNodCurent = nodSursa.Id;

            data.Asociatii.ForEach(asociatie => {
                Nod nodAsociatie = retea.Noduri.FirstOrDefault(n => n.IdAsociatie == asociatie.Id);

                if (nodAsociatie == null)
                {
                    idNodCurent++;
                    nodAsociatie = new Nod {
                        Id = idNodCurent, IdAsociatie = asociatie.Id
                    };
                    retea.Noduri.Add(nodAsociatie);
                }

                Arc arc = new Arc(nodSursa, nodAsociatie, flux: 0, capacitate: 1);
                retea.Arce.Add(arc);
            });

            data.Locuitori.ForEach(locuitor => {
                Nod nodLocuitor = retea.Noduri.FirstOrDefault(n => n.IdLocuitor == locuitor.Id);

                if (nodLocuitor == null)
                {
                    idNodCurent++;
                    nodLocuitor = new Nod {
                        Id = idNodCurent, IdLocuitor = locuitor.Id
                    };
                    retea.Noduri.Add(nodLocuitor);
                }

                List <Asociatie> asociatii = data.Asociatii.Where(asociatie => asociatie.Membrii.Contains(locuitor)).ToList();

                asociatii.ForEach(asociatie => {
                    Nod nodAsociatie = retea.Noduri.FirstOrDefault(n => n.IdAsociatie == asociatie.Id);

                    if (nodAsociatie == null)
                    {
                        throw new InvalidOperationException($"Nu a fost creat nod pentru asociatia cu id-ul {asociatie.Id}.");
                    }

                    Arc arc = new Arc(nodAsociatie, nodLocuitor, 0, 1);
                    retea.Arce.Add(arc);
                });
            });

            List <Arc> arcePartide = new List <Arc>();

            data.PartidePolitice.ForEach(partid => {
                Nod nodPartid = retea.Noduri.FirstOrDefault(n => n.IdPartid == partid.Id);
                if (nodPartid == null)
                {
                    idNodCurent++;
                    nodPartid = new Nod {
                        Id = idNodCurent, IdPartid = partid.Id
                    };
                    retea.Noduri.Add(nodPartid);
                }

                partid.Membrii.ForEach(locuitor => {
                    Nod nodLocuitor = retea.Noduri.FirstOrDefault(n => n.IdLocuitor == locuitor.Id);

                    if (nodLocuitor == null)
                    {
                        throw new InvalidOperationException($"Nu a fost creat nod pentru locuitorul cu id-ul {locuitor.Id}.");
                    }

                    retea.Arce.Add(new Arc(nodLocuitor, nodPartid, 0, 1));
                });

                Arc arc = new Arc(nodPartid, nodStoc, flux: 0, capacitate: partid.NrReprezentantiInConsiliu);

                arcePartide.Add(arc);
            });

            retea.Arce.AddRange(arcePartide);

            data.Locuitori.ForEach(locuitor => {
                IEnumerable <PartidPolitic> partide = data.PartidePolitice.Where(p => p.Membrii.Contains(locuitor));

                if (partide?.Count() == 0)
                {
                    Nod nodLocuitor = retea.Noduri.FirstOrDefault(n => n.IdLocuitor == locuitor.Id);

                    if (nodLocuitor == null)
                    {
                        throw new InvalidOperationException($"Nu a fost creat nod pentru locuitorul cu id-ul {locuitor.Id}.");
                    }

                    retea.Arce.Add(new Arc(nodLocuitor, nodStoc, 0, 1));
                }
            });

            retea.Noduri.Add(nodStoc);

            EdmondsKarp edmondsKarp = new EdmondsKarp();
            AhujaOrlin  ahujaOrlin  = new AhujaOrlin();
            PrefluxFIFO prefluxFIFO = new PrefluxFIFO();

            double maxValue = -1;
            string option   = string.Empty;

            while (true)
            {
                Console.WriteLine("Selectati algoritmul: ");
                Console.WriteLine("1. Edmonds Karp");
                Console.WriteLine("2. Preflux FIFO");
                Console.WriteLine("3. Iesire program");

                string input = Console.ReadLine();

                switch (input.Trim())
                {
                case "1":
                    maxValue = edmondsKarp.GetValoareMaxima(new Retea(retea));
                    break;

                case "2":
                    maxValue = prefluxFIFO.GetValoareMaxima(new Retea(retea));
                    break;

                case "3":
                default:
                    return;
                }

                Console.WriteLine($"Valoarea maxima: {maxValue}");
                Console.WriteLine($"Consiliul orasului {((maxValue == data.NrAsociatii) ? "" : "NU ")}este echilibrat!");
                Console.ReadKey();
            }
        }