int operator_mutate_erc_init ( char *options, breedphase *bp ) { int errors = 0; mutate_erc_data *md; int i, j; double r; char **argv; int internalset = 0, externalset = 0; md = (mutate_erc_data *)MALLOC ( sizeof ( mutate_erc_data ) ); /* fill in the breedphase record. */ bp->operatorID = OPERATOR_MUTATE_ERC; //HJJ bp->data = (void *)md; bp->operator_free = operator_mutate_erc_free; bp->operator_start = operator_mutate_erc_start; bp->operator_end = operator_mutate_erc_end; bp->operator_operate = operator_mutate_erc; /* default values for the mutation-specific data structure. */ md->var_percent = 0.2; md->erc_percent = 0.2; md->tree = (double *)MALLOC ( tree_count * sizeof ( double ) ); for ( j = 0; j < tree_count; ++j ) md->tree[j] = 0.0; md->treetotal = 0.0; md->sname = NULL; j = parse_o_rama ( options, &argv ); for ( i = 0; i < j; ++i ) { if ( strcmp ( "select", argv[i] ) == 0 ) { if ( !exists_select_method ( argv[++i] ) ) { ++errors; error ( E_ERROR, "mutation erc: \"%s\" is not a known selection method.", argv[i] ); } FREE ( md->sname ); md->sname = (char *)MALLOC ( (strlen(argv[i])+1) * sizeof ( char ) ); strcpy ( md->sname, argv[i] ); } else if ( strcmp ( "varpercent", argv[i] ) == 0 ) { md->var_percent = strtod ( argv[++i], NULL ); if ( md->var_percent < 0.0 ) { ++errors; error ( E_ERROR, "mutation_erc: \"var_percent\" must be nonnegative." ); } } else if ( strcmp ( "ercpercent", argv[i] ) == 0 ) { md->erc_percent = strtod ( argv[++i], NULL ); if ( md->erc_percent < 0.0 ) { ++errors; error ( E_ERROR, "mutation erc: \"erc_percent\" must be nonnegative." ); } } else { ++errors; error ( E_ERROR, "mutation erc: unknown option \"%s\".", argv[i] ); } } free_o_rama ( j, &argv ); if ( md->sname == NULL ) { ++errors; error ( E_ERROR, "mutation erc: no selection method specified." ); } for ( j = 0; j < tree_count; ++j ) md->treetotal += md->tree[j]; if ( md->treetotal == 0.0 ) { for ( j = 0; j < tree_count; ++j ) md->tree[j] = 1.0; md->treetotal = tree_count; } r = 0.0; for ( j = 0; j < tree_count; ++j ) r = (md->tree[j] += r); return errors; }
int operator_crossover_init ( char *options, breedphase *bp ) { int errors = 0; crossover_data *cd; int i, j, k, m; double r; char **argv, **targv; int internalset = 0, externalset = 0; char *cp; cd = (crossover_data *)MALLOC ( sizeof ( crossover_data ) ); /* place values into the breedphase table record. */ bp->operator = OPERATOR_CROSSOVER; bp->data = (void *)cd; bp->operator_free = operator_crossover_free; bp->operator_start = operator_crossover_start; bp->operator_end = operator_crossover_end; bp->operator_operate = operator_crossover; /* default values for all the crossover options. */ cd->keep_trying = 0; cd->internal = 0.9; cd->external = 0.1; cd->tree = (double *)MALLOC ( tree_count * sizeof ( double ) ); cd->treecumul = (double *)MALLOC ( tree_count * sizeof ( double ) ); for ( j = 0; j < tree_count; ++j ) cd->tree[j] = 0.0; cd->treetotal = 0.0; cd->func = (double *)MALLOC ( fset_count * sizeof ( double ) ); cd->sname = NULL; cd->sname2 = NULL; /* break the options string into an argv-style array of strings. */ j = parse_o_rama ( options, &argv ); for ( i = 0; i < j; ++i ) { /* parse "keep_trying" option. */ if ( strcmp ( "keep_trying", argv[i] ) == 0 ) { /* translate a string into a binary value. returns -1 if the string is not one of the valid strings meaning yes or no. */ cd->keep_trying = translate_binary ( argv[++i] ); if ( cd->keep_trying == -1 ) { ++errors; error ( E_ERROR, "crossover: \"%s\" is not a valid setting for \"keep_trying\".", argv[i] ); } } /* parse "internal" option. */ else if ( strcmp ( "internal", argv[i] ) == 0 ) { internalset = 1; cd->internal = strtod ( argv[++i], NULL ); if ( cd->internal < 0.0 ) { ++errors; error ( E_ERROR, "crossover: \"internal\" must be nonnegative." ); } } /* parse "external" option. */ else if ( strcmp ( "external", argv[i] ) == 0 ) { externalset = 1; cd->external = strtod ( argv[++i], NULL ); if ( cd->external < 0.0 ) { ++errors; error ( E_ERROR, "crossover: \"external\" must be nonnegative." ); } } /* parse "select" option. */ else if ( strcmp ( "select", argv[i] ) == 0 ) { if ( !exists_select_method ( argv[++i] ) ) { ++errors; error ( E_ERROR, "crossover: \"%s\" is not a known selection method.", argv[i] ); } FREE ( cd->sname ); cd->sname = (char *)MALLOC ( (strlen(argv[i])+1) * sizeof ( char ) ); strcpy ( cd->sname, argv[i] ); if ( cd->sname2 == NULL ) cd->sname2 = cd->sname; } /* parse "select2" option. */ else if ( strcmp ( "select2", argv[i] ) == 0 ) { if ( !exists_select_method ( argv[++i] ) ) { ++errors; error ( E_ERROR, "crossover: \"%s\" is not a known selection method.", argv[i] ); } if ( cd->sname2 && cd->sname != cd->sname2 ) FREE ( cd->sname2 ); cd->sname2 = (char *)MALLOC ( (strlen(argv[i])+1) * sizeof ( char ) ); strcpy ( cd->sname2, argv[i] ); } /* parse "tree" option. */ else if ( strcmp ( "tree", argv[i] ) == 0 ) { k = parse_o_rama ( argv[++i], &targv ); if ( k != tree_count ) { ++errors; error ( E_ERROR, "crossover: wrong number of tree fields: \"%s\".", argv[i] ); } else { for ( m = 0; m < k; ++m ) { cd->tree[m] = strtod ( targv[m], &cp ); if ( *cp ) { ++errors; error ( E_ERROR, "crossover: \"%s\" is not a number.", targv[m] ); } } } free_o_rama ( k, &targv ); } /* parse "tree#" option. */ else if ( strncmp ( "tree", argv[i], 4 ) == 0 ) { k = strtol ( argv[i]+4, &cp, 10 ); if ( *cp ) { ++errors; error ( E_ERROR, "crossover: unknown option \"%s\".", argv[i] ); } if ( k < 0 || k >= tree_count ) { ++errors; error ( E_ERROR, "crossover: \"%s\" is out of range.", argv[i] ); } else { cd->tree[k] = strtod ( argv[++i], &cp ); if ( *cp ) { ++errors; error ( E_ERROR, "crossover: \"%s\" is not a number.", argv[i] ); } } } else { ++errors; error ( E_ERROR, "crossover: unknown option \"%s\".", argv[i] ); } } free_o_rama ( j, &argv ); if ( internalset && !externalset ) cd->external = 0.0; else if ( !internalset && externalset ) cd->internal = 0.0; if ( cd->sname == NULL ) { ++errors; error ( E_ERROR, "crossover: no selection method specified." ); } /** compute "func" array from the "tree" array. **/ for ( j = 0; j < tree_count; ++j ) cd->treetotal += cd->tree[j]; if ( cd->treetotal == 0.0 ) { for ( j = 0; j < tree_count; ++j ) cd->tree[j] = 1.0; cd->treetotal = tree_count; } for ( j = 0; j < fset_count; ++j ) cd->func[j] = 0.0; for ( j = 0; j < tree_count; ++j ) cd->func[tree_map[j].fset] += cd->tree[j]; r = 0.0; for ( j = 0; j < fset_count; ++j ) r = (cd->func[j] += r); #ifdef DEBUG if ( !errors ) { printf ( "crossover options:\n" ); printf ( " internal: %lf external: %lf\n", cd->internal, cd->external ); printf ( " keep_trying: %d\n", cd->keep_trying ); printf ( " primary selection: %s\n", cd->sname==NULL?"NULL":cd->sname ); printf ( " second selection: %s\n", cd->sname2==NULL?"NULL":(cd->sname2==cd->sname?"same as primary":cd->sname2) ); printf ( " tree total: %lf\n", cd->treetotal ); for ( j = 0; j < tree_count; ++j ) printf ( " tree %d: %lf\n", j, cd->tree[j] ); for ( j = 0; j < fset_count; ++j ) printf ( " fset %d: %lf\n", j, cd->func[j] ); } #endif return errors; }