Kod Rekürsif olarak yazılmıştır.. dileyen kodu deneyebilir.
Kod:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace kararagac
{
public partial class Form1 : Form
{
agac bas,yeni;
int x, y, ylb, c, kac ;
ComboBox[] cb;
ArrayList[] prmtr;
public class agac
{
public string ad;
public int pr;
public int cs;
public agac[] cocuk;
public agac()
{
this.cs = 0;
this.cocuk = new agac[5];
}
}
public agac ekle_agac(int eb,agac son)
{
int i;
agac cocukek;
yeni = new agac();
yeni.pr = eb;
yeni.ad= cb[eb].Name;
yeni.cs = cb[eb].Items.Count;
if (son == null)
{
bas = yeni;
son = bas;
}
else
{
son.cs =1;
son.cocuk[0] = yeni;
son = son.cocuk[0];
}
for (i = 0; i < son.cs; i++)
{
cocukek=new agac();
cocukek.pr=eb;
cocukek.ad=cb[eb].Items[i].ToString();
cocukek.cs = 0;
son.cocuk[i] = cocukek;
}
return son;
}
public agac ekle_agac(string eh, agac son)
{
yeni=new agac();
yeni.ad = eh;
yeni.pr = -1;
yeni.cs = 0;
if (son == null)
{
bas = yeni;
son = bas;
}
else
{
son.cs = 1;
son.cocuk[0] = yeni;
son = son.cocuk[0];
}
return son;
}
public Form1()
{
InitializeComponent();
x = -100;
y = 50;
ylb = 300;
c = -1;
}
public int agacgoster(agac node,int xagac, int yagac,double b)
{
int ynxagac;
for (int i = 0; i < node.cs; i++)
{
Label lb = new Label();
lb.Text = node.cocuk[i].ad;
lb.Size = new Size(70, 20);
if (node.cs == 1)
ynxagac = xagac;
else
{
if (i == node.cs / 2 )
{
if( node.cs % 2 == 0)
ynxagac = xagac + Convert.ToInt32(400 / b);
else
ynxagac = xagac;
}
else
{
if (i < (node.cs / 2) )
ynxagac = xagac - (i+1) * Convert.ToInt32( 400 / b);
else
ynxagac = xagac + (i - (node.cs / 2)) * Convert.ToInt32( 400 / b);
}
}
lb.******** = new Point(ynxagac, yagac);
lb.Font = new Font("Times New Roman", 12f, FontStyle.Bold);
lb.BackColor = Color.ForestGreen;
lb.ForeColor = Color.WhiteSmoke;
this.Controls.Add(lb);
agacgoster(node.cocuk[i], ynxagac, yagac + 30,b+0.8);
}
return 0;
}
private **** button1_Click(object sender, EventArgs e)
{
ArrayList gunler = new ArrayList();
for (int i = 0; i < prmtr[kac].Count; i++)
gunler.Add(i);
karar(null, gunler);
gstrBtn.Visible = true;
tstBtn.Visible = true;
egtbtn.Visible = false;
}
private **** kbtn_Click(object sender, EventArgs e)
{
kac = Convert.ToInt32(ktxt.Text);
hzrBtn.Visible = false;
plbl.Visible = true;
prmtxt.Visible = true;
eklebtn.Visible = true;
klbl.Visible = false;
ktxt.Visible = false;
kbtn.Visible = false;
cb = new ComboBox[kac];
prmtr = new ArrayList[kac + 1];
for (int i = 0; i < kac + 1; i++)
{
prmtr[i]=new ArrayList();
}
}
private **** eklebtn_Click(object sender, EventArgs e)
{
if (prmtxt.Text != "")
{
c++;
plbl.Visible = false;
prmtxt.Visible = false;
eklebtn.Visible = false;
drekbtn.Visible = true;
drmtxt.Visible = true;
dlbl.Visible = true;
tmbtn.Visible = true;
x = x + 150;
Label lb = new Label();
lb.Text = prmtxt.Text.ToUpper();
lb.Size = new Size(125, 20);
lb.******** = new Point(x, 10);
lb.Font = new Font("Times New Roman", 12f, FontStyle.Bold);
lb.BackColor = Color.Transparent;
lb.ForeColor = Color.DarkGreen;
this.Controls.Add(lb);
cb[c] = new ComboBox();
cb[c].Name = prmtxt.Text;
cb[c].Size = new Size(125, 30);
cb[c].******** = new Point(x, 40);
this.Controls.Add(cb[c]);
}
}
private **** drekbtn_Click(object sender, EventArgs e)
{
if (drmtxt.Text != "")
{
cb[c].Items.Add(drmtxt.Text);
drmtxt.Text = "";
}
}
private **** tmbtn_Click(object sender, EventArgs e)
{
if (kac > c+1 )
{
plbl.Visible = true;
prmtxt.Visible = true;
eklebtn.Visible = true;
prmtxt.Text = "";
}
else
{
plbl.Visible = false;
prmtxt.Visible = false;
eklebtn.Visible = false;
egtbtn.Visible = true;
}
drekbtn.Visible = false;
drmtxt.Visible = false;
dlbl.Visible = false;
tmbtn.Visible = false;
}
private **** egtbtn_Click(object sender, EventArgs e)
{
int i;
String egt = null ;
for (i = 0; i < kac; i++)
{
prmtr[i].Add(cb[i].Text);
egt = egt +" , "+ cb[i].Text;
}
prmtr[kac].Add (cbcks.Text);
egt = egt +" , "+ cbcks.Text;
Label lb = new Label();
lb.Text = egt;
lb.Size = new Size(500, 20);
lb.******** = new Point(50, ylb);
lb.ForeColor = Color.DarkSalmon;
lb.BackColor = Color.Transparent;
lb.Font = new Font("Times New Roman", 12f, FontStyle.Bold);
this.Controls.Add(lb);
ylb = ylb + 20;
krrBtn.Visible = true;
}
public double Entropy(int p, ArrayList gunler)
{
int i, j, k, nt;
double snc =0.0;
ArrayList nitelik=new ArrayList();
ArrayList ntlsy=new ArrayList();
ArrayList ygun=new ArrayList();
double topn = gunler.Count;
for (i = 0; i < topn; i++)
{
k = Convert.ToInt32(gunler[i]);
if (!nitelik.Contains(prmtr[p][k].ToString()))
{
nitelik.Add(prmtr[p][k].ToString());
ntlsy.Add(1);
}
else
{
nt = nitelik.IndexOf(prmtr[p][k].ToString());
ntlsy[nt] = Convert.ToInt32(ntlsy[nt])+1;
}
}
for (i = 0; i <nitelik.Count; i++)
{
for (j = 0; j < topn; j++)
{
k = Convert.ToInt32(gunler[j]);
if (String.Compare(prmtr[p][k].ToString(), nitelik[i].ToString()) == 0)
{
ygun.Add(k);
}
}
snc = snc + (double)(Convert.ToInt32(ntlsy[i]) / topn )* Dentropy(ygun);
ygun.Clear();
}
return snc;
}
public double Dentropy(ArrayList gunler)
{
int i,k = 0, e = 0, h = 0;
double r,t;
for (i = 0; i < gunler.Count; i++)
{
k = Convert.ToInt32(gunler[i]);
if (String.Compare(prmtr[kac][k].ToString() ,"evet")==0)
e++;
else
h++;
}
t = e + h;
r = 0.0;
if(e/t!=0)
r = -(e / t) * Math.Log((e / t), 2.0);
if(h /t!=0)
r = r- (h / t) * Math.Log((h / t), 2.0);
return r;
}
public int karar(agac son, ArrayList gunler)
{
double D;
double[] gain;
int k,p,i,eb=0;
ArrayList ygun=new ArrayList();
D = Dentropy(gunler);
if (D == 0)
{
k = Convert.ToInt32(gunler[0]);
ekle_agac(prmtr[kac][k].ToString(), son);
return 0;
}
gain=new double[kac];
for (i = 0; i < kac; i++)
{
gain[i]=D-Entropy(i,gunler);
if (gain[i] > gain[eb])
eb = i;
}
son = ekle_agac(eb, son);
p=son.pr;
for (i = 0; i < son.cs; i++)
{
for (int j = 0; j < gunler.Count; j++)
{
k = Convert.ToInt32(gunler[j]);
if (String.Compare(prmtr[p][k].ToString(), son.cocuk[i].ad)==0)
ygun.Add(k);
}
karar(son.cocuk[i], ygun);
ygun.Clear();
}
return 0;
}
private **** hzrBtn_Click(object sender, EventArgs e)
{
int i;
klbl.Visible = false;
ktxt.Visible = false;
kbtn.Visible = false;
krrBtn.Visible = true;
kac = 4;
cb = new ComboBox[4];
prmtr = new ArrayList[5];
for (i = 0; i < 5 ; i++)
{
prmtr[i] = new ArrayList();
}
String[] parametreler=new String[4];
parametreler[0]="OUTLOOK";
parametreler[1]="TEMP";
parametreler[2]="HUMIDITY";
parametreler[3]="WIND";
for(i=0;i<parametreler.Length;i++)
{
x = x + 150;
Label lb = new Label();
lb.Text = parametreler[i];
lb.Size = new Size(125, 20);
lb.******** = new Point(x, 10);
lb.Font = new Font("Times New Roman", 12f, FontStyle.Bold);
lb.BackColor = Color.Transparent;
lb.ForeColor = Color.DarkGreen;
this.Controls.Add(lb);
cb[i] = new ComboBox();
cb[i].Name = parametreler[i];
cb[i].Size = new Size(125, 30);
cb[i].******** = new Point(x, 40);
this.Controls.Add(cb[i]);
}
cb[0].Items.Add("Sunny");
cb[0].Items.Add("Overcast");
cb[0].Items.Add("Rain");
cb[1].Items.Add("Hot");
cb[1].Items.Add("Mild");
cb[1].Items.Add("Cool");
cb[2].Items.Add("High");
cb[2].Items.Add("Normal");
cb[3].Items.Add("Strong");
cb[3].Items.Add("Weak");
prmtr[0].Add("Sunny"); prmtr[1].Add("Hot"); prmtr[2].Add("High"); prmtr[3].Add("Weak"); prmtr[4].Add("hayır");
prmtr[0].Add("Sunny"); prmtr[1].Add("Hot"); prmtr[2].Add("High"); prmtr[3].Add("Strong"); prmtr[4].Add("hayır");
prmtr[0].Add("Overcast"); prmtr[1].Add("Hot"); prmtr[2].Add("High"); prmtr[3].Add("Weak"); prmtr[4].Add("evet");
prmtr[0].Add("Rain"); prmtr[1].Add("Mild"); prmtr[2].Add("High"); prmtr[3].Add("Weak"); prmtr[4].Add("evet");
prmtr[0].Add("Rain"); prmtr[1].Add("Cool"); prmtr[2].Add("Normal"); prmtr[3].Add("Weak"); prmtr[4].Add("evet");
prmtr[0].Add("Rain"); prmtr[1].Add("Cool"); prmtr[2].Add("Normal"); prmtr[3].Add("Strong"); prmtr[4].Add("hayır");
prmtr[0].Add("Overcast"); prmtr[1].Add("Cool"); prmtr[2].Add("Normal"); prmtr[3].Add("Strong"); prmtr[4].Add("evet");
prmtr[0].Add("Sunny"); prmtr[1].Add("Mild"); prmtr[2].Add("High"); prmtr[3].Add("Weak"); prmtr[4].Add("hayır");
prmtr[0].Add("Sunny"); prmtr[1].Add("Cool"); prmtr[2].Add("Normal"); prmtr[3].Add("Weak"); prmtr[4].Add("evet");
prmtr[0].Add("Rain"); prmtr[1].Add("Mild"); prmtr[2].Add("Normal"); prmtr[3].Add("Weak"); prmtr[4].Add("evet");
prmtr[0].Add("Sunny"); prmtr[1].Add("Mild"); prmtr[2].Add("Normal"); prmtr[3].Add("Strong"); prmtr[4].Add("evet");
prmtr[0].Add("Overcast"); prmtr[1].Add("Mild"); prmtr[2].Add("High"); prmtr[3].Add("Strong"); prmtr[4].Add("evet");
prmtr[0].Add("Overcast"); prmtr[1].Add("Hot"); prmtr[2].Add("Normal"); prmtr[3].Add("Weak"); prmtr[4].Add("evet");
prmtr[0].Add("Rain"); prmtr[1].Add("Mild"); prmtr[2].Add("High"); prmtr[3].Add("Strong"); prmtr[4].Add("hayır");
}
public int test(agac son)
{
if (son.ad == "evet" || son.ad == "hayır")
{
tstBtn.Text = son.ad.ToUpper();
return 0;
}
int knt=son.pr;
String ara;
ara = cb[knt].SelectedItem.ToString();
int bul,i;
bul = 0;
for (i = 0; i < son.cs; i++)
{
if (String.Compare(son.cocuk[i].ad, ara) == 0)
{
bul = i;
break;
}
}
agac yeni = son.cocuk[bul];
yeni = yeni.cocuk[0];
test(yeni);
return 0;
}
private **** tstBtn_Click(object sender, EventArgs e)
{
test(bas);
}
private **** gstrBtn_Click(object sender, EventArgs e)
{
Label lb = new Label();
lb.Text = bas.ad;
lb.Size = new Size(70, 20);
lb.******** = new Point(800, 100);
lb.Font = new Font("Times New Roman", 12f, FontStyle.Bold);
lb.BackColor = Color.ForestGreen;
lb.ForeColor = Color.WhiteSmoke;
this.Controls.Add(lb);
tstBtn.Visible = true;
agacgoster(bas, 800, 130, 1);
}
}
}