Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AEM-COM Python

(на основе статьи - https://link.springer.com/article/10.1007/s10479-023-05366-7)

Назначение

Данный проект принимает на вход JSON-файл, описывающий задачу AHP (эксперты, альтернативы, матрицы парных сравнений) и выполняет расчёт алгоритма AEM-COM для уменьшения несовместимости решений

Вся логика работы управляется входным JSON Код менять НЕ нужно для стандартных сценариев


Минимальный порядок действий

  1. Создать JSON-файл задачи
  2. Указать параметры AEM-COM
  3. Заполнить матрицы экспертов
  4. (опционально) указать коллективную матрицу
  5. Запустить программу, передав JSON

Общая структура JSON

JSON должен содержать следующие поля:

  • problem
  • experts
  • model
  • settings
  • pairwise_matrices

Пример структуры:

{
  "problem": {...},
  "experts": [...],
  "model": {...},
  "settings": {...},
  "pairwise_matrices": {...}
}

Блок problem (метаданные)

Используется только для описания задачи.

{
  "problem": {
    "id": "example_1",
    "name": "AEM-COM example",
    "description": "Test run",
    "goal": "Reduce inconsistency"
  }
}

Можно писать любой текст.


Блок experts (обязателен)

Список экспертов и их весов.

{
  "experts": [
    { "id": "e1", "weight": 0.5 },
    { "id": "e2", "weight": 0.3 },
    { "id": "e3", "weight": 0.2 }
  ]
}

Требования:

  • id уникальный
  • веса >= 0
  • сумма весов может быть любой (нормируется автоматически)

Блок model (структура AHP)

Критерии

{
  "criteria": [
    { "id": "C0", "name": "Criterion 1" }
  ]
}

Если критерий один — всё равно нужно указать массив.

Альтернативы

{
  "alternatives": [
    { "id": "A1", "name": "Alt 1" },
    { "id": "A2", "name": "Alt 2" },
    { "id": "A3", "name": "Alt 3" }
  ]
}

Порядок альтернатив ВАЖЕН — он должен совпадать во всех матрицах.


Блок settings (настройки алгоритма)

{
  "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"


Блок pairwise_matrices (обязателен)

Матрицы экспертов по критериям

{
  "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

Коллективная матрица (только если initial_mode = "pccm")

{
  "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. После чего действие выбирается согласно пунктам меню


Что проверять, если что-то не работает

  1. Совпадает ли порядок items во всех матрицах
  2. Указан ли criterion_id в collective_matrix
  3. initial_mode = "pccm", если используется коллективная матрица
  4. Все значения матриц > 0
  5. Матрицы взаимно обратные

Рекомендуемая конфигурация

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

  • initial_mode: "pccm"
  • strict_decrease: true
  • permissibility: 0.05 / 0.15 / 0.25
  • apply_to: ["alternatives_by_criterion"]

Участники проекта

  1. Основной разработчик - Иван И. Азаров, студент ИКНК СПбПУ

Лицензия

Проект распространяется под лицензией MIT.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages