private void Luat_Ket_Hop_Tung_Mat_Hang(float minsup, float minconf, string chuoi)
        {
            mlvDanhSachMH.Items.Clear();
            chuoi = chuoi.Trim();
            //Tách từng nhóm.
            string where = "'" + chuoi[0].ToString();
            for (int i = 1; i < chuoi.Length; i++)
            {
                if (chuoi[i] != ' ' && chuoi[i] != '-')
                {
                    where = where + "','" + chuoi[i].ToString();
                }
            }
            where = where + "'";

            string    lenh = "Select Distinct tblCTHoaDon.mahd from tblSanPham, tblCTHoaDon where tblCTHoaDon.masp = tblSanPham.masp and tblSanPham.manhom in(" + where + ")";
            DataTable dtHD = Connect_Database.Doc_Bang(lenh);

            lenh = "Select Distinct tblSanPham.masp from tblSanPham,tblCTHoaDon where tblCTHoaDon.masp=tblSanPham.masp and tblSanPham.manhom in(" + where + ")";
            DataTable dtMasp = Connect_Database.Doc_Bang(lenh);

            dtMasp.Columns.Add("tam", typeof(string));
            string[] anpha = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
            for (int i = 0; i < dtMasp.Rows.Count; i++)
            {
                dtMasp.Rows[i]["tam"] = anpha[i % anpha.Length];
            }


            //Xử lý kết nối các Transaction.
            List <string> trans = new List <string>();

            for (int i = 0; i < dtHD.Rows.Count; i++)
            {
                string    mahd = dtHD.Rows[i]["mahd"].ToString().Trim();
                DataTable dthd = Connect_Database.Doc_Bang("select tblCTHoaDon.mahd, tblCTHoaDon.masp from tblCTHoaDon, tblSanPham where tblSanPham.masp = tblCTHoaDon.masp and tblCTHoaDon.mahd = '" + mahd + "'");
                string    str  = "";
                for (int j = 0; j < dthd.Rows.Count; j++)
                {
                    for (int k = 0; k < dtMasp.Rows.Count; k++)
                    {
                        if (dtMasp.Rows[k]["masp"].ToString().Trim() == dthd.Rows[j]["masp"].ToString().Trim())
                        {
                            if (!str.Contains(dtMasp.Rows[k]["tam"].ToString().Trim()))
                            {
                                str = str + dtMasp.Rows[k]["tam"].ToString().Trim();
                                k   = dtMasp.Rows.Count;
                            }
                        }
                    }
                }
                trans.Add(str);
            }

            //xứ lý thuật toán Aprirori
            ItemsetCollection db = new ItemsetCollection();

            for (int i = 0; i < trans.Count(); i++)
            {
                string aa = trans.ElementAt(i).Trim();
                //string[] mang =new string[aa.Length];
                Itemset itemtraining = new Itemset();
                for (int j = 0; j < aa.Length; j++)
                {
                    itemtraining.Add(aa[j].ToString());
                }
                // mang[j] = aa[j].ToString();
                db.Add(itemtraining);
            }


            Itemset           uniqueItems = db.GetUniqueItems();
            ItemsetCollection L           = AprioriMining.DoApriori(db, minsup);

            mlvDanhSachMH.View          = View.Details;
            mlvDanhSachMH.GridLines     = true;
            mlvDanhSachMH.FullRowSelect = true;

            //Thêm tiêu đề cho cột.
            mlvDanhSachMH.Columns.Add("Tập luật kết hợp", 450);
            mlvDanhSachMH.Columns.Add("Min_conf", 70);
            //test mining
            List <AssociationRule> allRules = AprioriMining.Mine(db, L, minconf);

            Console.Write("\n" + allRules.Count + " rules\n");

            bool kq_kt = false;

            foreach (AssociationRule rule in allRules)
            {
                string   s = rule.ToString();
                string[] a = s.Split(':');
                if (a[2] != "" && float.Parse(a[1]) >= minsup && float.Parse(a[2]) >= minconf)
                {
                    string ss = "{";
                    a[0] = a[0].Replace('{', ' ');
                    a[0] = a[0].Replace('}', ' ');
                    a[0] = a[0].Trim();
                    string[] aaa  = a[0].Split('-');
                    string   sss1 = Doi_Sang_Masp(dtMasp, aaa[0]);
                    string   sss2 = Doi_Sang_Masp(dtMasp, aaa[1]);
                    if (sss1.Trim() != "" && sss2.Trim() != "")
                    {
                        ss = sss1 + " => " + sss2;

                        ListViewItem lstItem1 = new ListViewItem();
                        lstItem1.SubItems[0].Text = ss;
                        lstItem1.SubItems.Add(a[2] + "%");
                        mlvDanhSachMH.Items.Add(lstItem1);
                    }

                    //Đếm tổng số luật các mặt hàng gần nhau.
                    lblTongDSMH.Text = "" + mlvDanhSachMH.Items.Count;

                    kq_kt = true;
                }
                //Console.Write(rule + "\n");
            }

            if (!kq_kt)
            {
                MetroFramework.MetroMessageBox.Show(this, "Không có luật kết hợp thỏa điều kiện", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                lblTongDSMH.Text = "0";
            }
        }
        private void btnApriori_Click(object sender, EventArgs e)
        {
            mlvTapPhoBien.Clear();
            mlvTapLuatKH.Clear();
            mlvDanhSachMH.Clear();

            mang_luu = new List <string>();
            if ((DataTable)dgvLoadDSHoaDon.DataSource == null)
            {
                MetroFramework.MetroMessageBox.Show(this, "Vui lòng import dữ liệu.");
            }
            else
            {
                DataTable dt = ((DataTable)dgvLoadDSHoaDon.DataSource).Clone();
                dt.Columns.Add("tam", typeof(string));

                float minsup  = 0;
                float minconf = 0;

                if (txtMinSupp.Text.Trim() == "")
                {
                    MetroFramework.MetroMessageBox.Show(this, "Vui lòng nhập độ phổ biến.");
                    return;
                }

                minsup = (float)(float.Parse(txtMinSupp.Text) / 100.0);

                if (txtMinConf.Text.Trim() == "")
                {
                    MetroFramework.MetroMessageBox.Show(this, "Vui lòng nhập độ hổ trợ.");
                    return;
                }

                minconf = (float)(float.Parse(txtMinConf.Text) / 100.0);

                if (float.Parse(txtMinSupp.Text) > float.Parse(txtMinConf.Text))
                {
                    MetroFramework.MetroMessageBox.Show(this, "Không có luật kết hợp thỏa điều kiện.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    lblTongTLKH.Text = "0";
                    lblTongTPB.Text  = "0";
                    return;
                }

                //Bắt đầu thuật toán Apriori.
                List <string> item   = new List <string>();
                DataTable     dtdata = Connect_Database.Doc_Bang("Select Distinct manhom From tblSanPham");
                for (int i = 0; i < dtdata.Rows.Count; i++)
                {
                    item.Add(dtdata.Rows[i]["manhom"].ToString().Trim());
                }

                //xử lý kết nối các Transaction
                List <string> trans   = new List <string>();
                DataTable     dtnguon = Connect_Database.Doc_Bang("select Distinct mahd from tblCTHoaDon");
                for (int i = 0; i < dtnguon.Rows.Count; i++)
                {
                    string    mahd = dtnguon.Rows[i]["mahd"].ToString().Trim();
                    DataTable dthd = Connect_Database.Doc_Bang("select tblCTHoaDon.mahd, tblCTHoaDon.masp, tblSanPham.manhom from tblCTHoaDon, tblSanPham where tblSanPham.masp=tblCTHoaDon.masp and tblCTHoaDon.mahd='" + mahd + "'");
                    string    str  = "";
                    for (int j = 0; j < dthd.Rows.Count; j++)
                    {
                        if (!str.Contains(dthd.Rows[j]["manhom"].ToString().Trim())) //kiêm tra nhóm
                        {
                            str = str + dthd.Rows[j]["manhom"].ToString().Trim();
                        }
                    }
                    trans.Add(str);
                }

                //xứ lý thuật toán Aprirori
                ItemsetCollection db = new ItemsetCollection();
                for (int i = 0; i < trans.Count(); i++)
                {
                    string aa = trans.ElementAt(i).Trim();
                    //string[] mang =new string[aa.Length];
                    Itemset itemtraining = new Itemset();
                    for (int j = 0; j < aa.Length; j++)
                    {
                        itemtraining.Add(aa[j].ToString());
                    }
                    // mang[j] = aa[j].ToString();
                    db.Add(itemtraining);
                }
                mlvTapPhoBien.View          = View.Details;
                mlvTapPhoBien.GridLines     = true;
                mlvTapPhoBien.FullRowSelect = true;

                //Thêm tiêu đề cho cột.
                mlvTapPhoBien.Columns.Add("Tập phổ biến", 205);
                mlvTapPhoBien.Columns.Add("Min_supp", 90);
                Itemset           uniqueItems = db.GetUniqueItems();
                ItemsetCollection L           = AprioriMining.DoApriori(db, minsup);
                Console.Write("\n" + L.Count + " itemsets in L\n");
                foreach (Itemset i in L)
                {
                    string   s = i.ToLuat();
                    string[] a = s.Split(':');
                    if (a[1].Trim() != "" && float.Parse(a[1]) >= minsup * 100)
                    {
                        ListViewItem lstItem1 = new ListViewItem();
                        string       ss       = Xu_ly_chuoi(a[0].Trim());

                        lstItem1.SubItems[0].Text = ss;
                        lstItem1.SubItems.Add(a[1] + "%");
                        mlvTapPhoBien.Items.Add(lstItem1);
                    }

                    //Đếm tổng số tập phổ biến trong danh mục sản phẩm.
                    lblTongTPB.Text = "" + mlvTapPhoBien.Items.Count;
                }

                mlvTapLuatKH.View          = View.Details;
                mlvTapLuatKH.GridLines     = true;
                mlvTapLuatKH.FullRowSelect = true;

                //Thêm tiêu đề cho cột
                mlvTapLuatKH.Columns.Add("Tập luật kết hợp", 300);
                mlvTapLuatKH.Columns.Add("Min_conf", 70);
                //test mining
                List <AssociationRule> allRules = AprioriMining.Mine(db, L, minconf);
                Console.Write("\n" + allRules.Count + " rules\n");

                bool kq_kt = false;

                foreach (AssociationRule rule in allRules)
                {
                    string   s = rule.ToString();
                    string[] a = s.Split(':');
                    if (a[2] != "" && float.Parse(a[1]) >= minsup * 100 && float.Parse(a[2]) >= minconf * 100)
                    {
                        string ss = "{";
                        a[0] = a[0].Replace('{', ' ');
                        a[0] = a[0].Replace('}', ' ');
                        a[0] = a[0].Trim();
                        string[] aaa  = a[0].Split('-');
                        string   sss1 = Xu_ly_chuoi(aaa[0]);
                        string   sss2 = Xu_ly_chuoi(aaa[1]);
                        ss = sss1 + " => " + sss2;
                        mang_luu.Add(a[0]);
                        ListViewItem lstItem1 = new ListViewItem();
                        lstItem1.SubItems[0].Text = ss;
                        lstItem1.SubItems.Add(a[2] + "%");
                        mlvTapLuatKH.Items.Add(lstItem1);

                        //Đếm tổng số luật kết hợp trong danh mục sản phẩm.
                        lblTongTLKH.Text = "" + mlvTapLuatKH.Items.Count;

                        kq_kt = true;
                    }


                    //Console.Write(rule + "\n");
                }

                if (!kq_kt)
                {
                    MetroFramework.MetroMessageBox.Show(this, "Không có luật kết hợp thỏa điều kiện.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
        }