Базовый пример использования
Этот пример предназначен для демонстрации использования решателя с готовыми моделями, заданными в виде .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() ```