Возможное целочисленное переполнение в ограничении: линейное

#or-tools #cp-sat-solver

#или-инструменты #cp-sat-решатель

Вопрос:

Дорогие, я использую CP-SAT в python. У меня есть две переменные:

 pippo = model.NewIntVar(-93372036854775808,9123372036854775807, 'pippo')
test = model.NewIntVar(-93372036854775808,9123372036854775807, 'test')
 

и следующие переменные решения:

 for r in self.all_records:
            memory = {}
            for p in self.all_decisions:
                # create bool decision variables
                memory[p] = model.NewBoolVar('c'   str(r)   self.scenario.decisions[p].name)
            self.decision_var[r] = memory
 

У меня есть два ограничения:

 1) test==sum(self.scenario.dataset['is_fraud'][r]*self.decision_var[r][0] for r in self.all_records)

2) pippo == test


                                                                  
 

Если я удалю ограничение 2) все в порядке, но с ограничением 2 я получаю эту ошибку:

 Possible integer overflow in constraint: linear {
  vars: 126660
  vars: 126661
  coeffs: -1
  coeffs: 1
  domain: 0
  domain: 0
}
and Status is MODEL_INVALID.
 

Я действительно не понимаю, почему. Не могли бы вы мне помочь, пожалуйста?

Ответ №1:

Решатель активно проверяет возможное переполнение. Если модель имеет потенциальное целочисленное переполнение, она считается недействительной.

Вы видите это сообщение. Пожалуйста, уменьшите границы целочисленных переменных (скорее всего, достаточно int32 min / max).

Комментарии:

1. есть ли способ избежать этой предварительной проверки? Я хотел не выполнять его

2. Нет, решатель в этом случае не является надежным. Таким образом, решение, скорее всего, будет недействительным. Но вы можете вызвать метод validate перед решением.