[ create a new paste ] login | about

Link: http://codepad.org/irFqgtaJ    [ raw code | output | fork ]

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 }; )


Create a new paste based on this one


Comments: