//---------------------------------------------------------------------------
#include
#include \
//--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource \TForm1 *Form1;
#include
float x1_array[100]; //存放x1的十进制 float x2_array[100]; //存放x2的十进制
int x1_update[100][100]; //更新x1的二进制 int x2_update[100][100]; //更新x2的二进制 int x1_bin[100][100]; //存放x1的二进制 int x2_bin[100][100]; //存放x2的二进制 int x1_cross[100][100]; //存放被选中x1父辈 int x2_cross[100][100]; //存放被选中x2父辈
float x1_best[1000],x2_best[1000]; //存放每一代最佳种群
//--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
//-------开始------ Edit1->Text=\ Edit2->Text=\ Edit5->Text=\ Edit6->Text=\ Edit7->Text=\ Edit8->Text=\ Edit3->Text=\ Edit4->Text=\ Edit9->Text=\ Edit14->Text=\//----结束----
} float fitness (float x1, float x2) {
float y;
y=x1*x1+x2*x2; return y; }
void swap(int *a, int *b) {
int temp; temp=*a; *a=*b; *b=temp; }
//---------------------------------------------------------------------------
void __fastcall TForm1::btnChushihuaClick(TObject *Sender) {
//---------开始---------------
float a1,b1,a2,b2; // a1,b1表示X1的区间 //a2,b2表示X2的区间
int m; //表示编码精度,小数点后m位
if(Edit5->Text==\ {//---------------------------------------------------------------------------
MessageDlg(\区间值不能为空,请输入X1与X2的区间值范围\ return; }
a1=StrToFloat(Edit5->Text); b1=StrToFloat(Edit6->Text); a2=StrToFloat(Edit7->Text); b2=StrToFloat(Edit8->Text);
if(Edit9->Text==\ {
MessageDlg(\编码精度为空,请输入需求精度(小数点后面m位)\ return; }
m=StrToInt(Edit9->Text);
for(int m1=1;;m1++)
if(((b1-a1)*pow10(m))>pow(2,m1-1)&&((b1-a1)*pow10(m))<=pow(2,m1)-1) {Edit10->Text=IntToStr(m1); break;
}
for(int m2=1;;m2++)
if(((b2-a2)*pow10(m))>pow(2,m2-1)&&((b2-a2)*pow10(m))<=pow(2,m2)-1) {Edit11->Text=IntToStr(m2); break; }
Edit12->Text= IntToStr(StrToInt(Edit10->Text)+StrToInt(Edit11->Text)); //---------------结束----------------- }
//---------------------------------------------------------------------------
void __fastcall TForm1::btnSureClick(TObject *Sender) { //----------------开始----------------- float a1,b1,a2,b2;
a1=StrToFloat(Edit5->Text); b1=StrToFloat(Edit6->Text); a2=StrToFloat(Edit7->Text); b2=StrToFloat(Edit8->Text);
if(Edit10->Text==\ {
MessageDlg(\请初始化X1,X2的编码长度!\ return; }
//产生初始种群
srand((unsigned)time(NULL));
String pop[100]; //记录二进制编码字串 ListBox1->Items->Add(\产生初始种群为:\
for(int pop_size=0;pop_size
int bin_array[100]; //记录二进制[X1,X2]的值 long int s1=0,s2=0; //记录X1,X2的十进制整数
for(int i=0;i<(StrToInt(Edit10->Text)+StrToInt(Edit11->Text));i++) {
bin_array[i]=random(2); //记录二进制种群 if( i<(StrToInt(Edit10->Text)))
x1_bin[pop_size][i]=bin_array[i]; //存放二进制X1的值 else
x2_bin[pop_size][i-StrToInt(Edit10->Text)]=bin_array[i]; //存放二进制X2的值
pop[pop_size]=pop[pop_size]+IntToStr(bin_array[i]); }
for(int j=0;j
s1+=pow(2, StrToInt(Edit10->Text)-j-1); x1_array[pop_size]=s1;
for(int k=StrToInt(Edit10->Text);k
s2+=pow(2, StrToInt(Edit12->Text)-k-1); x2_array[pop_size]=s2;
x1_array[pop_size]=a1+s1*(b1-a1)/(pow(2,StrToInt(Edit10->Text))-1); x2_array[pop_size]=a2+s2*(b2-a2)/(pow(2,StrToInt(Edit11->Text))-1);
ListBox1->Items->Add(IntToStr(pop_size+1)+\ X1=\ \ }
// 选择
int iteration=0; //记录迭代次数
label: float F=0,Fitness[100]={0}; //存取每一个染色体的适应度函数 for(int i=0;i
{ Fitness[i]=fitness(x1_array[i],x2_array[i]); }
for(int i=0;i
F+=Fitness[i]; // 群体适应度总和 avg_fitness[iteration]=F/StrToInt(Edit1->Text); // 群体适应度平均值 float P[100]={0}; float Q[100]={0};
for(int j=0;j
P[j]=Fitness[j]/F; //计算每个染色体的选择概率 for(int j=0;j
float s1=0;
for(int k=0;k<=j;k++) {
s1+=P[k]; }
Q[j]=s1; //计算每个染色体的累积概率
}

