@Smeilz1
За любое развитие

Как сделать чтобы функция перебирала только целочисленные значения x?

Есть функция, которая считается по формуле.
Затем я передаю результат функции в функцию differential_evolution.
Но в перебор попадают значения наподобие 3.23343343.
Как мне сделать чтобы в функцию differential_evolution попадали только целочисленные значения?

from scipy.optimize import differential_evolution
import numpy as np
def function2(x):
    res = x[0] * x[1]
    if res < 100:
        with open("генетика.csv", "a") as f:
            f.write(str(x))
            f.write('\t')
            f.write(str(res))
            f.write('\n')
    return res
bounds = [(-5, 5),(-10, 10)]
result = differential_evolution(function2, bounds)
result.x, result.fun
print(result.x, result.fun)


Я нашел функцию по проверке на целое число.
Но когда подставляю ее в мою функцию, то differential_evolution выдает ошибку, так как функция не возвращает никакого значения,если я туда подаю не целое число.
Как грамотно задать, чтобы в мою функцию попадали только целые числа?
Или придется менять саму функцию differential_evolution? Она огромная -700 строк и я ее боюсь =)
def is_int(x):
    temp = str(x)  # конвертируем в str для проверок

    i = 0  # счетчик
    while i < len(temp):
        if temp[i] == '.':  # проверяем является ли целым / узнаем индекс нуля

            while i + 1 < len(temp):  # пробегаемся по индексам после "."
                if temp[i + 1] != '0':  # если после "." не ноль - не Int
                    return False
                i += 1
            else:
                return True
        i += 1
    else:
        return True  # если "." нет - следовательно Int
  • Вопрос задан
  • 360 просмотров
Решения вопроса 2
adugin
@adugin Куратор тега Python
Для случаев вида x = 1.0:
if int(x) == x:
    ...

Потому что:
assert int(1.0) == 1.0
Можно ещё так, но это будет работать только для истинно целых чисел (int, а не float):
if type(x) is int:
    ...

UPD
data = [1.0, 1.23, 2.0, 2.71, 3.0, 3.14]
for x in filter(float.is_integer, data):
    print(x)
Ответ написан
@res2001
Developer, ex-admin
1. вариант - в вашей функции переводить в целые:
xi = int(round(x))
Это вариант с округлением. Если убрать round, то будет вариант с отбрасыванием дробной части.

2. вариант - в вашей функции ничего не делать, если число дробное.
Приведенная функция is_int - полная лажа. Проверку на целое можно сделать гораздо проще:
def is_int(x):
  if (x % 1) == 0:
     return true
  else:
    return false


PS: Вы подаете на вход differential_evolution массив целых чисел, она там что-то с ними делает и в вашей функции появляются дробные числа. Либо вы обходите их приведенными выше способами, либо модифицируете differential_evolution, так чтоб в вашей функции не было дробных чисел.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы