Комбинаторное ограничение удовлетворенности и оптимизации - PullRequest
0 голосов
/ 15 октября 2018

Задача

Я создал набор многоугольников, основанный на сумке пересечения плоскостей.

schermafbeelding 2018-10-11 om 16 50 39

Теперь я пытаюсь создать следующий коллектор путем комбинаторной оптимизации.

schermafbeelding 2018-10-11 om 16 50 51

  • Ограничение коллекторов каждое ребро в конечной модели должно совпадать с двумя полигонами.
  • Оптимизировать вес каждый полигон имеет доверительный вес, модель должна оптимизироваться в направлении наибольшей общей уверенности
  • Оптимизировать простоту Оптимизировать в сторону меньших углов (больше полигонов в одной плоскости)

Попытка

Идея состояла в том, чтобы использовать python-constraint для генерации возможных решений и выбора наилучшего подбора, оптимизируя некоторые веса для каждого многоугольника с помощью scipy.optimize.

Однако попыталсязатем следует python-constraint, и он не может генерировать решения.

import constraint
problem = constraint.Problem()
problem.addVariables(range(len(polygons)), [True, False])

for idx, polygon in enumerate(polygons):
    edge_adjacent_polygons = [polygon[a][b]['polygon'] for a, b in polygon.edges()]
    if all([len(adjacent_polygons) > 2 for adjacent_polygons in edge_adjacent_polygons]):
        for adjacent_polygons in edge_adjacent_polygons:
            problem.addConstraint(lambda *adjacent_polygons: sum(adjacent_polygons) == 2, adjacent_polygons)
    elif any([len(adjacent_polygons) == 2 for adjacent_polygons in edge_adjacent_polygons]) & \
        all([len(adjacent_polygons) >= 2 for adjacent_polygons in edge_adjacent_polygons]):
        problem.addConstraint(lambda idx: idx == True, [idx])
    else:
        problem.addConstraint(lambda idx: idx == False, [idx])

Другие идеи, которые у меня были, были смоделировать это как проблему оптимизации графов в NetworkX и использовать что-то вроде min_weighted_vertex_cover.Или используя библиотеку jMetalPy, однако мне неясно, как смоделировать эту проблему в этих подходах.

Вопрос

Я понимаю, что эта проблема объединяет нелинейную оптимизацию и проблему комбинаторного удовлетворения.Мои самые важные вопросы:

  • Является ли мой подход правильным или слишком сложным?
  • Существует ли инструмент для моделирования такой проблемы?

Исходная проблема(и изображения) взяты из бумаги, которую я пытаюсь воспроизвести https://repository.kaust.edu.sa/handle/10754/627151. В работе используется запатентованный решатель Gurobi.Я не могу использовать этот решатель из-за лицензии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...