⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frm_auto_swatch.cs

📁 基于BP算法的贝叶斯网络参数学习
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.IO;
using System.Diagnostics;

namespace bs
{
    public partial class frm_Auto_Swatch : Form
    {
        public NodeArray myNodeArray=null;
        public LineArray Lines=null;
        public int sumofR = 0;//输入节点数量
        public int sumofC = 0;//输出节点数量
        private int indexRand = 0;
        public  ArrayList arryA;//要返回的结果
        public frm_Auto_Swatch()
        {
            InitializeComponent();
        }

        private void frm_Auto_Swatch_Load(object sender, EventArgs e)
        {
            #region 窗体load代码
            
            for (int i = 0; i < myNodeArray.Count; i++)
            {
                if (myNodeArray[i].indegree == 0)
                {
                    sumofR++;
                }
                if (myNodeArray[i].outdegree == 0)
                {
                    sumofC++;
                }
            }
            listView1.Columns.Clear();
            listView1.Columns.Add("行索引",60);
            for (int i = 0; i < sumofR; i++)
            {
                listView1.Columns.Add("输入值" + (i + 1).ToString(), 60);
            }
            for (int i = 0; i < sumofC; i++)
            {
                listView1.Columns.Add("输出值" + (i + 1).ToString(), 60);
            }
            #endregion
        }

        #region 得到随机的bool值(已注释)
        /*private bool GetBoolRand()
        {
           
            Random rand = new Random();
            double Drand = rand.NextDouble();
            if (Drand > 0.5d)
            {
                return true;
            }
            else
            {
                return false;
            }
           
        }*/
        #endregion

        private double GetDoubleRand()
        {
            #region 得到double类型的随机数0.0~1.0之间
            this.indexRand++;
            this.indexRand %= 8;
            Random Rand = new Random();
            return (double)Math.Pow(Math.Abs(Rand.NextDouble()),this.indexRand+1);
            #endregion
        }

        private ArrayList GetShuRu()
        {
            #region 得到输入节点的随机值
            ArrayList arrayL = new ArrayList();
            for(int i=0;i<this.sumofR;i++)
            {
                double tem = this.GetDoubleRand();
                arrayL.Add(tem);
            }
            return arrayL;
            #endregion
        }

        private ArrayList GetShuChu(ArrayList ShuRu)
        {
            #region 得到相应输入的输出
            if (ShuRu.Count != this.sumofR)
            {
                MessageBox.Show("输入值数量和网络输入节点数量不等!");
                return null;
            }
            else
            {
                ArrayList arrNode = new ArrayList();
                int i = 0;
                foreach (BNode1 node in myNodeArray)
                {
                    if (node.indegree == 0)
                    {
                        BNode_InOut bnode = new BNode_InOut();
                        bnode.DOut = (double)ShuRu[i];
                        bnode.node = node;
                        arrNode.Add(bnode);
                    }
                    i++;
                }
                for (int curtem = 0; curtem < myNodeArray.Count; curtem++)
                {
                    if (myNodeArray[curtem].indegree != 0)
                    {
                        ArrayList arr = this.NParent(myNodeArray[curtem].name);
                        BNode_InOut bio = new BNode_InOut();
                        double sumMul = 1.0d;
                        if (myNodeArray[curtem].m_style == "Noisy_And")
                        {
                            for (int w = 0; w < arr.Count; w++)
                            {
                                double Dout=0.0d;
                                for(int curri=0;curri<arrNode.Count;curri++)
                                {
                                    if(((BNode_InOut)arrNode[curri]).node.name==(string)arr[w])
                                    {
                                        Dout=((BNode_InOut)arrNode[curri]).DOut;
                                    }
                                }
                                sumMul *= (1 - this.GetWij((string)arr[w], myNodeArray[curtem].name) * (1 - Dout));
                            }
                        }
                        else if (myNodeArray[curtem].m_style == "Noisy_Or")
                        {
                            for (int w = 0; w < arr.Count; w++)
                            {
                                double Dout = 0.0d;
                                for (int curri = 0; curri < arrNode.Count; curri++)
                                {
                                    if (((BNode_InOut)arrNode[curri]).node.name == (string)arr[w])
                                    {
                                        Dout = ((BNode_InOut)arrNode[curri]).DOut;
                                    }
                                }
                                sumMul *= ( 1-(this.GetWij((string)arr[w], myNodeArray[curtem].name) * Dout));
                            }
                            sumMul = 1 - sumMul;
                        }
                        bio.node = myNodeArray[curtem];
                        bio.DOut = sumMul;
                        arrNode.Add(bio);
                    }
                }
                return arrNode;
            }
            #endregion
        }

        public  ArrayList NParent(string assessNode)
        {
            #region 得到节点父节点的集合
            ArrayList parent = new ArrayList();
            foreach (Line l in Lines)
            {
                if (l.dNode == assessNode)
                {
                    parent.Add(l.sNode);
                }
            }
            return parent;
            #endregion
        }

        private double GetWij(string NodeNames, string NodeNameD)
        {
            #region 得到权值在lines数组
            string wijtem="";
            foreach (Line l in this.Lines)
            {
                if ((l.sNode == NodeNames) && (l.dNode == NodeNameD))
                {
                    wijtem = l.wij;
                }
            }
            return Convert.ToDouble(wijtem);
            #endregion
        }

        private void button2_Click(object sender, EventArgs e)
        {
            #region 自动生成样本代码
            int valueNum = (int)numericUpDown1.Value;
            if (valueNum == 0)
            {
                MessageBox.Show("样本数量不能为0!");
                return;
            }
            else
            {
                this.numericUpDown1.Enabled = false;
                this.progressBar1.Maximum = valueNum;
                this.progressBar1.Minimum = 0;
                for (int i = 0; i < valueNum; i++)
                {
                    this.progressBar1.Value=i+1;
                    ArrayList arrR = this.GetShuRu();
                    ArrayList aryC = this.GetShuChu(arrR);
                    ListViewItem item = new ListViewItem((i+1).ToString());
                    for (int j = 0; j < this.sumofR; j++)
                    {
                        item.SubItems.Add(((BNode_InOut)aryC[j]).DOut.ToString());
                    }
                    for (int Ci = 0; Ci < this.sumofC; Ci++)
                    {
                        item.SubItems.Add(((BNode_InOut)aryC[aryC.Count-this.sumofC+Ci]).DOut.ToString());
                    }
                    listView1.Items.Add(item);
                }
                this.numericUpDown1.Enabled = true;
            }
           
            #endregion
        }

        private void button4_Click(object sender, EventArgs e)
        {
            #region 保存文件代码
            if (listView1.Items.Count == 0)
            {
                MessageBox.Show("样本数量为0!");
                return;
            }
            else
            {
                SaveFileDialog sf = new SaveFileDialog();
                sf.ValidateNames=true;
                sf.AddExtension = true;
                sf.DefaultExt = "txt";
                sf.Filter = "文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*"

;
                if (sf.ShowDialog() == DialogResult.OK)
                {
                    StreamWriter sw = new StreamWriter(sf.FileName);
                    sw.WriteLine(this.sumofR.ToString());
                    sw.WriteLine(this.sumofC.ToString());
                    sw.WriteLine(this.listView1.Items.Count.ToString());
                    foreach (ListViewItem li in listView1.Items)
                    {
                        string tem="";
                        for (int i = 1; i < li.SubItems.Count; i++)
                        {
                            tem += li.SubItems[i].Text + "     ";
                        }
                        sw.WriteLine(tem);
                    }
                    sw.Flush();
                    sw.Close();
                    if (MessageBox.Show("是否打开存储文件?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        Process.Start(sf.FileName);
                    }
                }
            }
            #endregion
        }

        private void button3_Click(object sender, EventArgs e)
        {
            #region 返回样本值的代码
            if (this.listView1.Items.Count == 0)
            {
                MessageBox.Show("没有样本值");
            }
            else
            {
                this.arryA = new ArrayList();
                for (int i = 0; i < listView1.Items.Count; i++)
                {
                    ArrayList arrayTem = new ArrayList();
                    for (int j = 1; j < listView1.Items[i].SubItems.Count; j++)
                    {
                        try
                        {
                            arrayTem.Add(listView1.Items[i].SubItems[j].Text);
                        }
                        catch (Exception er)
                        {
                            MessageBox.Show(er.Message);
                        }
                    }
                    this.arryA.Add(arrayTem);
                }
                this.DialogResult = DialogResult.OK;
            }
            #endregion
        }

        private void frm_Auto_Swatch_FormClosed(object sender, FormClosedEventArgs e)
        {
            #region 如何有样本返回OK,否则返回Cancel
            if (this.listView1.Items.Count == 0)
            {
                this.DialogResult = DialogResult.Cancel;
            }
            else
            {
                this.DialogResult = DialogResult.OK;
            }
            #endregion
        }

    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -