Exemplo n.º 1
0
        public List <double> merge_attack_by_user(KnowlegePattern KP_user1, KnowlegePattern KP_user2, string user1, string user2, string user_in_both)
        {
            List <double> output = new List <double> ();

            List <double> KP_user1_getattacklist = KP_user1.get_attack(user1, user_in_both);
            List <double> KP_user2_getattacklist = KP_user2.get_attack(user_in_both, user2);

            // рассматриваем все цепочки до связи между отделами
            for (int i = 0; i < KP_user1_getattacklist.Count; i++)
            {
                for (int j = 0; j < KP_user2_getattacklist.Count; j++)
                {
                    output.Add(KP_user2_getattacklist[j] *
                               KP_user1_getattacklist[i] / KP_user1.vertexWeight[user_in_both]
                               );
                }
            }
            return(output);
        }
Exemplo n.º 2
0
        // получаем списки отделов и смотрим на пересечения
        public List <double> merge_attack_by_edge(KnowlegePattern KP_user1, KnowlegePattern KP_user2, string user1, string user2, Edge <string> e)
        {
            List <double> output = new List <double> ();

            List <double> KP_user1_getattacklist = KP_user1.get_attack(user1, e.Source);
            List <double> KP_user2_getattacklist = KP_user2.get_attack(e.Target, user2);

            double _out;

            // рассматриваем все цепочки до связи между отделами
            for (int i = 0; i < KP_user1_getattacklist.Count; i++)
            {
                for (int j = 0; j < KP_user2_getattacklist.Count; j++)
                {
                    _out = (KP_user2_getattacklist [j] * KP_user1_getattacklist [i] * G.edgeWeight[e]) / KP_user1.vertexWeight [user2];
                    output.Add(_out);
                }
            }

            return(output);
        }
Exemplo n.º 3
0
        // возвращает список возможных атак через смежных пользователей
        public List <List <double> > get_attack(string user1, string user2)
        {
            List <List <double> > output = new List <List <double> > ();
            int _case = 0;

            /*foreach (KnowlegePattern p in SocGraphWithKP.Vertices)
             *      if (p.G.)*/

            // пользователи из одного отдела - используем сгенерированное
            // если нашли -> дальше не идем
            bool check = false;

            foreach (KnowlegePattern KP in SocGraphWithKP.Vertices)
            {
                if (KP.staff.Contains(user1) && KP.staff.Contains(user2))
                {
                    check = true;
                    output.Add(KP.get_attack(user1, user2));
                    return(output);
                }
            }

            if (!check)
            {
                KnowlegePattern START_KP  = null;
                KnowlegePattern FINISH_KP = null;
                // пользователи из разных отделов


                foreach (KnowlegePattern KP in SocGraphWithKP.Vertices)
                {
                    if (KP.staff.Contains(user1))
                    {
                        START_KP = KP;
                    }
                    else if (KP.staff.Contains(user2))
                    {
                        FINISH_KP = KP;
                    }


                    // проверка на наличие связей между отделами
                    for (int i = 0; i < START_KP.staff.Count; i++)
                    {
                        for (int j = 0; j < FINISH_KP.staff.Count; j++)
                        {
                            // 1 пользователь в 2 отделах -> просмотрим атаку через него
                            if (START_KP.staff [i] == FINISH_KP.staff [j])
                            {
                                output.Add(merge_attack_by_user(START_KP, FINISH_KP, user1, user2, START_KP.staff [i]));
                            }
                            Edge <string> e;


                            if (this.G.social_graph.TryGetEdge(START_KP.staff [i], FINISH_KP.staff [j], out e))
                            {
                                output.Add(merge_attack_by_edge(START_KP, FINISH_KP, user1, user2, e));
                            }
                        }
                    }
                }
            }
            return(output);
        }