Exemplo n.º 1
0
        /* Update solution */
        private void update(GrafAdj network, string user)
        {
            currentResult = new List <Tuple <string, HashSet <string> > >();
            string userFriendsString;

            if (network.getMap().TryGetValue(user, out userFriendsString))
            {
                HashSet <string> userFriends = new HashSet <string>(userFriendsString.Split(' '));

                foreach (string friend in userFriends)
                {
                    foreach (string friendOfFriend in network.getMap().FirstOrDefault <KeyValuePair <string, string> >(edgeKvp => edgeKvp.Key == friend).Value.Split(' '))
                    {
                        if (friendOfFriend != user)
                        {
                            HashSet <string> prevHashSet = null;
                            bool             found       = false;
                            foreach (Tuple <string, HashSet <string> > prevFriend in currentResult)
                            {
                                if (prevFriend.Item1 == friendOfFriend)
                                {
                                    found       = true;
                                    prevHashSet = prevFriend.Item2;
                                    break;
                                }
                            }

                            if (found)
                            {
                                prevHashSet.Add(friend);
                            }
                            else
                            {
                                HashSet <string> friendInitialSet = new HashSet <string>();
                                friendInitialSet.Add(friend);
                                currentResult.Add(new Tuple <string, HashSet <string> >(friendOfFriend, new HashSet <string>(friendInitialSet)));
                            }
                        }
                    }
                }

                currentResult.Sort((x, y) => y.Item2.Count().CompareTo(x.Item2.Count()));
            }

            currentNetwork      = network;
            currentUser         = user;
            currentResultExists = true;
        }
Exemplo n.º 2
0
        public void bfs(GrafAdj graf, string simpulAwal, string simpulTujuan)
        {
            Dictionary <string, string> prevNode   = new Dictionary <string, string>();
            Dictionary <string, string> mapGraf    = graf.getMap();
            HashSet <string>            dikunjungi = new HashSet <string>();

            dikunjungi.Add(simpulAwal);
            Queue <string> antrian = new Queue <string>();

            antrian.Enqueue(simpulAwal);

            prevNode[simpulAwal] = null;

            while (antrian.Count > 0)
            {
                string current = antrian.Dequeue();

                if (current == simpulTujuan)
                {
                    break;
                }

                foreach (var tetangga in mapGraf[current].Split(' '))
                {
                    if (!dikunjungi.Contains(tetangga))
                    {
                        dikunjungi.Add(tetangga);
                        antrian.Enqueue(tetangga);

                        prevNode[tetangga] = current;
                    }
                }
            }

            string curr = simpulTujuan;

            hasil = new List <string>();

            while (curr != null)
            {
                hasil.Add(curr);
                string temp;
                bool   keyExists = prevNode.TryGetValue(curr, out temp);
                if (!keyExists)
                {
                    throw new KeyNotFoundException();
                }
                curr = prevNode[curr];
                derajat++;
            }

            derajat = derajat - 2; //mengexclude simpulAwal dan simpulTujuan

            hasil.Reverse();
        }
Exemplo n.º 3
0
        private void runFriendRecommendation()
        {
            System.Console.WriteLine("Friend Recommendation Running");
            listBoxFriend.Items.Clear();
            string selectedAcc = comboBoxAcc.Items[comboBoxAcc.SelectedIndex].ToString();
            FriendRecommendation friendRecom = new FriendRecommendation();
            IList <Tuple <string, HashSet <string> > > daftarRecom = friendRecom.getFriendRecommendation(graf, selectedAcc);

            if (daftarRecom.Count == 0)
            {
                listBoxFriend.Items.Add("Tidak ada friend recommendation");
            }
            foreach (var recom in daftarRecom)
            {
                //BFS
                ExploreFriendBFS eksplorasiBFS = new ExploreFriendBFS();
                //Ambil dari daftar rekomendasi
                List <string>    tempList     = new List <string>();
                string[]         tetangga     = graf.getMap()[selectedAcc].Split(' ');
                string           namaRecom    = recom.Item1;
                HashSet <string> daftarMutual = recom.Item2;
                //syarat belum menjadi teman dan bukan dirinya sendiri
                if (!Array.Exists(tetangga, element => element == namaRecom) && namaRecom != selectedAcc)
                {
                    listBoxFriend.Items.Add(namaRecom);
                    if (selectedAcc != namaRecom)
                    {
                        eksplorasiBFS.bfs(graf, selectedAcc, namaRecom);
                        eksplorasiBFS.tampilkanHasil();
                        string[] rute = eksplorasiBFS.getHasil().ToArray();
                        for (int i = 0; i < rute.Length; i++)
                        {
                            graph.FindNode(rute[i]).Attr.FillColor = Microsoft.Msagl.Drawing.Color.Green;
                        }
                        listBoxFriend.Items.Add(tampilkanHasil(eksplorasiBFS.getHasil()) + ", derajat pertemanan: " + eksplorasiBFS.getDerajat().ToString());
                    }

                    foreach (string nama in daftarMutual)
                    {
                        tempList.Add(nama);
                    }
                    string[] tempArr     = tempList.ToArray();
                    string   outTetangga = tempArr.Length.ToString() + " Mutual friends: " + string.Join(" ", tempArr);
                    listBoxFriend.Items.Add(outTetangga);
                    listBoxFriend.Items.Add(" ");
                }
            }
        }
Exemplo n.º 4
0
        /* Returns true if dest found from src in graph with DFS, solution is concatenate with route from src to dest.
         * If not found, returns false and solution does not change. */
        private bool dfs(GrafAdj graph, string src, string dest, ref List <string> solution)
        {
            if (src == dest)
            {
                solution.Add(src);
                return(true);
            }
            else if (solution.Contains(src))
            {
                return(false);
            }
            else
            {
                string srcAdjacentString;

                if (graph.getMap().TryGetValue(src, out srcAdjacentString))
                {
                    solution.Add(src);
                    bool found = false;
                    foreach (string adjacentNode in srcAdjacentString.Split(' '))
                    {
                        if (dfs(graph, adjacentNode, dest, ref solution))
                        {
                            found = true;
                            break;
                        }
                    }

                    if (!found)
                    {
                        solution.Remove(src);
                    }

                    return(found);
                }
                else
                {
                    return(false);
                }
            }
        }