コード例 #1
0
        private void computarProbabilidadesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            tabControl1.SelectTab(0);
            try
            {
                if (CheckConsistency())
                {
                    //obtener la evidencia
                    if (flowChartViewer1.Charts.Count > 0 && Evidence.Count > 0)
                    {
                        GetEvidence();
                    }
                    //transformar el grafo del visor a un grafo de nodos bayesianos

                    var graph = new BayesianGraph();
                    //
                    var          dict = new Dictionary <BayesianNode, BayesianNodeChartElement>(flowChartViewer1.Charts.Count);
                    BayesianNode node;
                    var          dict2 = new Dictionary <BayesianNodeChartElement, BayesianNode>(flowChartViewer1.Charts.Count);

                    graph.Clear();

                    foreach (var item in flowChartViewer1.Charts.Cast <BayesianNodeChartElement>())
                    {
                        node = new BayesianNode(item.Parents.Count, item.Childs.Count(), item.States.Count,
                                                item.Parents.Select(x => x.States.Count).ToArray())
                        {
                            Probabilities = item.Condicional_Probabilities, Name = item.Name
                        };

                        dict.Add(node, item);
                        dict2.Add(item, node);
                        item.CreateConditionalProbabilities();


                        graph.AddVertex(node);
                    }
                    foreach (var bnodechart in flowChartViewer1.Charts.Cast <BayesianNodeChartElement>())
                    {
                        foreach (var child in bnodechart.Childs)
                        {
                            graph.AddEdge(dict2[bnodechart], dict2[child]);
                        }
                    }
                    //ejecutar el traspaso de mensajes en un poliarbol o en una red multiplemente conexa
                    progressBar1.Value = 5;
                    //if(MessageTransfer.ParalellStartNumber>graph.Count)
                    MessageTransfer.Increment += UpdateProgress;


                    if (graph.Arbol())
                    {
                        if (Evidence.Count > 0)
                        {
                            MessageTransfer.Message_Tranfer_Poliarbol(graph, Evidence[EvidenceIndex]);
                        }
                        else
                        {
                            MessageTransfer.Message_Tranfer_Poliarbol(graph);
                        }
                        foreach (var nodebayesian in graph)
                        {
                            dict[nodebayesian].SetConditionalProbabilities(nodebayesian.ConditionalProbability);
                        }
                    }
                    else
                    {
                        var markovnet = new MarkovNet(graph);
                        if (Evidence.Count > 0)
                        {
                            MessageTransfer.Message_Tranfer_Arbol_Union(markovnet, Evidence[EvidenceIndex]);
                        }
                        else
                        {
                            MessageTransfer.Message_Tranfer_Arbol_Union(markovnet);
                        }
                        foreach (var nodebayesian in markovnet.BayesianNet)
                        {
                            dict[nodebayesian].SetConditionalProbabilities(nodebayesian.ConditionalProbability);
                        }
                    }

                    timer1.Stop();
                    progressBar1.Value = 100;

                    Tests.Add(new BayesianTest()
                    {
                        Evidence      = Evidence[EvidenceIndex].Clone(),
                        Probabilities =
                            graph.Select(x => x.ConditionalProbability.Clone() as double[]).ToArray()
                    });
                    TestsIndex = Tests.Count - 1;
                    ShowConditionalProbabilities();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Hubo algun problema al calcular las probabilidades condicionales. " + ex.Message);
            }
        }
コード例 #2
0
        private void computarProbabilidadesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            tabControl1.SelectTab(0);
            try
            {
                if (CheckConsistency())
                {
                    //obtener la evidencia
                    if (flowChartViewer1.Charts.Count > 0 && Evidence.Count > 0)
                        GetEvidence();
                    //transformar el grafo del visor a un grafo de nodos bayesianos

                    var graph = new BayesianGraph();
                    //
                     var dict = new Dictionary<BayesianNode, BayesianNodeChartElement>(flowChartViewer1.Charts.Count);
                    BayesianNode node;
                    var dict2 = new Dictionary<BayesianNodeChartElement, BayesianNode>(flowChartViewer1.Charts.Count);
                    
                    graph.Clear();
                   
                    foreach (var item in flowChartViewer1.Charts.Cast<BayesianNodeChartElement>())
                    {

                        node = new BayesianNode(item.Parents.Count, item.Childs.Count(), item.States.Count,
                                                item.Parents.Select(x => x.States.Count).ToArray()) { Probabilities = item.Condicional_Probabilities, Name = item.Name };

                        dict.Add(node, item);
                        dict2.Add(item,node);
                        item.CreateConditionalProbabilities();


                        graph.AddVertex(node);
                    }
                    foreach (var bnodechart in flowChartViewer1.Charts.Cast<BayesianNodeChartElement>())
                    {
                        foreach (var child in bnodechart.Childs)
                        {
                            graph.AddEdge(dict2[bnodechart], dict2[child]);
                        }
                    }
                    //ejecutar el traspaso de mensajes en un poliarbol o en una red multiplemente conexa
                    progressBar1.Value = 5;
                    //if(MessageTransfer.ParalellStartNumber>graph.Count)
                        MessageTransfer.Increment += UpdateProgress;
                   

                    if (graph.Arbol())
                    {
                        if (Evidence.Count > 0)
                            MessageTransfer.Message_Tranfer_Poliarbol(graph, Evidence[EvidenceIndex]);
                        else
                            MessageTransfer.Message_Tranfer_Poliarbol(graph);
                        foreach (var nodebayesian in graph)
                            dict[nodebayesian].SetConditionalProbabilities(nodebayesian.ConditionalProbability);
                    }
                    else
                    {
                        var markovnet = new MarkovNet(graph);
                        if (Evidence.Count > 0)
                            MessageTransfer.Message_Tranfer_Arbol_Union(markovnet, Evidence[EvidenceIndex]);
                        else
                            MessageTransfer.Message_Tranfer_Arbol_Union(markovnet);
                        foreach (var nodebayesian in markovnet.BayesianNet)

                            dict[nodebayesian].SetConditionalProbabilities(nodebayesian.ConditionalProbability);

                    }

                    timer1.Stop();
                    progressBar1.Value=100;
                   
                    Tests.Add(new BayesianTest()
                        {
                            Evidence = Evidence[EvidenceIndex].Clone(),
                            Probabilities =
                                graph.Select(x => x.ConditionalProbability.Clone() as double[]).ToArray()
                        });
                    TestsIndex = Tests.Count - 1;
                    ShowConditionalProbabilities();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Hubo algun problema al calcular las probabilidades condicionales. " + ex.Message);
            }
        }
コード例 #3
0
        /// <summary>
        /// Metodo que calcula, mediante el traspaso de mensajes en un poliarbol,
        /// las probabilidades condicionales de un nodo dada la evidencia.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="poliarbol"></param>
        /// <param name="evidence">Tiene tantos elementos como nodos el poliarbol.
        /// En la posicion i-esima guarda el valor del estado de la variable i si esta forma parte de la evidencia; 
        /// -1 en otro caso. 
        /// </param>

        
        public static void Message_Tranfer_Poliarbol(BayesianGraph poliarbol, Evidence evidence)
        {
            Generic(evidence, poliarbol, null);
        } 
コード例 #4
0
        static void Generic(Evidence evidence, BayesianGraph poliarbol, MarkovNet arboldeunion)
        {
            //tamanno del grafo sea poliarbol o de racimos
            var count = poliarbol == null
                            ? arboldeunion.Count
                            : poliarbol.Count;
           double realization_probalility = 1.0;
           var nodesConditionalProbabilities = new double[count][];

           var bayesianGraph = poliarbol ?? arboldeunion.BayesianNet;
            bool traspasoEnPoliarbol = poliarbol != null;


           if (evidence == null) return;

           var deterministicEvidence = new KeyValuePair<BayesianNode, int>[evidence.EvidenceValues.Length];
           //absorber evidencia
           //no hay evidencia
           for (int i = 0; i < count; i++)
               deterministicEvidence[i] = new KeyValuePair<BayesianNode, int>(bayesianGraph[i], -1);

           for (int j = 0; j < count; j++)
               nodesConditionalProbabilities[j] = new double[bayesianGraph[j].ConditionalProbability.Length];
           bool stocasticrealizations = false;

           foreach (var item in EvidenceRealization(evidence, deterministicEvidence, 0))
           {
               
               stocasticrealizations = true;
               if (traspasoEnPoliarbol)
                   Message_Tranfer_Poliarbol(poliarbol, item.Item1);
               else
                   Message_Tranfer_Arbol_Union(arboldeunion, item.Item1);
              
               realization_probalility = item.Item2;
               
               for (int i = 0; i < nodesConditionalProbabilities.Length; i++)
                   for (int j = 0; j < nodesConditionalProbabilities[i].Length; j++)
                   {
                       nodesConditionalProbabilities[i][j] += bayesianGraph[i].ConditionalProbability[j] * realization_probalility;
                   }
              
           }
           //si no hubo evidencia estocastica es que se esta solicitando el traspaso de 
           //msges sin evidencia
           if (stocasticrealizations)
           {

               for (int i = 0; i < nodesConditionalProbabilities.Length; i++)
                   for (int j = 0; j < nodesConditionalProbabilities[i].Length; j++)
                       bayesianGraph[i].ConditionalProbability[j] = nodesConditionalProbabilities[i][j];
           }
           else
           {
               if (traspasoEnPoliarbol)
                   Message_Tranfer_Poliarbol(poliarbol, deterministicEvidence);
               else
                   Message_Tranfer_Arbol_Union(arboldeunion, deterministicEvidence);

           }
        }
コード例 #5
0
        public static void Message_Tranfer_Poliarbol(BayesianGraph poliarbol, KeyValuePair<BayesianNode, int>[] evidence = null)
        {
            
            foreach (var item in poliarbol)
            {
                item.Inicialize();
            
            }
            //fijar la evidencia

            evidence=evidence??new KeyValuePair<BayesianNode, int>[0];
            poliarbol.AbsorbeEvidence(evidence);

            if (poliarbol.Count > ParalellStartNumber)
            {
                #region PararellAlgorithm

                poliarbol.Debug = true;
                var taskarr = new Task[poliarbol.Count];
                for (int i = 0; i < poliarbol.Count; i++)
                {
                    taskarr[i] = new Task(o =>
                    {
                        var node = o as BayesianNode;
                        if (node != null)
                            lock (node)
                            {
                                do
                                {
                                   
                                    poliarbol.Work(node);
                                } while (!node.Finished);
                                
                            }
                    },poliarbol[i]);
                    taskarr[i].Start();
                }
                for (int i = 0; i < poliarbol.Count*8; i++)
                {
                    System.Threading.Thread.Sleep(300);
                    Increment();
                }
                Task.WaitAll(taskarr);
                poliarbol.Debug = false;

                #endregion
            }
            else
                #region DeterministicAlgorithm
                while (!poliarbol.All(x => x.Finished))
                {
                    for (int i = 0; i < poliarbol.Count; i++)
                        poliarbol.Work(poliarbol[i]);
                    Increment();
                }
                #endregion



        }