Прямо сейчас я застрял в решении следующей «полу» -математической задачи.
Я хотел бы разбить n-мерное ограниченное пространство (точнее, гиперкуб)
D={(x_1, ...,x_n), x_i \in IR and -limits<=x_i<=limits \forall i<=n}
На меньшие кубики.
То есть я хотел бы уточнить n,limits,m
где m
будет количество разделений на одну сторону куба — 2*limits/m
будет длина маленьких кубиков, и я получу m^n
такие кубики.
Теперь я хотел бы вернуть вектор векторов, содержащий несколько различных координат этих маленьких кубиков. (или, возможно, можно представить кубы как объекты, которые характеризуются вектором, указывающим на «левый» внешний угол?)
По сути, я понятия не имею, выполнимо ли что-то подобное с помощью C ++. Реализация этого для фиксированного n не представляет проблемы. Но я бы хотел, чтобы у пользователя был свободный выбор размера.
Фон: Нечто подобное будет бесценным в оптимизации. Где можно разделить пространство на более мелкие и использовать, например, генетические алгоритмы на каждом из подпространств, а затем сравнить результаты. Таким образом, можно избежать огромных начальных популяций и значительно улучшить результаты поиска.
Также мне просто любопытно, что ли. как это выполнимо 🙂
Мое предложение: Использовать деревья B +?
Пусть m будет количеством секций в измерении, т.е. край, гиперкуба D.
Тогда есть m ^ n различных подпространств S из D, как вы говорите. Пусть подпространства S однозначно представлены целочисленными координатами S = [y_1, y_2, …, y_n], где y_i — целые числа в диапазоне 1, …, m. В декартовых координатах S = (x_1, x_2, …, x_n), где Delta * (y_i-1) -пределы <= x_i < Delta * y_i-limit и Delta = 2 * limit / m.
«Левый внешний угол» или источник S, который вы искали, — это просто точка, соответствующая наименьшему x_i, то есть точка (Delta * (y_1-1) -limits, …, Delta * (y_n-1) — пределы). Вместо того, чтобы представлять различные S к этому моменту, имеет гораздо больше смысла (и будет быстрее в компьютере) представлять их, используя целочисленные координаты выше.
Других решений пока нет …