(на основе статьи - https://link.springer.com/article/10.1007/s10479-023-05366-7)
Данный проект принимает на вход JSON-файл, описывающий задачу AHP (эксперты, альтернативы, матрицы парных сравнений) и выполняет расчёт алгоритма AEM-COM для уменьшения несовместимости решений
Вся логика работы управляется входным JSON Код менять НЕ нужно для стандартных сценариев
- Создать JSON-файл задачи
- Указать параметры AEM-COM
- Заполнить матрицы экспертов
- (опционально) указать коллективную матрицу
- Запустить программу, передав JSON
JSON должен содержать следующие поля:
- problem
- experts
- model
- settings
- pairwise_matrices
Пример структуры:
{
"problem": {...},
"experts": [...],
"model": {...},
"settings": {...},
"pairwise_matrices": {...}
}Используется только для описания задачи.
{
"problem": {
"id": "example_1",
"name": "AEM-COM example",
"description": "Test run",
"goal": "Reduce inconsistency"
}
}Можно писать любой текст.
Список экспертов и их весов.
{
"experts": [
{ "id": "e1", "weight": 0.5 },
{ "id": "e2", "weight": 0.3 },
{ "id": "e3", "weight": 0.2 }
]
}Требования:
- id уникальный
- веса >= 0
- сумма весов может быть любой (нормируется автоматически)
{
"criteria": [
{ "id": "C0", "name": "Criterion 1" }
]
}Если критерий один — всё равно нужно указать массив.
{
"alternatives": [
{ "id": "A1", "name": "Alt 1" },
{ "id": "A2", "name": "Alt 2" },
{ "id": "A3", "name": "Alt 3" }
]
}Порядок альтернатив ВАЖЕН — он должен совпадать во всех матрицах.
{
"settings": {
"ahp_scale": "saaty_1_9",
"aem_com": {
"permissibility": 0.25,
"apply_to": ["alternatives_by_criterion"],
"max_iterations": 100,
"strict_decrease": true,
"initial_mode": "pccm"
}
}
}Описание параметров:
-
permissibility Максимальное относительное изменение (0.25 = ±25%), p от 0 до 1
-
apply_to Где применять AEM-COM Возможные значения:
- "criteria"
- "alternatives_by_criterion"
-
max_iterations Максимальное число итераций
-
strict_decrease true – принимать только шаги, уменьшающие GCOMPI false – разрешать временное ухудшение
-
initial_mode Как формировать начальную коллективную матрицу:
- "aij" — агрегация экспертных матриц
- "first_expert" — матрица первого эксперта
- "identity" — единичная матрица
- "pccm" — коллективная матрица из JSON
Для работы с PCCM использовать "initial_mode": "pccm"
{
"criteria_level": [
{
"expert_id": "e1",
"items": ["C0"],
"matrix": [[1.0]]
}
]
}Если критерий один — матрица 1x1.
Для каждого эксперта и каждого критерия:
{
"alternative_level": [
{
"criterion_id": "C0",
"expert_id": "e1",
"items": ["A1", "A2", "A3"],
"matrix": [
[1.0, 3.0, 5.0],
[0.3333, 1.0, 3.0],
[0.2, 0.3333, 1.0]
]
}
]
}Требования:
- матрица квадратная
- все значения > 0
a[j][i] = 1 / a[i][j]- порядок items строго совпадает с model.alternatives
{
"collective_matrix": {
"criterion_id": "C0",
"items": ["A1", "A2", "A3"],
"matrix": [
[1.0, 2.5, 4.0],
[0.4, 1.0, 2.0],
[0.25, 0.5, 1.0]
]
}
}Важно:
- criterion_id обязателен
- expert_id не указывается
- используется только как начальная матрица
Запустить main.py в корне проекта и ввести цифру 1. Затем передать путь к json файлу и нажать Enter. После чего действие выбирается согласно пунктам меню
- Совпадает ли порядок items во всех матрицах
- Указан ли criterion_id в collective_matrix
- initial_mode = "pccm", если используется коллективная матрица
- Все значения матриц > 0
- Матрицы взаимно обратные
Для воспроизведения экспериментов из статьи (ссылка в начале документации):
initial_mode: "pccm"strict_decrease: truepermissibility: 0.05 / 0.15 / 0.25apply_to: ["alternatives_by_criterion"]
- Основной разработчик - Иван И. Азаров, студент ИКНК СПбПУ
Проект распространяется под лицензией MIT.