int sprawdzSupporty(Regula regula, int[][] _daneZPliku, int decyzja) { int support = 0; var licznik = regula.deskryptory.LongCount(); int licznik2 = 0; foreach (var j in _daneZPliku) { licznik2 = 0; foreach (var item in regula.deskryptory) { if (j[item.Key] == item.Value && j.Last() == regula.decyzja) { licznik2++; if (licznik2 == licznik) { support++; } } } } return(support); }
public int sprawdzCzyJestRegula(List <Regula> _listaRegul, Regula _regula) { //PRZESZUKIWANIE LISTY REGUŁ if (_listaRegul.LongCount() == 0) { return(1); } foreach (var _regulaZListy in _listaRegul) { int licznik = 0; foreach (var _deskryptorNowy in _regula.deskryptory) { int value; if (_regulaZListy.deskryptory.TryGetValue(_deskryptorNowy.Key, out value) && _deskryptorNowy.Value == value && _regulaZListy.decyzja == _regula.decyzja) { licznik += 1; if (_regula.deskryptory.LongCount() > _regulaZListy.deskryptory.LongCount() && _regulaZListy.decyzja == _regula.decyzja && licznik == _regulaZListy.deskryptory.LongCount()) { //JEŚLI POSIADAMY REGUŁE KTÓRA JEST TAKA SAMA I JEST NIŻSZEGO RZĘDU NIE DODAJEMY JEJ return(0); } } } if (licznik == _regulaZListy.deskryptory.LongCount() && _regula.deskryptory.LongCount() > licznik) { return(0); } if (licznik == _regulaZListy.deskryptory.LongCount()) { //JEŚLI REGUŁA JEST IDENTYCZNA I JEST TEJ SAMEJ DŁUGOŚCI TO ZWIĘKSZAMY SUPPORT I PRZERYWAMY PĘTLĘ _regulaZListy.support += 1; return(0); } if (_listaRegul.Last() == _regulaZListy) { //JEŚLI SPRAWDZILIŚMY WSZYSTKIE REGUŁY I NIE MA TAKIEJ REGUŁY JESZCZE W LIŚCIE DODAJEMY JĄ return(1); } } return(1); }
bool coveringCzyZawieraRegule(List <Regula> _listaRegul, Regula _nowa, int [] _kombinacja) { foreach (var stara in _listaRegul) { int licznik = 0; foreach (var deskryptor in _nowa.deskryptory) { int value; if (stara.deskryptory.TryGetValue(deskryptor.Key, out value) && value == deskryptor.Value) { licznik += 1; if ((licznik == _nowa.deskryptory.LongCount()) && (stara.decyzja == _nowa.decyzja)) { return(true); } } } } return(false); }
private void btnWybierz_Click(object sender, EventArgs e) { listaRegulTextBox.Clear(); var wynik = ofd.ShowDialog(); if (wynik != DialogResult.OK) { return; } if (wynik == DialogResult.OK) { tbScieszka.Text = ofd.FileName; string trescPliku = System.IO.File.ReadAllText(ofd.FileName); string[] poziomy = trescPliku.Split('\n'); int[][] daneZPliku = new int[poziomy.Length][]; for (int i = 0; i < poziomy.Length; i++) { string poziom = poziomy[i].Trim(); string[] miejscaParkingowe = poziom.Split(' '); daneZPliku[i] = new int[miejscaParkingowe.Length]; for (int j = 0; j < miejscaParkingowe.Length; j++) { daneZPliku[i][j] = int.Parse(miejscaParkingowe[j]); } } if (exhaustiveRadioButton.Checked) { // EXHAUSTIVE //TWORZENIE MACIERZY NIEODROZNIALNOSCI int[][][] macierzNieodroznialnosci = new int[daneZPliku.Length][][]; for (int j = 0; j < daneZPliku.Length; j++) { macierzNieodroznialnosci[j] = new int[daneZPliku.Length][]; for (int k = 0; k < daneZPliku.Length; k++) { int[] tabTemp = niejakiestamAtrybuty(daneZPliku[j], daneZPliku[k]); macierzNieodroznialnosci[j][k] = new int[tabTemp.Length]; macierzNieodroznialnosci[j][k] = tabTemp; } } Combination cam = new Combination(daneZPliku.First().Length - 1); List <Regula> listaRegul = new List <Regula>(); //GŁÓWNA PĘTLA ALGORYTMU EXHAUSTIVE foreach (var k in cam.GetRowsForAllPicks()) { int[] kombinacja = k.ToArray(); for (int i = 0; i < macierzNieodroznialnosci.Length; i++) { if (CzyKombinacjaSprzeczna(macierzNieodroznialnosci[i], kombinacja)) { continue; } else // TWORZYMY REGUŁE KTÓRĄ W FUNKCJI SPRAWDZIMY CZY MOŻEMY DODAĆ { Regula nowaReg = new Regula(daneZPliku[i].Last()); nowaReg.atrybutIWartosci(daneZPliku[i], kombinacja); if (sprawdzCzyJestRegula(listaRegul, nowaReg) == 1) // JEŚLI NIE ISTNIEJE TAKA REGUŁA WTEDY DODAJEMY JĄ DO LISTY REGUŁ { nowaReg.support = 1; listaRegul.Add(nowaReg); } }; } } foreach (var regula in listaRegul) { foreach (var deskryptor in regula.deskryptory) { listaRegulTextBox.Text += "( a" + deskryptor.Key + " ) = " + deskryptor.Value; if (!(deskryptor.Equals(regula.deskryptory.Last()))) { listaRegulTextBox.Text += " && "; } } listaRegulTextBox.Text += " => " + " d = " + regula.decyzja; if (regula.support != 1) { listaRegulTextBox.Text += " [" + regula.support + "]"; } listaRegulTextBox.AppendText(Environment.NewLine); } } if (coveringRadioButton.Checked) { /* covering */ Combination cam = new Combination(daneZPliku.First().Length - 1); List <Regula> listaRegul = new List <Regula>(); List <int> skip = new List <int>(); int supp = 0; foreach (var k in cam.GetRowsForAllPicks()) { int[] kombinacja = k.ToArray(); for (int i = 0; i < daneZPliku.Length; i++) { if (skip.Contains(i)) { continue; } supp = coveringFunc(daneZPliku[i], kombinacja, daneZPliku, skip); if (supp == 0) { continue; } else { Regula nowa = new Regula(daneZPliku[i].Last()); nowa.atrybutIWartosci(daneZPliku[i], kombinacja); nowa.support = supp; skip.Add(i); if (coveringCzyZawieraRegule(listaRegul, nowa, kombinacja)) { continue; } listaRegul.Add(nowa); }; } } foreach (var regula in listaRegul) { foreach (var deskryptor in regula.deskryptory) { listaRegulTextBox.Text += "( a" + deskryptor.Key + " ) = " + deskryptor.Value; if (!(deskryptor.Equals(regula.deskryptory.Last()))) { listaRegulTextBox.Text += " && "; } } listaRegulTextBox.Text += " => " + " d = " + regula.decyzja; if (regula.support != 1) { listaRegulTextBox.Text += " [" + regula.support + "]"; } listaRegulTextBox.AppendText(Environment.NewLine); } } if (lem2RadioButton.Checked) { var posortowana = lem2PosortujWedlugKlucza(daneZPliku); List <List <int> > listaDaneZPliku = new List <List <int> >(); List <int> listaKlas = new List <int>(); List <Regula> listaRegul = new List <Regula>(); for (int i = 0; i < posortowana.Length; i++) { listaDaneZPliku.Add(posortowana[i].ToList()); } foreach (var item in listaDaneZPliku) { if (!listaKlas.Contains(item.Last())) { listaKlas.Add(item.Last()); } } foreach (var item in listaKlas) { List <Regula> listaRegulKl1 = szukajReguly(listaDaneZPliku, daneZPliku, item); foreach (var regula in listaRegulKl1) { foreach (var deskryptor in regula.deskryptory) { listaRegulTextBox.Text += "( a" + (Convert.ToInt32(deskryptor.Key) + 1) + " ) = " + deskryptor.Value; if (!(deskryptor.Equals(regula.deskryptory.Last()))) { listaRegulTextBox.Text += " && "; } } listaRegulTextBox.Text += " => " + " d = " + regula.decyzja; if (regula.support != 1) { listaRegulTextBox.Text += " [" + regula.support + "]"; } listaRegulTextBox.AppendText(Environment.NewLine); } } } } }
List <Regula> szukajReguly(List <List <int> > listaDaneZplikuRef, int[][] tab, int decyzja) { List <List <int> > listaDaneZpliku = listaDaneZplikuRef; List <int> doGotowychRegulSkip = new List <int>(); int ileRegul = 0; List <Regula> listaRegulLEM2 = new List <Regula>(); foreach (var item in listaDaneZpliku) { if (item.Last() == decyzja) { ileRegul += 1; } } while (doGotowychRegulSkip.LongCount() != ileRegul) { Dictionary <int, int> maxior = new Dictionary <int, int>(); int licznik, temp, max, maxAllColumn = maxAllColumn = max = licznik = temp = 0; int adres = 0; List <int> indexList = new List <int>(); Regula nowa = new Regula(decyzja); do { licznik = 0; adres = 0; // TO BEDZIE TRZEBA ZMIENIC BO PRZY DODAWANIU W SLOWNIKU MOGLA WARTOSC JUZ WYSTAPIC maxAllColumn = 0; for (int i = 0; i < tab[0].LongCount() - 1; i++) // ATRYBUT { max = 0; // NIE MA JESZCZEW TEJ KOLUMNIE MAXYMALNEGO WYSTĄPIENIA WIEC ZERUJEMY if (maxior.ContainsKey(i)) { continue; } for (int j = 0; j < listaDaneZpliku.LongCount(); j++) // OBIEKT 1 { if (indexList.Contains(j) || doGotowychRegulSkip.Contains(j)) { continue; } licznik = 0; // ZERUJEMY LICZNIK DLA SPRAWDZANEGO ATRYBUTU DANEGO OBIEKTU for (int k = 0; k < listaDaneZpliku.LongCount(); k++) // OBIEKT 2 { if (indexList.Contains(k) || doGotowychRegulSkip.Contains(k)) { continue; } if (decyzja == listaDaneZpliku[k].Last() && decyzja == listaDaneZpliku[j].Last()) // JEŚLI OBIEKT 2 I OBIEKT 1 MAJĄ TAKĄ SAMA DECYZJE TO SPOKO { if (listaDaneZpliku[j][i] == listaDaneZpliku[k][i]) // JEŚLI OBIEKT 1 I OBIEKT 2 MAJA TAKA SAMA WARTOŚĆ POD TYM SAMYM ATRYBUTEM TO DODAJ DO LICZNIKA { licznik += 1; } } } if (max < licznik) //JEŚLI MAX JEST MNIEJSZY NIŻ NOWY TO ZMIEŃMY { max = licznik; // MAXYMALNY LICZNIK W DANEJ SPRAWDZANEJ KOLUMNIE if (maxAllColumn == 0 || maxAllColumn < licznik) { maxAllColumn = licznik; // MAXYMALNY LICZNIK Z WSZYSTKICH SPRAWDZANYCH DOSTEPNYCH KOLUMN adres = i; // NUMER KOLUMNY W KTOREJ ZNALEZIONO NAJWIEKSZE WYSTAPIENIE temp = listaDaneZpliku[j][i]; // wartość maxa } } } } maxior.Add(adres, temp); // ADRES = NUMER KOLUMNY ATRYBUTU, TEMP = WARTOŚĆ foreach (var item in listaDaneZpliku) // zawężanie kręgu poszukiwań, kasowanie obiektów które już nie są brane pod uwagę z listy { if (!(item[maxior.Last().Key] == maxior.Last().Value) && item.Last() == decyzja && !(indexList.Contains(listaDaneZpliku.IndexOf(item))) && !(doGotowychRegulSkip.Contains(listaDaneZpliku.IndexOf(item)))) { indexList.Add(listaDaneZpliku.IndexOf(item)); } } } while (sprawdzReguleLEM(maxior, tab, decyzja)); nowa.deskryptory = maxior; nowa.support = sprawdzSupporty(nowa, tab, decyzja); listaRegulLEM2.Add(nowa); foreach (var item in listaDaneZpliku) { if (item.Last() == decyzja && !(indexList.Contains(listaDaneZpliku.IndexOf(item))) && !(doGotowychRegulSkip.Contains(listaDaneZpliku.IndexOf(item)))) { doGotowychRegulSkip.Add(listaDaneZpliku.IndexOf(item)); } } } return(listaRegulLEM2); }