Exemple #1
0
        public static void ConflictResolution(FuzzyModel fm, float preserveThr, float ratioThr)
        {
            List <FuzzyEdge> toRemove = new List <FuzzyEdge>();

            foreach (FuzzyEdge AB in fm.GetEdges())
            {
                FuzzyEdge BA    = fm.GetEdge(AB.GetToNode(), AB.GetFromNode());
                float     relAB = 0;
                float     relBA = 0;
                if (BA != null)
                {
                    if (AB.Equals(BA))
                    {
                        toRemove.Add(AB);
                    }
                    if (toRemove.Contains(AB) || toRemove.Contains(BA))
                    {
                        continue;
                    }
                    FuzzyNode A = AB.GetFromNode();
                    FuzzyNode B = AB.GetToNode();
                    // compute relative significance of edge A->B
                    float sigAB = AB.GetFrequencySignificance();
                    float sigAX = 0;
                    foreach (FuzzyEdge AX in A.GetOutEdges())
                    {
                        sigAX += AX.GetFrequencySignificance();
                    }
                    float sigXB = 0;
                    foreach (FuzzyEdge XB in B.GetInEdges())
                    {
                        sigXB += XB.GetFrequencySignificance();
                    }
                    relAB = (0.5F * (sigAB / sigAX)) + (0.5F * (sigAB / sigXB));
                    Console.WriteLine("{0}, Relative significance: {1}", AB.ToString(), relAB);

                    // compute relative significance of edge B->A
                    float sigBA = BA.GetFrequencySignificance();
                    float sigBX = 0;
                    foreach (FuzzyEdge BX in B.GetOutEdges())
                    {
                        sigBX += BX.GetFrequencySignificance();
                    }
                    float sigXA = 0;
                    foreach (FuzzyEdge XA in A.GetInEdges())
                    {
                        sigXA += XA.GetFrequencySignificance();
                    }
                    relBA = (0.5F * (sigBA / sigBX)) + (0.5F * (sigBA / sigXA));
                    Console.WriteLine("{0}, Relative significance: {1}", BA.ToString(), relBA);


                    // Decide preservation
                    if (relAB < preserveThr || relBA < preserveThr)
                    {
                        float ofsAB = Math.Abs(relAB - relBA);
                        if (ofsAB < ratioThr)
                        {
                            toRemove.Add(AB);
                            toRemove.Add(BA);
                        }
                        else
                        {
                            if (relAB > relBA)
                            {
                                toRemove.Add(BA);
                            }
                            else
                            {
                                toRemove.Add(AB);
                            }
                        }
                    }
                }
            }

            foreach (FuzzyEdge fe in toRemove)
            {
                fm.RemoveEdge(fe);
            }
        }