#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<windows.h>
int trans1(int);
int trans2(int);
int function(int);
int comparing(int *);
int trans1(int x)
{
int i, s, b[6];
double k;
for (i = 0; i < 6; i++)
{
k = ((x % (int)pow(10, i + 1)) / (pow(10, i)));
b[i] = floor(k);
}
s = b[0] + 2 * b[1] + 4 * b[2] + 8 * b[3] + 16 * b[4] + 32 * b[5];
return s;
}
int function(int a)
{
int y;
y = a * a - 19 * a + 20;
return y;
}
int comparing(int *ar)
{
int m, i, t, k = 0;
m = function(ar[0]);
for (i = 1; i <= 9; i++)
{
if (function(ar[i]) < m)
{
m = function(ar[i]);
k = i;
}
}
t = *(ar + k);
*(ar + k) = 100;
return trans2(t);
}
int trans2(int t)
{
int a[6] = { 0,0,0,0,0,0 }, i = 0, s;
while (t)
{
a[i] = t % 2;
t = floor((double)t / 2);
i++;
}
s = a[0] + 10 * a[1] + 100 * a[2] + 1000 * a[3] + 10000 * a[4] + 100000 * a[5];
return s;
}
int main()
{
int a[10],i,j,b[4][6],s[10];
int x[10];
int t = 3,t0, k1, k2, g, n;
int d[2][6], t1, t2;
int sr,state=0;
printf("**********************************************************\n\n");
printf(" 此程序用遗传算法求函数f(x)=x^2-19*x+20 最小值的解\n\n");
printf("**********************************************************\n\n\n");
Sleep(1000);
printf("输入四个六位二进制数字 x1 到 x4\n");
scanf_s("%d %d %d %d", x, x + 1, x + 2, x + 3); //以二进制形式输入六位数字存入一维数组x中
printf("输入任意数字开始进化,输入q结束进化\n");
while (scanf_s("%d", &sr) == 1)
{
srand((unsigned)time(0));
//将x0到x3中的六位数放入二维数组中进行交叉互换,并把交换后的新值放入x4到x7中
for (j = 0; j <= 3; j++)
for (i = 0; i <= 5; i++)
b[j][i] = floor((x[j] % (int)pow(10, i + 1)) / pow(10, i));
while (t == 3)
t = ((rand() % 10) / 3);
if (t == 0)
k1 = 1, k2 = 2;
else if (t == 1)
k1 = 0, k2 = 2;
else
k1 = 0, k2 = 1;
t0 = rand() % 5;
g = b[k1][t0+1];
n = b[k1][t0];
b[k1][t0 + 1] = b[k2][t0 + 1];
b[k1][t0] = b[k2][t0];
b[k2][t0 + 1] = g;
b[k2][t0] = n;
g = b[t][t0 + 1];
n = b[t][t0];
b[t][t0 + 1] = b[3][t0 + 1];
b[t][t0] = b[3][t0];
b[3][t0 + 1] = g;
b[3][t0] = n;
for (j = 4; j <= 7; j++)
x[j] = b[j - 4][0] + 10 * b[j - 4][1] + 100 * b[j - 4][2] + 1000 * b[j - 4][3] + 10000 * b[j - 4][4] + 100000 * b[j - 4][5];
printf("交叉互换后的数x4到x7等于%d %d %d %d\n", x[4], x[5], x[6], x[7]);
//交叉互换结束
//将x1到x4放入二维数组d中进行突变,并把突变后的新值放入x8到x9中 k1 = rand() % 4;
k2 = rand() % 4;
while (k1 == k2)
k2 = rand() % 4;
for (j = 0; j <= 1; j++)
if (j == 0)
for (i = 0; i <= 5; i++)
d[j][i] = floor((x[k1] % (int)pow(10, i + 1)) / pow(10, i));
else
for (i = 0; i <= 5; i++)
d[j][i] = floor((x[k2] % (int)pow(10, i + 1)) / pow(10, i));
t1 = rand() % 6;
t2 = rand() % 6;
if (d[0][t1] == 0)
d[0][t1] = 1;
else
d[0][t1] = 0;
if (d[1][t2] == 0)
d[1][t2] = 1;
else
d[1][t2] = 0;
for (j = 8; j <= 9; j++)
x[j] = d[j - 8][0] + 10 * d[j - 8][1] + 100 * d[j - 8][2] + 1000 * d[j - 8][3] + 10000 * d[j - 8][4] + 100000 * d[j - 8][5];
printf("突变后的新数x8到x9等于%d %d\n", x[8], x[9]);
//突变结束
//将二进制数x0到x9转换成十进制放入数组a中,计算f(a)的值
for (j = 0; j <= 9; j++)
a[j] = trans1(x[j]);
for (j = 0; j <= 9; j++)
s[j] = function(a[j]);
for (j = 0; j <= 9; j++)
{
printf(" x=%d, ", a[j]);
printf("f(x)=%d\n", s[j]);
}
//比较10个f(a)的大小
for (j = 0; j <= 3; j++)
x[j] = comparing(a);
for (j = 0; j <= 3; j++)
printf("得到的解x等于%d, %d\n", x[j],trans1(x[j]));
printf("\n\n");
state++;
}
printf("******************\n\n");
printf(" 计算结束\n\n");
printf("进化次数:%d 最终结果等于%d, %d\n",state, x[0],trans1(x[0]));
Sleep(10000);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<windows.h>
int trans1(int);
int trans2(int);
int function(int);
int comparing(int *);
int trans1(int x)
{
int i, s, b[6];
double k;
for (i = 0; i < 6; i++)
{
k = ((x % (int)pow(10, i + 1)) / (pow(10, i)));
b[i] = floor(k);
}
s = b[0] + 2 * b[1] + 4 * b[2] + 8 * b[3] + 16 * b[4] + 32 * b[5];
return s;
}
int function(int a)
{
int y;
y = a * a - 19 * a + 20;
return y;
}
int comparing(int *ar)
{
int m, i, t, k = 0;
m = function(ar[0]);
for (i = 1; i <= 9; i++)
{
if (function(ar[i]) < m)
{
m = function(ar[i]);
k = i;
}
}
t = *(ar + k);
*(ar + k) = 100;
return trans2(t);
}
int trans2(int t)
{
int a[6] = { 0,0,0,0,0,0 }, i = 0, s;
while (t)
{
a[i] = t % 2;
t = floor((double)t / 2);
i++;
}
s = a[0] + 10 * a[1] + 100 * a[2] + 1000 * a[3] + 10000 * a[4] + 100000 * a[5];
return s;
}
int main()
{
int a[10],i,j,b[4][6],s[10];
int x[10];
int t = 3,t0, k1, k2, g, n;
int d[2][6], t1, t2;
int sr,state=0;
printf("**********************************************************\n\n");
printf(" 此程序用遗传算法求函数f(x)=x^2-19*x+20 最小值的解\n\n");
printf("**********************************************************\n\n\n");
Sleep(1000);
printf("输入四个六位二进制数字 x1 到 x4\n");
scanf_s("%d %d %d %d", x, x + 1, x + 2, x + 3); //以二进制形式输入六位数字存入一维数组x中
printf("输入任意数字开始进化,输入q结束进化\n");
while (scanf_s("%d", &sr) == 1)
{
srand((unsigned)time(0));
//将x0到x3中的六位数放入二维数组中进行交叉互换,并把交换后的新值放入x4到x7中
for (j = 0; j <= 3; j++)
for (i = 0; i <= 5; i++)
b[j][i] = floor((x[j] % (int)pow(10, i + 1)) / pow(10, i));
while (t == 3)
t = ((rand() % 10) / 3);
if (t == 0)
k1 = 1, k2 = 2;
else if (t == 1)
k1 = 0, k2 = 2;
else
k1 = 0, k2 = 1;
t0 = rand() % 5;
g = b[k1][t0+1];
n = b[k1][t0];
b[k1][t0 + 1] = b[k2][t0 + 1];
b[k1][t0] = b[k2][t0];
b[k2][t0 + 1] = g;
b[k2][t0] = n;
g = b[t][t0 + 1];
n = b[t][t0];
b[t][t0 + 1] = b[3][t0 + 1];
b[t][t0] = b[3][t0];
b[3][t0 + 1] = g;
b[3][t0] = n;
for (j = 4; j <= 7; j++)
x[j] = b[j - 4][0] + 10 * b[j - 4][1] + 100 * b[j - 4][2] + 1000 * b[j - 4][3] + 10000 * b[j - 4][4] + 100000 * b[j - 4][5];
printf("交叉互换后的数x4到x7等于%d %d %d %d\n", x[4], x[5], x[6], x[7]);
//交叉互换结束
//将x1到x4放入二维数组d中进行突变,并把突变后的新值放入x8到x9中 k1 = rand() % 4;
k2 = rand() % 4;
while (k1 == k2)
k2 = rand() % 4;
for (j = 0; j <= 1; j++)
if (j == 0)
for (i = 0; i <= 5; i++)
d[j][i] = floor((x[k1] % (int)pow(10, i + 1)) / pow(10, i));
else
for (i = 0; i <= 5; i++)
d[j][i] = floor((x[k2] % (int)pow(10, i + 1)) / pow(10, i));
t1 = rand() % 6;
t2 = rand() % 6;
if (d[0][t1] == 0)
d[0][t1] = 1;
else
d[0][t1] = 0;
if (d[1][t2] == 0)
d[1][t2] = 1;
else
d[1][t2] = 0;
for (j = 8; j <= 9; j++)
x[j] = d[j - 8][0] + 10 * d[j - 8][1] + 100 * d[j - 8][2] + 1000 * d[j - 8][3] + 10000 * d[j - 8][4] + 100000 * d[j - 8][5];
printf("突变后的新数x8到x9等于%d %d\n", x[8], x[9]);
//突变结束
//将二进制数x0到x9转换成十进制放入数组a中,计算f(a)的值
for (j = 0; j <= 9; j++)
a[j] = trans1(x[j]);
for (j = 0; j <= 9; j++)
s[j] = function(a[j]);
for (j = 0; j <= 9; j++)
{
printf(" x=%d, ", a[j]);
printf("f(x)=%d\n", s[j]);
}
//比较10个f(a)的大小
for (j = 0; j <= 3; j++)
x[j] = comparing(a);
for (j = 0; j <= 3; j++)
printf("得到的解x等于%d, %d\n", x[j],trans1(x[j]));
printf("\n\n");
state++;
}
printf("******************\n\n");
printf(" 计算结束\n\n");
printf("进化次数:%d 最终结果等于%d, %d\n",state, x[0],trans1(x[0]));
Sleep(10000);
return 0;
}