Задать вопрос
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019, ИИ говорит:
    По поводу "неправильных троек"

    - Значение функции оценки (например, `8046366020051.0`) — это абсолютное значение `a^3 + b^3 + c^3`.
    - Если оно не равно нулю, значит точного решения не найдено, а лишь приближённое.
    - Для уравнения a^3 + b^3 + c^3 = 0 найти точное решение с большими числами — очень сложная задача, и генетический алгоритм может находить только приближённые варианты.
    - Если хотите улучшить результат, можно увеличить `generations`, увеличить `population_size` или попробовать другие методы оптимизации.

    Сейчас код выглядит так:
    import numpy as np
    import os
    import sys
    from typing import Optional, Tuple
    
    def fitness(population: np.ndarray) -> np.ndarray:
        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: int, x_range: Tuple[int, int]) -> np.ndarray:
        return np.random.randint(x_range[0], x_range[1] + 1, size=(size, 3))
    
    def crossover(parent1: np.ndarray, parent2: np.ndarray) -> np.ndarray:
        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: np.ndarray, x_range: Tuple[int, int], mutation_rate: float = 0.1) -> np.ndarray:
        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: np.ndarray, filename: str = "population_backup.csv") -> None:
        np.savetxt(filename, population, delimiter=",", fmt='%d')
        print(f"\nТекущее состояние популяции сохранено в файл '{filename}'.")
    
    def load_population_from_csv(filename: str = "population_backup.csv") -> Optional[np.ndarray]:
        if os.path.exists(filename):
            population = np.loadtxt(filename, delimiter=",", dtype=int)
            if population.ndim == 1:
                population = population.reshape(1, -1)
            print(f"Загружена популяция из файла '{filename}', размер: {population.shape}.")
            return population
        else:
            return None
    
    def genetic_algorithm(
        fitness,
        generate_population,
        crossover,
        mutate,
        population_size: int,
        x_range: Tuple[int, int],
        generations: int
    ) -> np.ndarray:
        population = load_population_from_csv()
        if population is None:
            print("Файл с сохранённой популяцией не найден. Создаём новую популяцию.")
            population = generate_population(population_size, x_range)
        else:
            print(f"Продолжаем работу с загруженной популяцией размером {population.shape[0]}")
            if population.shape[0] < population_size:
                needed = population_size - population.shape[0]
                new_individuals = generate_population(needed, x_range)
                population = np.vstack([population, new_individuals])
    
        try:
            for gen in range(generations):
    #            print(f"Начинаем поколение {gen + 1}")
                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]
    
    if __name__ == "__main__":
        population_size: int = 5000
        x_range: Tuple[int, int] = (-1000000000, 1000000000)
        generations: int = 2000
    
        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)}")
    Написано
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019, Если вам не сложно. Если сложно, буду и дальше мучать ИИ.
    Написано
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019, Установил:
    population_size = 5000  # Можно уменьшить для ускорения
    x_range = (-1000000000, 1000000000)
    generations = 2000  # Можно увеличить для более долгой работы


    Достаточно быстро посчитало. Программа даже нашла тройку:
    Поколение 2000, лучшая оценка: 29934254657720.0
    Найденное решение: a=850515598, b=583371668, c=631088364
    Значение функции оценки: 29934254657720
    Написано
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019, Надеюсь это последняя, версия:
    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)}")
    Написано
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019,
    Я не запрещаю тебе пользоваться 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)}")


    И программа теперь считает, очень долго. Мне попросить ИИ сделать запись где я остановился, чтобы я мог продолжить, а не начинать с самого начала? Я считаю не только положительные, но и отрицательные?
    Написано
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019, Программа сейчас выглядит так:
    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)}")


    Да, иногда я пользовался и numpy в других программах, но как видите не в этот раз. Могу и в этот раз воспользоваться numpy но опять же, только с помощь не своего интеллекта.
    Написано
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019, Можете исправить? Или позволите попросить помощи у ИИ?
    Написано
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019, Добавляю ноли:
    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³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019,
    Узнаю его по попыткам писать все в базу
    Я же не могу держать компьютер постоянно включенный.

    я предложил ему использовать генетические алгоритмы
    Вы же отказали мне в помощи, под предлогом, что я тупой, и без ИИ не смогу писать программу. Да и это совсем другая формула (не Ферма), у нее же есть решения.

    Но у него как у самурая - свой путь
    Хоть батюшка Олег меня и забанил, я все равно верующий. Но не наивный, я верю конечно математикам, но не слепо. Позвольте мне заняться проверкой, перебором. Может тогда я хоть что-то пойму.
    Написано
  • Как правильно заниматься перебором: a³ + b³ + c³ = d³?

    Koren1
    @Koren1 Автор вопроса
    floppa322,
    толстить
    Что значит - толстить?
    Написано
  • Как правильно заниматься перебором: a³ + b³ + c³ = d³?

    Koren1
    @Koren1 Автор вопроса
    floppa322, Нет, я не троль. Я говорю правду, у меня действительно тяга к непостижимому. Неужели у вас такой тяги нет? Как вы утоляете жажду? Как по мне теорема Ферма, неиссякаемый источник который способен угасить жажду. Вы же из-за теоремы Ферма обзываетесь?
    Написано
  • Как правильно заниматься перебором: a³ + b³ + c³ = d³?

    Koren1
    @Koren1 Автор вопроса
    Everything_is_bad,
    всё что ты делаешь, люди уже давно делали
    Поделитесь пожалуйста адресом, где именно люди это делали?
    Написано
  • Как правильно заниматься перебором: a³ + b³ + c³ = d³?

    Koren1
    @Koren1 Автор вопроса
    Everything_is_bad,
    тупым перебором
    неподходящими методами и инструментами
    подскажите подходящие и не тупые. Но не предлагайте, пожалуйста, километровые доказательства.

    бессмысленность
    почему безсмысленность? Вы говорите сейчас о теореме Ферма? Если - да, то я согласен с великими, что они - правы. Но не уверен, что прям во всем. Скорей всего мне жизни не хватит, убедиться в обратном, чисел - очень много.
    Написано
  • Как правильно заниматься перебором: a³ + b³ + c³ = d³?

    Koren1
    @Koren1 Автор вопроса
    Lynn «Кофеман»,
    Название «Великая теорема Ферма» вам ничего не говорит?
    Ну, мало ли, может математики ошиблись. Может они наивные и доверчивые, потому, что поверили доказательству. А так я буду знать наверняка, что в таком то диапазоне, математики уж точно не ошиблись. Кроме меня ведь никто перебором не занимается.

    просто
    Для кого - просто? Для меня не просто, для меня это больше похоже на - мистику. Ну как это может быть в математике, что до целого числа, ну скажем в теореме Ферма не хватает всего лишь - пол капельки. Чисел же так много. Ну этого же не может быть.

    из любви к искусству
    Да, мне почему-то нравится куб. Вы правы - из любви. Но это скорее тяга к непостижимому. Да, и красота мне нравится, но она не на первом месте.
    Написано
  • Как правильно заниматься перебором: a³ + b³ + c³ = d³?

    Koren1
    @Koren1 Автор вопроса
    Lynn «Кофеман»,
    что
    a³ + b³ + c³ = d³

    зачем
    До этого хотел найти: a³ + b³ = c³, но - не нашел. Потом подумал, возможно ошибочно, a и b не достаточно. Две переменные, это же для Пифагора, т.е. для двумерной плоскости. А куб это же трехмерная плоскость, значит нужно как минимум три переменные a, b и c, т.е. нужен не - треугольник, а - пирамида.

    Какая задача решается?
    Математика, такая сложная и не понятная, хочется хоть что-то понять. Чтобы что-то понять, нужно что-то делать. Что будет после того, как создам базу еще не знаю. Посмотрю на данные, быть может еще что-то пойму, быть может сделаю еще шаг в перед.
    Написано
  • Как правильно заниматься перебором: a³ + b³ + c³ = d³?

    Koren1
    @Koren1 Автор вопроса
    Циклы в питоне - это ужасно медленно
    Подскажите, пожалуйста, правильный безплатный язык.

    база даных тут совсем не нужна.
    Я же не могу постоянно держать компьютер включенным.

    Сначала сгенерируйте все кубы и схраните их в массив. Их будет примерно кубический корень из |MAX_VAL-MIN_VAL| - это достаточно маленькая величина...
    Для меня это ужасно сложно, даже с помощью ИИ.
    Написано
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019, Простите, но к сожалению, я без ИИ не смогу обойтись, да и ИИ не всемогущ, особенно в математических вопросах. Без опытного математика мне и ИИ не поможет.
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019, Не знаю, я попробовал ваш вариант, программа выдала - ошибку. Попросил ИИ, он предложил сделать - так. Ну ответ то получился - целый.
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019,
    # Функция оценки для уравнения 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)


    Найденное решение: a=0, b=0, c=0
    Значение функции оценки: 0

    Так ничего же не изменилось, было: a=0, b=1, c=-1. Т.е. 1-1=0, так ноль и остался: a=0, b=0, c=0.

    Я хочу проверить формулу a³+b³=c³ с возможностью остановки, у меня нет возможности запустить ее, ну скажем на - месяц.
  • Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

    Koren1
    @Koren1 Автор вопроса
    mayton2019, Спасибо!!!
    def fitness(a, b, c):
        return abs(a**3 + b**3 + c**3)

    А, что, на что изменить? У меня в коде именно так и было.
    А у Python есть библиотека для Wolfram Alpha и чтобы не нужно было платить? Или может у Wolfram Alpha есть тестовый период? Мало ли, может мне что-то не понравится.