C,
pasted
on Nov 29:
|
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int total;
int n[10] ;
} HOGE;
// 計算する
void ComputeTotal ( HOGE* hoge )
{
int *n = hoge->n;
hoge->total = ((n[0]+(n[1]+n[2])*(n[3]*n[4]))*(n[5]+n[6]))+(n[7]+(n[8]+n[9])) ;
}
// ランダムで個体を生成
void CreateHoge ( HOGE* hoge )
{
int i, buff;
int n[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for ( i = 0 ; i < 10 ; i++ ){
int r = rand()%10 ;
buff = n[i];
n[i] = n[r];
n[r] = buff;
}
for ( i = 0 ; i < 10 ; i++ ){
hoge->n[i] = n[i];
}
ComputeTotal(hoge) ;
}
// 子供を作る
// 親は子供を複製し適当に遺伝子を組みかえる
void CreateChildHoge ( HOGE* parent, HOGE* child )
{
int i, buff;
int r1 = rand()%10;
int r2 = rand()%10;
for ( i = 0 ; i < 10 ; i++ ){
child->n[i] = parent->n[i];
}
// ランダムで要素を入れ替え
buff = child->n[r1];
child->n[r1] = child->n[r2];
child->n[r2] = buff ;
ComputeTotal(child) ;
}
// 昇順ソート
int CompHoge ( const void *h1, const void *h2 )
{
return ((HOGE*)h1)->total-((HOGE*)h2)->total ;
}
void SortHoge ( HOGE* hoge, int n )
{
qsort ( hoge, n, sizeof(HOGE), CompHoge ) ;
}
// 適当な個体数を決める(4の倍数)
#define MAX_HOGE 16
// 適当な世代数変化がなければ終了
#define MAX_GENERATION 10
int main ( void )
{
int i, j, count, min, generation ;
HOGE hoge[MAX_HOGE] ;
// ランダムで個体を生成
for ( i = 0 ; i < MAX_HOGE ; i++ ){
CreateHoge ( hoge+i ) ;
}
// 適当な世代間最小値が変わらなかったら抜ける
for ( count=1, min=0, generation=1 ; count<MAX_GENERATION ; generation++){
// ソートする
SortHoge ( hoge, MAX_HOGE ) ;
// 最小個体
if ( min != hoge[0].total ){
min = hoge[0].total;
count = 1 ;
}
else{
// 最小値が変わらなかったらカウントアップ
count++ ;
}
// デバック表示
printf ( "第%2d世代:%d ( n[10]={ ", generation, hoge[0].total ) ;
for ( j = 0 ; j < 9 ; j++ ){
printf ( "%d, ", hoge[0].n[j] ) ;
}
printf ( "%d }; )\n", hoge[0].n[9] ) ;
// 下位75%を上位25%の子孫と入れ替える
for ( j = 0 ; j < MAX_HOGE/4 ; j++ ){
CreateChildHoge ( &hoge[j], &hoge[MAX_HOGE/4+j] ) ;
CreateChildHoge ( &hoge[j], &hoge[MAX_HOGE/2+j] ) ;
CreateChildHoge ( &hoge[j], &hoge[MAX_HOGE/4+MAX_HOGE/2+j] ) ;
}
}
return 0 ;
}
|
Output:
|
第 1世代:727 ( n[10]={ 2, 3, 4, 1, 6, 7, 9, 5, 8, 10 }; )
第 2世代:647 ( n[10]={ 3, 2, 4, 1, 6, 7, 9, 5, 8, 10 }; )
第 3世代:391 ( n[10]={ 3, 6, 4, 1, 2, 7, 9, 5, 8, 10 }; )
第 4世代:391 ( n[10]={ 3, 6, 4, 1, 2, 7, 9, 5, 8, 10 }; )
第 5世代:343 ( n[10]={ 6, 3, 4, 1, 2, 7, 9, 10, 8, 5 }; )
第 6世代:320 ( n[10]={ 9, 6, 3, 1, 2, 7, 4, 10, 8, 5 }; )
第 7世代:300 ( n[10]={ 9, 3, 4, 1, 2, 7, 5, 10, 8, 6 }; )
第 8世代:300 ( n[10]={ 9, 3, 4, 1, 2, 7, 5, 10, 8, 6 }; )
第 9世代:294 ( n[10]={ 9, 5, 4, 1, 2, 7, 3, 10, 6, 8 }; )
第10世代:278 ( n[10]={ 9, 3, 4, 1, 2, 5, 6, 10, 8, 7 }; )
第11世代:278 ( n[10]={ 9, 3, 4, 1, 2, 5, 6, 10, 8, 7 }; )
第12世代:278 ( n[10]={ 9, 3, 4, 1, 2, 5, 6, 10, 8, 7 }; )
第13世代:258 ( n[10]={ 7, 3, 4, 1, 2, 5, 6, 10, 8, 9 }; )
第14世代:252 ( n[10]={ 7, 3, 6, 1, 2, 5, 4, 10, 8, 9 }; )
第15世代:252 ( n[10]={ 7, 3, 6, 1, 2, 5, 4, 10, 8, 9 }; )
第16世代:252 ( n[10]={ 7, 3, 6, 1, 2, 5, 4, 10, 8, 9 }; )
第17世代:243 ( n[10]={ 7, 6, 4, 1, 2, 5, 3, 10, 8, 9 }; )
第18世代:230 ( n[10]={ 7, 5, 6, 1, 2, 3, 4, 10, 8, 9 }; )
第19世代:230 ( n[10]={ 7, 5, 6, 1, 2, 3, 4, 10, 8, 9 }; )
第20世代:230 ( n[10]={ 7, 5, 6, 1, 2, 3, 4, 10, 8, 9 }; )
第21世代:230 ( n[10]={ 7, 5, 6, 1, 2, 3, 4, 10, 8, 9 }; )
第22世代:230 ( n[10]={ 7, 5, 6, 1, 2, 3, 4, 10, 8, 9 }; )
第23世代:230 ( n[10]={ 7, 5, 6, 1, 2, 3, 4, 10, 8, 9 }; )
第24世代:230 ( n[10]={ 7, 5, 6, 1, 2, 3, 4, 10, 8, 9 }; )
第25世代:230 ( n[10]={ 7, 5, 6, 1, 2, 3, 4, 10, 8, 9 }; )
第26世代:230 ( n[10]={ 7, 5, 6, 1, 2, 3, 4, 10, 8, 9 }; )
第27世代:230 ( n[10]={ 7, 5, 6, 1, 2, 3, 4, 10, 8, 9 }; )
|
|