protected override void VisitNode(BFSQueue queue, BFSNode node, int sourceUser, int neighbourhoodDistance)
        {
            Dictionary <int, float> indexes = new Dictionary <int, float>();

            foreach (int user in this.originalTrustMatrix[node.value])
            {
                if (!this.estimatedTrustMatrix[sourceUser].Contains(user))
                {
                    indexes[user] = ResourceAllocationIndex(sourceUser, user);
                }
            }

            List <KeyValuePair <int, float> > indexesList = indexes.ToList();

            if (topN.HasValue)
            {
                indexesList.Sort((pair1, pair2) => pair1.Value.CompareTo(pair2.Value));
                if (topN < indexesList.Count)
                {
                    indexesList.RemoveRange(0, indexesList.Count - topN.Value);
                }
            }

            int distance = node.distance + 1;

            foreach (KeyValuePair <int, float> pair in indexesList)
            {
                int user = pair.Key;

                estimatedTrustMatrix[sourceUser, user] = BasicTrustMetric(neighbourhoodDistance, distance);

                queue.Enqueue(new BFSNode(pair.Key, distance));
            }
        }
Beispiel #2
0
        public static Matrix <float> BuildRABasedTrust(Matrix <float> trustMatrix, int neighbourhoodDistance)
        {
            Matrix <float> estimatedTrustMatrix = trustMatrix.Clone();
            Matrix <float> raMatrix             = new Matrix <float>();

            foreach (int sourceUser in trustMatrix.Rows)
            {
                BFSQueue queue = new BFSQueue(neighbourhoodDistance);

                foreach (int trustedUser in trustMatrix[sourceUser])
                {
                    queue.Enqueue(new BFSNode(trustedUser, 1));
                }

                while (queue.Count() > 0)
                {
                    BFSNode node     = queue.Deque();
                    int     user     = node.value;
                    int     distance = node.distance;

                    if (distance == neighbourhoodDistance)
                    {
                        break;
                    }

                    if (trustMatrix.HasRow(user))
                    {
                        Dictionary <int, float> RAIndexes = new Dictionary <int, float>();
                        foreach (int trustedUser in trustMatrix[user])
                        {
                            if (!trustMatrix[sourceUser].Contains(trustedUser))
                            {
                                if (!(raMatrix.HasRow(sourceUser) && raMatrix[sourceUser].Contains(trustedUser)))
                                {
                                    raMatrix[sourceUser, trustedUser] = ResourceAllocationIndex(trustMatrix, sourceUser, trustedUser);
                                }

                                RAIndexes[trustedUser] = raMatrix[sourceUser, trustedUser];
                            }
                        }

                        List <KeyValuePair <int, float> > RAList = RAIndexes.ToList();
                        RAList.Sort((pair1, pair2) => pair1.Value.CompareTo(pair2.Value));

                        for (int i = 0; i < 15 && i < RAList.Count; i++)
                        {
                            queue.Enqueue(new BFSNode(RAList[i].Key, distance + 1));
                            estimatedTrustMatrix[sourceUser, RAList[i].Key] = BasicTrustMetric(neighbourhoodDistance, distance + 1);
                        }
                    }
                }
            }

            return(estimatedTrustMatrix);
        }
Beispiel #3
0
        public static Matrix <float> BuildCommonNeighboursBasedTrust(Matrix <float> trustMatrix, int neighbourhoodDistance)
        {
            Matrix <float> estimatedTrustMatrix = trustMatrix.Clone();
            Matrix <float> cnMatrix             = new Matrix <float>();

            foreach (int sourceUser in trustMatrix.Rows)
            {
                BFSQueue queue = new BFSQueue(neighbourhoodDistance);

                foreach (int trustedUser in trustMatrix[sourceUser])
                {
                    queue.Enqueue(new BFSNode(trustedUser, 1));
                }

                while (queue.Count() != 0)
                {
                    BFSNode node     = queue.Deque();
                    int     user     = node.value;
                    int     distance = node.distance;

                    if (distance == neighbourhoodDistance)
                    {
                        break;
                    }

                    if (trustMatrix.HasRow(user))
                    {
                        Dictionary <int, float> commonNeighbours = new Dictionary <int, float>();
                        foreach (int trustedUser in trustMatrix[user])
                        {
                            if (!trustMatrix[sourceUser].Contains(trustedUser))
                            {
                                if (!(cnMatrix.HasRow(sourceUser) && cnMatrix[sourceUser].Contains(trustedUser)))
                                {
                                    cnMatrix[sourceUser, trustedUser] = CommonNeighbours(trustMatrix, sourceUser, trustedUser);
                                }

                                commonNeighbours[trustedUser] = cnMatrix[sourceUser, trustedUser];
                            }
                        }

                        List <KeyValuePair <int, float> > CNList = commonNeighbours.ToList();
                        CNList.Sort((pair1, pair2) => pair1.Value.CompareTo(pair2.Value));

                        for (int i = 0; i < 15 && i < CNList.Count; i++)
                        {
                            queue.Enqueue(new BFSNode(CNList[i].Key, distance + 1));
                            estimatedTrustMatrix[sourceUser, CNList[i].Key] = BasicTrustMetric(neighbourhoodDistance, distance + 1);
                        }
                    }
                }
            }

            return(estimatedTrustMatrix);
        }
Beispiel #4
0
        protected override void VisitNode(BFSQueue queue, BFSNode node, int sourceUser, int neighbourhoodDistance)
        {
            foreach (int user in this.originalTrustMatrix[node.value])
            {
                if (!this.estimatedTrustMatrix[sourceUser].Contains(user))
                {
                    int distance = node.distance + 1;
                    this.estimatedTrustMatrix[sourceUser, user] = BasicTrustMetric(neighbourhoodDistance, distance);

                    queue.Enqueue(new BFSNode(user, distance));
                }
            }
        }
Beispiel #5
0
        public static Matrix <float> BuildJaccardIndexTrustMatrix2(Matrix <float> trustMatrix, int neighbourhoodDistance)
        {
            Matrix <float> estimatedTrustMatrix = trustMatrix.Clone();
            Matrix <float> jaccardMatrix        = new Matrix <float>();

            foreach (int sourceUser in trustMatrix.Rows)
            {
                BFSQueue queue = new BFSQueue(neighbourhoodDistance);

                foreach (int trustedUser in trustMatrix[sourceUser])
                {
                    queue.Enqueue(new BFSNode(trustedUser, 1));
                }

                while (queue.Count() != 0)
                {
                    BFSNode node     = queue.Deque();
                    int     user     = node.value;
                    int     distance = node.distance;

                    if (distance == neighbourhoodDistance)
                    {
                        break;
                    }

                    if (trustMatrix.HasRow(user))
                    {
                        foreach (int trustedUser in trustMatrix[user])
                        {
                            if (!(jaccardMatrix.HasRow(sourceUser) && jaccardMatrix[sourceUser].Contains(trustedUser)))
                            {
                                jaccardMatrix[sourceUser, trustedUser] = jaccardMatrix[trustedUser, sourceUser] = JaccardIndex(trustMatrix, sourceUser, trustedUser);
                            }

                            float jaccardIndex = jaccardMatrix[sourceUser, trustedUser];

                            if (jaccardIndex > _Threshold)
                            {
                                estimatedTrustMatrix[sourceUser, trustedUser] = BasicTrustMetric(neighbourhoodDistance, distance + 1);
                                queue.Enqueue(new BFSNode(trustedUser, distance + 1));
                            }
                        }
                    }
                }
            }

            return(estimatedTrustMatrix);
        }
Beispiel #6
0
        /// <summary>BFS Puzzle</summary>
        public void BFS_Search()
        {
            ThreadPool.QueueUserWorkItem(o => /// https://dotblogs.com.tw/yc421206/2011/10/10/40840
            {
                AnswerFound = false;
                ///清資料
                DateTime StartTime = DateTime.Now;
                BFSQueue.Clear();
                TimeCost = 0;
                Parent.Clear();
                ///初始化
                BFSQueue.Enqueue(InitValue);
                Parent.Add(InitValue, InitValue);
                Degree        = -1;
                CurrentDegree = 0;
                int count     = 0;
                while (!AnswerFound && BFSQueue.Count > 0)
                {
                    ulong bfsTop = BFSQueue.Dequeue();

                    CurrentDegree = Cost(bfsTop, out _);
                    if (bfsTop == TargetValue)
                    {
                        AnswerFound = true;
                        BFSQueue.Clear();
                        break;
                    }
                    foreach (ulong next in NextPossibleState(bfsTop))
                    {
                        if (!Parent.Contains(next))
                        {
                            BFSQueue.Enqueue(next);
                            Parent.Add(next, bfsTop);
                        }
                    }
                    count++;
                    TimeCost = (DateTime.Now - StartTime).TotalMilliseconds;
                }
                DateTime FinishTime = DateTime.Now;
                TimeCost            = (FinishTime - StartTime).TotalMilliseconds;
                Degree = Cost(TargetValue, out Route); // 計算最終狀態到初始狀態花的cost
            });
        }
Beispiel #7
0
        public static Matrix <float> BuildSaltonIndexTrustMatrix2(Matrix <float> trustMatrix, int neighbourhoodDistance)
        {
            Matrix <float> estimatedTrustMatrix = new Matrix <float>();
            Matrix <float> saltonMatrix         = new Matrix <float>();

            foreach (int sourceUser in trustMatrix.Rows)
            {
                BFSQueue queue = new BFSQueue(neighbourhoodDistance);
                estimatedTrustMatrix.AddRow(sourceUser);

                foreach (int trustedUser in trustMatrix[sourceUser])
                {
                    queue.Enqueue(new BFSNode(trustedUser, 1));
                }

                while (queue.Count() != 0)
                {
                    BFSNode node     = queue.Deque();
                    int     user     = node.value;
                    int     distance = node.distance;

                    if (!estimatedTrustMatrix[sourceUser].Contains(user))
                    {
                        saltonMatrix[sourceUser, user] = saltonMatrix[user, sourceUser] = SaltonIndex(trustMatrix, sourceUser, user);

                        if (saltonMatrix[sourceUser, user] > _Threshold)
                        {
                            estimatedTrustMatrix[sourceUser, user] = BasicTrustMetric(neighbourhoodDistance, distance);

                            if (trustMatrix.Rows.Contains(user))
                            {
                                foreach (int trustedUser in trustMatrix[user])
                                {
                                    queue.Enqueue(new BFSNode(trustedUser, distance + 1));
                                }
                            }
                        }
                    }
                }
            }

            return(estimatedTrustMatrix);
        }
Beispiel #8
0
        protected override void VisitNode(BFSQueue queue, BFSNode node, int sourceUser, int neighbourhoodDistance)
        {
            Dictionary <int, float> commonNeighbours = new Dictionary <int, float>();

            foreach (int user in this.originalTrustMatrix[node.value])
            {
                if (!this.estimatedTrustMatrix[sourceUser].Contains(user))
                {
                    commonNeighbours[user] = CN(sourceUser, user);
                }
            }

            List <KeyValuePair <int, float> > cnList = commonNeighbours.ToList();

            if (topN.HasValue)
            {
                cnList.Sort((pair1, pair2) => pair1.Value.CompareTo(pair2.Value));
                if (topN < commonNeighbours.Count)
                {
                    cnList.RemoveRange(topN.Value, commonNeighbours.Count - topN.Value);
                }
            }
        }
Beispiel #9
0
        public virtual Matrix <float> BuildMatrix(int neighbourhoodDistance)
        {
            foreach (int sourceUser in this.originalTrustMatrix.Rows)
            {
                BFSQueue queue = new BFSQueue(neighbourhoodDistance);

                foreach (int trustedUser in this.originalTrustMatrix[sourceUser])
                {
                    queue.Enqueue(new BFSNode(trustedUser, 1));
                }

                while (queue.Count() != 0)
                {
                    BFSNode node = queue.Deque();

                    if (this.originalTrustMatrix.HasRow(node.value))
                    {
                        VisitNode(queue, node, sourceUser, neighbourhoodDistance);
                    }
                }
            }

            return(this.estimatedTrustMatrix);
        }
Beispiel #10
0
 protected abstract void VisitNode(BFSQueue queue, BFSNode node, int sourceUser, int neighbourhoodDistance);