Перейти к содержанию

Базовый пример использования

Этот пример предназначен для демонстрации использования решателя с готовыми моделями, заданными в виде .mps, .lp, .cnf или .wcnf файлов. Для создания LP/MIP или SAT/MaxSAT непосредственно из математической модели обратитесь в соответствующие главы данного руководства. Полные версии скриптов для запуска всех рассмотренных ниже моделей прилагаются к данному руководству в виде отдельных py-файлов.

Первым этапом для использования любой модели в решателе OptJet является создание менеджера. Для этого воспользуемся функцией из подмодуля quante пакета optjet:

```python import optjet.quant_engine as qe

qmng = qe.manager() ```

Полученный в результате объект qmng является ключевым для связи python-оболочки интерфейса и внутреннего представления решателя.

Задание параметров решателя

Вторым этапом необходимо в менеджер передать конфигурацию для инициализации решателя. Она задается в виде python-словаря со строками (именами параметров) в качестве ключей и строками в качестве значений. Параметры делятся на 3 группы:

  • Общие параметры, отвечающие за логирование и лицензию.

  • Параметры LP/MIP ядер (имеют префикс linh или pmip).

  • Параметры SAT/MaxSAT ядер (имеют префикс cdst, glcs или msat).

Дополнительно, запустив решатель без модели с параметрами:

python qparams = { "show_parameters": "true", "show_parameters_help": "true" }

можно получить их краткое описание.

Для промышленного использования и решения больших задач с использованием OptJet необходим лицензионный ключ. Передать его можно путем добавления параметра pkey в конфигурацию решателя:

python qparams = { "pkey": <ваш лицензионный ключ>, ... }

Без задания ключа все ядра оптимизации будут работать, однако будут установлены ограничения на количество переменных (не более \(2\,000\,000\) переменных) и максимально время поиска решения (не более \(10\) минут).

Далее рассмотрим базовые конфигурации для каждого из ядер. Стандартная конфигурация для запуска LP/MIP задачи выглядит следующим образом:

python qparams = { "input_lp_file": <путь до входного lp/mps файла>, "log_console_output_level": "info", "log_file_output_level": "info", "log_file_folder": <путь до директории сохранения лог-файлов запуска> "linh.pmip_solver_solo_file": "false", "linh.algorithm_enable": "true", "linh.presolve": "true", "linh.time_limit": <ограничение времени для однопоточного алгоритма в сек.>, "linh.pmip_time_limit": <ограничение времени для многопоточного алгоритма в сек.>, "linh.write_solution_file": <путь до файла с наденными значениями переменных>, "linh.solut_only_non_zeros": "false", }

Для SAT задач используется конфигурация:

python qparams = { "input_cnf_file": <путь до входного cnf файла>, "log_console_output_level": "info", "log_file_output_level": "info", "log_file_folder": <путь до директории сохранения лог-файлов запуска> "cdst.algorithm_enable": "true", "cdst.search_time_limit": <ограничение времени для алгоритма>, }

Соответственно, для MaxSAT задач:

python qparams = { "input_cnf_file": <путь до входного wcnf файла>, "log_console_output_level": "info", "log_file_output_level": "info", "log_file_folder": <путь до директории сохранения лог-файлов запуска> "msat.algorithm_enable": "true", "msat.preprocess_use": "true", "msat.preprocess_build_time": "14", "msat.core_g_linear_strategy": "1", "msat.iter_exp_time_factor": "4.5", "cdst.search_time_limit": ..., "msat.global_time_limit": ..., "msat.witness_in_file": "true", }

Для передачи готового списка параметров в решатель используется метод init() созданного ранее экземпляра менеджера:

python qmng.init(qparams)

Загрузка модели и запуск решателя

Для решения готовой модели необходимо в качестве параметра в решатель передать путь к файлу, содержащему ее. Для LP/MIP задач поддерживаются такие расширения файлов, как .mps и .lp.

Для SAT и MaxSAT задач поддерживаются расширения .cnf и .wcnf.

Для загрузки LP/MIP модели в решатель путь к файлу передается через параметр input_lp_file, для SAT/MaxSAT моделей --- через input_cnf_file.

Для запуска решателя необходимо у объекта менеджера вызвать метод run():

python rc = qmng.run()

Этот метод имеет следующие коды возврата rc типа \<...>:

  • 10 (feasible или sat) --- было найдено решение, однако его оптимальность не была доказана.

  • 20 (infeasible или unsat) --- не было найдено ни одного решения или доказано, что задача неразрешима.

  • 30 (optimum) --- было найдено оптимальное решение (имеет смысл только для MIP или MaxSAT).

Анализ результатов

После запуска модели и решения задачи помимо файла с результатом можно получить значения найденных переменных непосредственно из менеджера. Для получения объекта результата необходимо вызвать метод get_lp_solution() или get_witness_data() для, соответственно, LP/MIP или SAT/MaxSAT моделей. Пример для каждой из модели приведен ниже:

```python

Для LP/MIP модели

solution = qmng.get_lp_solution(qe.algorithm_type.linh)

Для SAT модели

solution = qmng.get_witness_data(qe.algorithm_type.cdst)

Для MaxSAT модели

solution = qmng.get_witness_data(qe.algorithm_type.msat) ```

Для получения массива со значениями переменных из этого объекта применяется метод get_full_x(), возвращающий значения всех переменных. Для дальнейшего использования его удобно перевести в numpy-совместимый тип np.ndarray следующим набором команд:

```python

Для LP/MIP модели

x_vec = solution.get_full_x()

Для SAT/MaxSAT модели

x_vec = solution.get_full_x()

x_np = x_vec.get_ndarray() ```

Также для LP/MIP и MaxSAT моделей объект решения solution поддерживает метод получения значения целевой функции get_optimum_value():

```python

Для LP/MIP или MaxSAT модели

optimum_value = solution.get_optimum_value() ```