#include #include #include int calc_weight(int individual, int length, int** population, int* b); int calc_value(int individual, int length, int** population, int* a); void paring(int num, int length, int **population, int **pair); void one_point_crossover(int crossover_rate,int num, int length, int **population,int **pair); void mutation(int mutation_rate,int num,int length,int **population); void roulette_selection(int num,int length,int **population,int *fitness); void init(int length, int num, int capacity, int** population, int* a, int* b, int* weight, int* value, int* fitness); int calc_best_id(int* fitness, int num); double calc_ave(int* fitness, int num); int main() { int **population;//個体集合 int num;//個体数 int length;//遺伝子長 int *weight; int *value; int *fitness; int **pair; int crossover_rate; //交叉確率(%) int mutation_rate; //突然変異率(%) int i,j; int a[30], b[30], dummy; int capacity = 2000; int sedai; int best_id; int best_value; double ave; FILE *fp, *fp2; int bango; char str[256]; if ((fp = fopen("kekka.csv", "w")) == NULL) { printf("File cannot be created.\n"); return 0; } num=50; length=30; crossover_rate=80; mutation_rate=1; if ((fp2 = fopen("data.csv", "r")) == NULL) { printf("File cannot be read.\n"); return 0; } else{ fgets(str,256,fp2);//1行読み飛ばし for (i=0; icapacity){ fitness[i] = value[i] - (weight[i]-capacity); } else{ fitness[i] = value[i]; } } //ルーレット選択 roulette_selection(num,length,population,fitness); for(i=0;icapacity){ fitness[i] = value[i] - (weight[i]-capacity); } else{ fitness[i] = value[i]; } } ave = calc_ave(fitness, num); best_id = calc_best_id(fitness, num); best_value = fitness[best_id]; fprintf(fp,"%d,%d,%d,",sedai,best_id,best_value); for (i=0; irand()%100){ population[i][j] = 1-population[i][j]; } } } } void roulette_selection(int num,int length,int **population,int *fitness){ int i,j,k; int sum_fitness; //適応度の和が入る int **new_population; //選ばれた個体が入る double *roulette; //選択される確率が入る double *ac_roulette; //ルーレットの累積値が入る double r; new_population=new int*[num]; for (i=0; icapacity){ fitness[i] = value[i] - (weight[i]-capacity); } else{ fitness[i] = value[i]; } } } double calc_ave(int* fitness, int num) { double sum, ave; int i; sum = 0; for (i=0;ibest_value){ best_id=i; best_value=fitness[i]; } } return best_id; }