Задача
Я создал набор многоугольников, основанный на сумке пересечения плоскостей.
Теперь я пытаюсь создать следующий коллектор путем комбинаторной оптимизации.
- Ограничение коллекторов каждое ребро в конечной модели должно совпадать с двумя полигонами.
- Оптимизировать вес каждый полигон имеет доверительный вес, модель должна оптимизироваться в направлении наибольшей общей уверенности
- Оптимизировать простоту Оптимизировать в сторону меньших углов (больше полигонов в одной плоскости)
Попытка
Идея состояла в том, чтобы использовать 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.Я не могу использовать этот решатель из-за лицензии.