Я создал программу, которая учится играть в Connect4, используя нейронную сеть и генетические алгоритмы.
Она начинается с нейронных сетей случайного веса, позволяет каждой сети играть друг против друга. сети один раз, выбирает нейронные сети с наибольшим выигрышем (те, которые выиграли больше всего игр), размножает и мутирует их и создает новую популяцию для следующего поколения.
Похоже, что это не так. научитесь хорошо играть в игру. Я подумал, что, возможно, моя проблема в том, что оценка физической подготовки слишком сильно зависит от других сетей («глупость» некоторых сетей). Я имею в виду, давайте возьмем сеть A, которая играет против B, C, D. Если B, C, D действительно плохи, это дает действительно хороший показатель приспособленности для сети A. Это также приводит к тому, что приспособленность моих первых поколений становится довольно высокой, как если бы сеть X всегда помещала в один и тот же столбец, она выигрывает большую часть игр против других. «глупая» сеть, в которой фрагменты размещаются в нескольких столбцах.
Как бы вы решили эту проблему?
Вот упрощенная версия моих ключевых функций. :
def create_model(row_count, column_count):
model = Sequential()
model.add(Flatten(input_shape=(row_count, column_count)))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(column_count, activation='softmax'))
return model
def crossover(model1, model2):
weights1 = model1.get_weights()
weights2 = model2.get_weights()
new_weights = [np.where(np.random.rand(*w1.shape) < 0.5, w1, w2) for w1, w2 in zip(weights1, weights2)]
offspring = create_model(ROW_COUNT, COLUMN_COUNT)
offspring.set_weights(new_weights)
return offspring
def mutate(model, mutation_rate):
weights = model.get_weights()
new_weights = [w + np.random.randn(*w.shape) * 0.2 if np.random.rand() < mutation_rate else w for w in weights]
model.set_weights(new_weights)
def evaluate_models(models):
# Play games and calculate scores
pass
def next_generation(population, top_k):
scores, _ = evaluate_models(population)
sorted_indices = np.argsort(scores)[::-1]
best_indices = sorted_indices[:top_k]
new_generation = [population for i in best_indices]
while len(new_generation) < len(population):
parents = random.sample(new_generation[:top_k], 2)
offspring = crossover(parents[0], parents[1])
mutate(offspring, 0.2)
new_generation.append(offspring)
return new_generation
def genetic_algorithm():
population = [create_model(ROW_COUNT, COLUMN_COUNT) for _ in range(50)]
for generation in range(100):
population = next_generation(population, 5)
return population[0]
Подробнее здесь: https://stackoverflow.com/questions/786 ... m-connect4
Нейронная сеть и генетический алгоритм Connect4 ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Проблема N Queen Генетический алгоритм против детерминированного алгоритма
Anonymous » » в форуме JAVA - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-