Beispiel #1
0
        public void Test_BrojRundiNaOsnovuSistemaIBrojaIgraca(string sistem, int brojIgraca, int ocekivano)
        {
            Sistem_Takmicenja d = new Sistem_Takmicenja {
                Opis = sistem
            };
            //obzirom da se ne koristi baza za ovu funckiju moze se slobodno poslati null vrijednost
            InitTakmicenja x        = new InitTakmicenja(null);
            int            rezultat = x.pomocnaFunkcijaIzracunajRunde(d, brojIgraca).BrojRundi;

            Assert.AreEqual(ocekivano, rezultat);
        }
        public List <(Prijave prijava, double vjerovatnoca)> PredictWinners(int takmId)
        {
            var takmicenje = db.Takmicenja
                             .Include(x => x.Sistem)
                             .Where(x => x.ID == takmId).FirstOrDefault();

            if (takmicenje == null)
            {
                throw new UserException("Takmicenje ne postoji u bazi.");
            }

            ValidirajPredictWinners(takmicenje);

            List <(Prijava prijava, int Elo)> PrijaveLista = GetPrijaveSaElom(takmId);

            double [,] MatricaVjerovatnoca = new double[PrijaveLista.Count, PrijaveLista.Count];
            for (int i = 0; i < PrijaveLista.Count - 1; i++)
            {
                for (int j = i + 1; j < PrijaveLista.Count; j++)
                {
                    double vjerovatnocaA = eloCalculator.GetVjerovatnoca(PrijaveLista[i].Elo, PrijaveLista[j].Elo);
                    double vjerovatnocaB = eloCalculator.GetVjerovatnoca(PrijaveLista[j].Elo, PrijaveLista[i].Elo);
                    MatricaVjerovatnoca[i, j] = vjerovatnocaA;
                    MatricaVjerovatnoca[j, i] = vjerovatnocaB;
                }
            }

            int brojRundi = initTakmicenja.pomocnaFunkcijaIzracunajRunde(takmicenje.Sistem, PrijaveLista.Count).BrojRundi;

            //RED SE ODNOSI NA SLOTNUM - 1 DAKLE NIJE PO RANKU SORTIRANO NEGO KAKO UTAKMICE IDU
            double[,] VjerovatnocePobjedeRunde = new double[PrijaveLista.Count, brojRundi];
            List <(Prijava pr, double vjerovatnoca)> finalnaLista = new List <(Prijava pr, double vjerovatnoca)>();

            for (int r = 0; r < brojRundi; r++)
            {
                for (int i = 0; i < PrijaveLista.Count; i++)
                {
                    double vjerovatnocaProslu = GetProsluVjerovatnocu(i, r - 1, VjerovatnocePobjedeRunde);
                    int    v    = GetSlotNumber(i + 1, r + 1) - 1;
                    int    u    = v + (int)Math.Round(Math.Pow(2, r)) - 1;
                    double suma = 0;
                    for (int k = v; k <= u; k++)
                    {
                        suma += (MatricaVjerovatnoca[i, k] *
                                 GetProsluVjerovatnocu(k, r - 1, VjerovatnocePobjedeRunde));
                    }
                    suma *= vjerovatnocaProslu;
                    VjerovatnocePobjedeRunde[i, r] = suma;
                    if (r == brojRundi - 1)
                    {
                        finalnaLista.Add((PrijaveLista[i].prijava, suma));
                    }
                }
            }
            finalnaLista = finalnaLista.OrderByDescending(x => x.vjerovatnoca).ToList();
            var povratna = new List <(Prijave prijava, double vjerovatnoca)>();

            for (int i = 0; i < 3; i++)
            {
                if (i >= finalnaLista.Count)
                {
                    break;
                }
                var prijavaMap = mapko.Map <Prijave>(finalnaLista[i].pr);
                povratna.Add((prijavaMap, finalnaLista[i].vjerovatnoca));