User 14282016 Ответов: 2

Как я могу решить эту проблему генетического алгоритма (GA)? [Репост]


Привет :) У меня есть домашнее задание по генетическому алгоритму. Я создал массив 20x20 из 0 и 1 и подсчитал, сколько 1 в строке. После этой стадии я не мог прогрессировать. Пожалуйста, помогите мне:)
Я хочу выбрать два случайных ряда и сравнить их. После этого этапа будет выбрано то, что имеет больше 1. Я хочу, чтобы этот шаг повторился дважды.
После этого шага я хочу пересечь две хромосомы и получить новую хромосому.

Это мой код.;

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 20 
int main()
{
 int a[SIZE];
 int i, j, x;
 int counter;
 
 srand(time(NULL));
 
for(x=0; x<SIZE; ++x){ // run code 20 times
	printf("\n");
 
 for (j = 0; j < SIZE; ++j) {
  a[j] = rand() % 2;//Random 0 and 1
  printf("%2d", a[j]);
 }
printf("\n");
  for (i = 0; i < SIZE; ++i) {
     counter = 0;//Counter is reset in every cycle
  for (j = 0; j < SIZE; ++j)
   if (a[j] == 1)
    ++counter;//Counter increases one's value for every 1 he sees
 }
printf("ChromozomeHaveOnes = %d", counter);
printf("\n");
}
 return 0;
}


Что я уже пробовал:

Я попробовал некоторые коды генетического алгоритма, но я не могу решить его. Я хочу выбрать два случайных ряда и сравнить их. После этого этапа будет выбрано то, что имеет больше 1. Я хочу, чтобы этот шаг повторился дважды.
После этого шага я хочу пересечь две хромосомы и получить новую хромосому.

2 Ответов

Рейтинг:
4

CPallini

Я приказываю выполнять операции (например, сравнивать строки) с вашими данными, вы должны хранить их (ваш код перезаписывает тот же массив).
Попробуйте, как отправную точку

#include <stdio.h>
#include <stdlib.h>
#define SIZE 20 

void init(int a[SIZE][SIZE], int sum[SIZE]);
void dump(int a[SIZE][SIZE], int sum[SIZE]);

int main()
{
  int a[SIZE][SIZE];  // rows & cols...
  int sum[SIZE]; // count of ones of every row
  init(a, sum);
  dump(a, sum);
  return 0;
}

void init(int a[SIZE][SIZE], int sum[SIZE])
{
  int i,j;
  for (i=0; i<SIZE; ++i)
  {
    sum[i] = 0;
    for(j=0; j<SIZE; ++j)
    {
      a[i][j] = rand() % 2;
      sum[i] += a[i][j];
    }
  }
}
void dump(int a[SIZE][SIZE], int sum[SIZE])
{
  int i,j;
  for (i=0; i<SIZE; ++i)
  {
    for(j=0; j<SIZE; ++j)
      printf("% 2d", a[i][j]);
    printf(" sum = %d\n", sum[i]);
  }
}


Dave Kreskowiak

Возразил 1-й.

CPallini

Спасибо, Дэйв.

[no name]

Спасибо :)

CPallini

Добро пожаловать.

[no name]

Ваш код верен но я не могу выбрать и сделать турнирный выбор две хромосомы :(

Рейтинг:
17

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы вход / выход был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Dave Kreskowiak

Еще один 1, Еще один счетчик. Очевидно, то, что он не делал за него домашнее задание, не было подходящим ответом?

OriginalGriff

:смех: казалось бы, нет. Я виню родителей, и Брексит, конечно.

[no name]

Спасибо:)

OriginalGriff

Всегда пожалуйста!