Полагаю, вы взяли настройки параметров из примера в документации ? Эти параметры заставят CPLEX перечислять все оптимальные решения. Если вам нужны все решения, вы должны установить очень большой разрыв в пуле решений.
У CPLEX есть много способов генерации решений, но примерно он следует стандартной схеме ветвления и привязки. дополнено эвристикой.
Конечно, решение имеет значение для каждой переменной. Если вам нужны только определенные переменные, вы можете использовать различные типы фильтрации и понимания, которые предоставляет Python. Например, чтобы получить индексы двоичных переменных, которые равны 1, в решении вы можете сделать что-то вроде этого:
indices = [j for j, a in enumerate(cpx.solution.pool.get_values(i)) if a > 0.5]
РЕДАКТИРОВАТЬ: После просмотра и запуска кода мы нашли, в чем проблема is:
Код устанавливает только параметр абсолютного разрыва, он также должен устанавливать параметр относительного разрыва.
Код устанавливает параметры следующим образом cpx.solnpoolintensity = 4
. Это не правильный способ установки параметров. Оператор просто создает новое свойство в объекте, которое игнорируется остальной частью кода.
Правильный способ задания параметров для перечисления (до) 4000 решений - это
cpx.parameters.mip.pool.intensity.set(4)
cpx.parameters.mip.pool.absgap.set(1e75)
cpx.parameters.mip.pool.relgap.set(1e75)
cpx.parameters.mip.limits.populate.set(4000)