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); }
// получаем списки отделов и смотрим на пересечения 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); }
// возвращает список возможных атак через смежных пользователей 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); }