Create main.c
This commit is contained in:
parent
0fae745989
commit
8a664d0346
166
main.c
Normal file
166
main.c
Normal file
@ -0,0 +1,166 @@
|
||||
//
|
||||
// main.c
|
||||
// DNA
|
||||
//
|
||||
// Created by Eric on 15-9-12.
|
||||
// Copyright (c) 2015年 Bakantu Eric. All rights reserved.
|
||||
//
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#define DNA_MAX 6
|
||||
#define EARTH_MAX 1000000
|
||||
#define CREATIVE_LIFE 5
|
||||
#define DNA_DIFF 3
|
||||
#define COPY_NUM 4
|
||||
#define DIFF_NUM 10
|
||||
|
||||
int const best_dna[DNA_MAX] = {1,0,1,0,1,1};
|
||||
int diff_dna = 100;
|
||||
int enviroment_num = 0;
|
||||
|
||||
struct creative {
|
||||
int dna[DNA_MAX];
|
||||
int copy_n;
|
||||
int life;
|
||||
int diff_n;
|
||||
} creative;
|
||||
|
||||
int add_creative(struct creative *a_creative[], int father_dna[DNA_MAX], int mother_dna[DNA_MAX]);
|
||||
void creative_copy(struct creative *cc_creative[], int no);
|
||||
void kill_creative(struct creative *k_creative[]);
|
||||
int dna_done(struct creative *d_creative[]);
|
||||
void dna_ability(struct creative *db_creative);
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
srand((unsigned)time(NULL));
|
||||
struct creative *creatives[EARTH_MAX];
|
||||
int father[6] = {0,1,0,1,0,1}, mother[6] = {1,1,1,0,1,1};
|
||||
for (int i = 0; i < EARTH_MAX; i++) creatives[i] = NULL;
|
||||
|
||||
|
||||
{
|
||||
add_creative(creatives,father,mother);
|
||||
add_creative(creatives,mother,father);
|
||||
add_creative(creatives,mother,father);
|
||||
add_creative(creatives,mother,father);
|
||||
add_creative(creatives,mother,father);
|
||||
add_creative(creatives,mother,father);
|
||||
}
|
||||
|
||||
|
||||
int count = 0, ifdone = 0;
|
||||
while (!(ifdone = dna_done(creatives))){
|
||||
count = 0;
|
||||
for (int i = 0; i < EARTH_MAX; i++){
|
||||
if (creatives[i] != NULL){
|
||||
creative_copy(creatives, i);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
kill_creative(creatives);
|
||||
printf("COUNT: %d\n",count);
|
||||
if (count == 0){
|
||||
add_creative(creatives,father,mother);
|
||||
add_creative(creatives,mother,father);
|
||||
add_creative(creatives,mother,father);
|
||||
add_creative(creatives,mother,father);
|
||||
add_creative(creatives,mother,father);
|
||||
add_creative(creatives,mother,father);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dna_done (struct creative *d_creative[]){
|
||||
int done = 0,s_done = 0;
|
||||
for (int i = 0; i < EARTH_MAX; i++){
|
||||
for (int j = 0; j < DNA_MAX; j++){
|
||||
if (d_creative[i] != NULL){
|
||||
if (d_creative[i]->dna[j] != best_dna[j]) s_done = 0;
|
||||
}
|
||||
else{
|
||||
s_done = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (s_done == 1){
|
||||
done = i;
|
||||
break;
|
||||
}
|
||||
s_done = 1;
|
||||
}
|
||||
return done;
|
||||
}
|
||||
|
||||
int add_creative(struct creative *a_creative[], int father_dna[DNA_MAX], int mother_dna[DNA_MAX]){
|
||||
int a_done = 0;
|
||||
srand((unsigned)time(NULL));
|
||||
for (int i = 0;i < EARTH_MAX; i++){
|
||||
if (a_creative[i] == NULL){
|
||||
a_done = 1;
|
||||
a_creative[i] = malloc(sizeof(struct creative));
|
||||
a_creative[i]->life = 0;
|
||||
int dna_cut = rand()%DNA_MAX, dna_fm = rand()%2;
|
||||
for (int j = 0; j < dna_cut; j++){
|
||||
if (dna_fm) a_creative[i]->dna[j] = father_dna[j];
|
||||
else a_creative[i]->dna[j] = mother_dna[j];
|
||||
}
|
||||
for (int j = dna_cut; j < DNA_MAX; j++){
|
||||
if(!dna_fm)a_creative[i]->dna[j] = father_dna[j];
|
||||
else a_creative[i]->dna[j] = mother_dna[j];
|
||||
}
|
||||
dna_ability(a_creative[i]);
|
||||
if ((rand()%(a_creative[i]->diff_n)) == (rand()%DNA_MAX)){
|
||||
a_creative[i]->dna[rand()%DNA_MAX] = rand()%2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return a_done;
|
||||
}
|
||||
|
||||
void dna_ability(struct creative *db_creative){
|
||||
int envir_same = 0,envir_diff = 0;
|
||||
for (int i = 0; i < DNA_MAX-DNA_DIFF; i++){
|
||||
if ((db_creative->dna[i]) == best_dna[i]) envir_same++;
|
||||
}
|
||||
db_creative->copy_n = COPY_NUM-envir_same;
|
||||
|
||||
for (int i = DNA_MAX-DNA_DIFF; i < DNA_MAX; i++){
|
||||
if((db_creative->dna[i]) == best_dna[i]) envir_diff++;
|
||||
}
|
||||
db_creative->diff_n = DIFF_NUM-envir_diff;
|
||||
}
|
||||
|
||||
void creative_copy(struct creative *cc_creative[],int no){
|
||||
srand((unsigned)time(NULL));
|
||||
if ((rand()%(cc_creative[no]->copy_n)) == 0){
|
||||
int count = 0,ifnot = 0;
|
||||
if (no != 0)
|
||||
while ((cc_creative[no+(++count)] != NULL) && ((no+count) < EARTH_MAX)){
|
||||
ifnot = 1;
|
||||
add_creative(cc_creative,cc_creative[no]->dna,cc_creative[no+count]->dna);
|
||||
break;
|
||||
}
|
||||
count = 0;
|
||||
while ((ifnot == 0) && (cc_creative[no-(++count)] != NULL) && ((no-count) >= 0)){
|
||||
ifnot = 1;
|
||||
add_creative(cc_creative,cc_creative[no]->dna,cc_creative[no-count]->dna);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void kill_creative(struct creative *k_creative[]){
|
||||
for (int i = 0; i < EARTH_MAX; i++){
|
||||
if (k_creative[i] != NULL){
|
||||
if (k_creative[i]->life == CREATIVE_LIFE){
|
||||
free(k_creative[i]);
|
||||
k_creative[i] = NULL;
|
||||
}
|
||||
else (k_creative[i]->life)++;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user