population_size = 5000 # Можно уменьшить для ускорения
x_range = (-1000000000, 1000000000)
generations = 2000 # Можно увеличить для более долгой работы
Поколение 2000, лучшая оценка: 29934254657720.0
Найденное решение: a=850515598, b=583371668, c=631088364
Значение функции оценки: 29934254657720
import numpy as np
import os
import sys
def fitness(population):
mask_negative = (population < 0).any(axis=1)
cubes = population.astype(np.int64) ** 3
fitness_values = np.abs(np.sum(cubes, axis=1)).astype(float)
fitness_values[mask_negative] = np.inf
return fitness_values
def generate_population(size, x_range):
return np.random.randint(x_range[0], x_range[1] + 1, size=(size, 3))
def crossover(parent1, parent2):
point = np.random.randint(1, 3)
child = np.empty(3, dtype=int)
child[:point] = parent1[:point]
child[point:] = parent2[point:]
return child
def mutate(individual, x_range, mutation_rate=0.1):
if np.random.rand() < mutation_rate:
idx = np.random.randint(0, 3)
individual[idx] = np.random.randint(x_range[0], x_range[1] + 1)
return individual
def save_population_to_csv(population, filename="population_backup.csv"):
np.savetxt(filename, population, delimiter=",", fmt='%d')
print(f"\nТекущее состояние популяции сохранено в файл '{filename}'.")
def load_population_from_csv(filename="population_backup.csv"):
if os.path.exists(filename):
population = np.loadtxt(filename, delimiter=",", dtype=int)
print(f"Загружена популяция из файла '{filename}'.")
return population
else:
return None
def genetic_algorithm(fitness, generate_population, crossover, mutate, population_size, x_range, generations):
population = load_population_from_csv()
if population is None:
print("Файл с сохранённой популяцией не найден. Создаём новую популяцию.")
population = generate_population(population_size, x_range)
else:
print(f"Продолжаем работу с загруженной популяцией размером {population.shape[0]}.")
try:
for gen in range(generations):
fitness_values = fitness(population)
best_idx = np.argmin(fitness_values)
best_fitness = fitness_values[best_idx]
print(f"Поколение {gen+1}, лучшая оценка: {best_fitness}")
if best_fitness == 0:
print("Найдено точное решение!")
return population[best_idx]
sorted_indices = np.argsort(fitness_values)
population = population[sorted_indices]
next_generation = population[:2].copy()
while len(next_generation) < population_size:
parents_idx = np.random.choice(10, size=2, replace=False)
parent1 = population[parents_idx[0]]
parent2 = population[parents_idx[1]]
child = crossover(parent1, parent2)
child = mutate(child, x_range)
next_generation = np.vstack([next_generation, child])
population = next_generation
except KeyboardInterrupt:
print("\nПолучен сигнал прерывания (Ctrl+C). Сохраняем состояние и завершаем работу...")
save_population_to_csv(population)
sys.exit(0)
fitness_values = fitness(population)
best_idx = np.argmin(fitness_values)
return population[best_idx]
# Параметры алгоритма
population_size = 1000000 # Можно уменьшить для ускорения
x_range = (-100, 100)
generations = 100000 # Можно увеличить для более долгой работы
# Запуск алгоритма
solution = genetic_algorithm(fitness, generate_population, crossover, mutate, population_size, x_range, generations)
print(f"Найденное решение: a={solution[0]}, b={solution[1]}, c={solution[2]}")
print(f"Значение функции оценки: {np.abs(solution[0]**3 + solution[1]**3 + solution[2]**3)}")
Я не запрещаю тебе пользоваться AI.
import numpy as np
# Функция оценки для уравнения a^3 + b^3 + c^3 = 0
def fitness(population):
# population — массив формы (N, 3)
mask_negative = (population < 0).any(axis=1)
# Приводим к int64, чтобы избежать переполнения при возведении в куб
cubes = population.astype(np.int64) ** 3
fitness_values = np.abs(np.sum(cubes, axis=1)).astype(float)
fitness_values[mask_negative] = np.inf
return fitness_values
# Генерация начальной популяции с использованием NumPy
def generate_population(size, x_range):
return np.random.randint(x_range[0], x_range[1] + 1, size=(size, 3))
# Скрещивание (одиночное точечное)
def crossover(parent1, parent2):
point = np.random.randint(1, 3) # точка разреза: 1 или 2
child = np.empty(3, dtype=int)
child[:point] = parent1[:point]
child[point:] = parent2[point:]
return child
# Мутация — меняем случайный ген на новое случайное значение с вероятностью mutation_rate
def mutate(individual, x_range, mutation_rate=0.1):
if np.random.rand() < mutation_rate:
idx = np.random.randint(0, 3)
individual[idx] = np.random.randint(x_range[0], x_range[1] + 1)
return individual
# Генетический алгоритм
def genetic_algorithm(fitness, generate_population, crossover, mutate, population_size, x_range, generations):
population = generate_population(population_size, x_range)
for gen in range(generations):
fitness_values = fitness(population)
best_idx = np.argmin(fitness_values)
best_fitness = fitness_values[best_idx]
print(f"Поколение {gen+1}, лучшая оценка: {best_fitness}")
if best_fitness == 0:
return population[best_idx]
# Сортируем популяцию по значению функции оценки
sorted_indices = np.argsort(fitness_values)
population = population[sorted_indices]
# Элитизм — сохраняем 2 лучших индивида
next_generation = population[:2].copy()
# Турнирный отбор и создание потомков
while len(next_generation) < population_size:
parents_idx = np.random.choice(10, size=2, replace=False)
parent1 = population[parents_idx[0]]
parent2 = population[parents_idx[1]]
child = crossover(parent1, parent2)
child = mutate(child, x_range)
next_generation = np.vstack([next_generation, child])
population = next_generation
# Возвращаем лучшего индивида после всех поколений
fitness_values = fitness(population)
best_idx = np.argmin(fitness_values)
return population[best_idx]
# Параметры алгоритма
population_size = 100000
x_range = (-100, 100)
generations = 100
# Запуск алгоритма
solution = genetic_algorithm(fitness, generate_population, crossover, mutate, population_size, x_range, generations)
print(f"Найденное решение: a={solution[0]}, b={solution[1]}, c={solution[2]}")
print(f"Значение функции оценки: {np.abs(solution[0]**3 + solution[1]**3 + solution[2]**3)}")
import random
# Функция оценки для уравнения a^3 + b^3 + c^3 = 0
def fitness(a, b, c):
if a < 0 or b < 0 or c < 0:
return float('inf')
return abs(a**3 + b**3 + c**3)
# Генерация начальной популяции
def generate_population(size, x_range):
return [[random.randint(*x_range), random.randint(*x_range), random.randint(*x_range)] for _ in range(size)]
# Скрещивание
def crossover(x, y):
z = []
for i in range(len(x)):
if random.random() < 0.5:
z.append(x[i])
else:
z.append(y[i])
return z
# Мутация
def mutate(x, x_range):
i = random.randint(0, len(x) - 1)
x[i] = random.randint(*x_range)
return x
# Генетический алгоритм
def genetic_algorithm(fitness, generate_population, crossover, mutate, population_size, x_range, generations):
population = generate_population(population_size, x_range)
for _ in range(generations):
population = sorted(population, key=lambda x: fitness(*x))
if fitness(*population[0]) == 0:
break
next_generation = population[:2] # Элитизм
while len(next_generation) < population_size:
parents = random.sample(population[:10], 2) # Турнирный отбор
child = crossover(*parents)
child = mutate(child, x_range)
next_generation.append(child)
population = next_generation
return population[0]
# Параметры алгоритма
population_size = 100000000
x_range = (-100, 100)
generations = 100
# Запуск алгоритма
solution = genetic_algorithm(fitness, generate_population, crossover, mutate, population_size, x_range, generations)
print(f"Найденное решение: a={solution[0]}, b={solution[1]}, c={solution[2]}")
print(f"Значение функции оценки: {fitness(*solution)}")
population_size = 100000000
D:\mayton2019>py main.py
Traceback (most recent call last):
File "D:\mayton2019\main.py", line 52, in <module>
solution = genetic_algorithm(fitness, generate_population, crossover, mutate, population_size, x_range, generations)
File "D:\mayton2019\main.py", line 32, in genetic_algorithm
population = generate_population(population_size, x_range)
File "D:\mayton2019\main.py", line 12, in generate_population
return [[random.randint(*x_range), random.randint(*x_range), random.randint(*x_range)] for _ in range(size)]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
MemoryError
Узнаю его по попыткам писать все в базуЯ же не могу держать компьютер постоянно включенный.
я предложил ему использовать генетические алгоритмыВы же отказали мне в помощи, под предлогом, что я тупой, и без ИИ не смогу писать программу. Да и это совсем другая формула (не Ферма), у нее же есть решения.
Но у него как у самурая - свой путьХоть батюшка Олег меня и забанил, я все равно верующий. Но не наивный, я верю конечно математикам, но не слепо. Позвольте мне заняться проверкой, перебором. Может тогда я хоть что-то пойму.
всё что ты делаешь, люди уже давно делалиПоделитесь пожалуйста адресом, где именно люди это делали?
тупым перебором
неподходящими методами и инструментамиподскажите подходящие и не тупые. Но не предлагайте, пожалуйста, километровые доказательства.
бессмысленностьпочему безсмысленность? Вы говорите сейчас о теореме Ферма? Если - да, то я согласен с великими, что они - правы. Но не уверен, что прям во всем. Скорей всего мне жизни не хватит, убедиться в обратном, чисел - очень много.
Название «Великая теорема Ферма» вам ничего не говорит?Ну, мало ли, может математики ошиблись. Может они наивные и доверчивые, потому, что поверили доказательству. А так я буду знать наверняка, что в таком то диапазоне, математики уж точно не ошиблись. Кроме меня ведь никто перебором не занимается.
простоДля кого - просто? Для меня не просто, для меня это больше похоже на - мистику. Ну как это может быть в математике, что до целого числа, ну скажем в теореме Ферма не хватает всего лишь - пол капельки. Чисел же так много. Ну этого же не может быть.
из любви к искусствуДа, мне почему-то нравится куб. Вы правы - из любви. Но это скорее тяга к непостижимому. Да, и красота мне нравится, но она не на первом месте.
чтоa³ + b³ + c³ = d³
зачемДо этого хотел найти: a³ + b³ = c³, но - не нашел. Потом подумал, возможно ошибочно, a и b не достаточно. Две переменные, это же для Пифагора, т.е. для двумерной плоскости. А куб это же трехмерная плоскость, значит нужно как минимум три переменные a, b и c, т.е. нужен не - треугольник, а - пирамида.
Какая задача решается?Математика, такая сложная и не понятная, хочется хоть что-то понять. Чтобы что-то понять, нужно что-то делать. Что будет после того, как создам базу еще не знаю. Посмотрю на данные, быть может еще что-то пойму, быть может сделаю еще шаг в перед.
Циклы в питоне - это ужасно медленноПодскажите, пожалуйста, правильный безплатный язык.
база даных тут совсем не нужна.Я же не могу постоянно держать компьютер включенным.
Сначала сгенерируйте все кубы и схраните их в массив. Их будет примерно кубический корень из |MAX_VAL-MIN_VAL| - это достаточно маленькая величина...Для меня это ужасно сложно, даже с помощью ИИ.
# Функция оценки для уравнения a^3 + b^3 + c^3 = 0
def fitness(a, b, c):
if a < 0 or b < 0 or c < 0:
return float('inf')
return abs(a**3 + b**3 + c**3)
def fitness(a, b, c):
return abs(a**3 + b**3 + c**3)
По поводу "неправильных троек"
- Значение функции оценки (например, `8046366020051.0`) — это абсолютное значение `a^3 + b^3 + c^3`.
- Если оно не равно нулю, значит точного решения не найдено, а лишь приближённое.
- Для уравнения a^3 + b^3 + c^3 = 0 найти точное решение с большими числами — очень сложная задача, и генетический алгоритм может находить только приближённые варианты.
- Если хотите улучшить результат, можно увеличить `generations`, увеличить `population_size` или попробовать другие методы оптимизации.
Сейчас код выглядит так: