- #1
Superposed_Cat
- 388
- 5
Hey all, writing this simple genetic algorithm but its not working. Any idea why?
Any help apreciated.
C:
static int len = 30;
static char[,] dog = new char[len, 30];
static void breed()
{
sort();
int Ii0 = r.Next(0,15);
int Ii1=r.Next(0,15);
string i0 = get(Ii0);
string i1 = get(Ii1);
Cross(Ii0, Ii1);
Mut(r.Next(0,10), r.Next(0,30),3);
}
static void sort()
{
for (int p = 0; p < 30; p++)
{
for (int i = 0; i < 30 - 1; i++)
{
if (fitness(i) > fitness(i + 1))
{
string i0 = get(i);
string i1 = get(i + 1);
set(i, i1);
set(i + 1, i0);
}
}
}
}
static int getnum(string s)
{
int u = 0;
for (int i = 0; i < s.Length; i++)
{
if ((int)s[i] == (int)'1')
{
u++;
}
else if ((int)s[i] == (int)'-')
{
u--;
}
}
return u;
}
static double fitness(int y)
{
dog.ToString();
string s = get(y);
int u = getnum(get(y));
return ( 1 / ((2 * u * u) + (33.25f * u) + 20));//30//-30
;
}
static double fitness(string y)
{
int u = getnum(y);
return ( 1 / ((2 * u * u) + (33.25f * u) + 20));//30//-30
}
static void init()
{
string[] lines = System.IO.File.ReadAllLines("C:/users/e/desktop/init.txt");
// StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < len; i++)
{
for (int j = 0; j < 30; j++)
{
dog[i, j] = lines[i][j];
}
}
}
static void Mut(int chr,int pos,int chance)
{
var yy = r.Next(0,300);
if (r.Next(0, 100) < chance)
{
if (dog[chr, pos] == '0')
{
if (r.Next(100) < 50)
{
dog[chr, pos] = '1';
}
else
{
dog[chr, pos] = '-';
}
}
if (dog[chr, pos] == '1')
{
if (r.Next(100) < 50)
{
dog[chr, pos] = '0';
}
else
{
dog[chr, pos] = '-';
}
}
if (dog[chr, pos] == '-')
{
if (r.Next(100) < 50)
{
dog[chr, pos] = '1';
}
else
{
dog[chr, pos] = '0';
}
}
}
}
static Random r = new Random();
static void Cross(int j, int k)
{
for (int i = 0; i < len; i++)
{
if (r.Next(100) < 50)
{
char jt = dog[j, i];
char kt = dog[k, i];
dog[k, i] = jt;
dog[j, i] = kt;
}
}
}
static string get(int y)
{
string h = "";
for (int i = 0; i < 30; i++)
{
h += dog[y, i];
}
return h;
}
static void set(int y,string s)
{
for (int i = 0; i < 30; i++)
{
dog[y, i] = s[i];
}
}
static void Main(string[] args)
{
init();
for (int i = 0; i < len; i++)
{
Console.WriteLine(getnum(get(i)));
}
for (int j = 0; j < 10; j++)
{
for (int i = 0; i < 400; i++)
{
breed();
}
sort();
Console.WriteLine(fitness(0));
Console.WriteLine(getnum(get(0)));
}
for (int i = -30; i < 30; i++)
{
Console.WriteLine(i.ToString() + ":" + (i).ToString());
}
Console.Read();
}