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, так чтоб в вашей функции не было дробных чисел.