Задача оптимизации: Подгонка шестиугольников в пределах области

#python #optimization #geometry #android-3.0-honeycomb #tessellation

#питон #оптимизация #геометрия #android-3.0-honeycomb #тесселяция

Вопрос:

У меня есть проблема с геометрией, и я подумал о том, чтобы использовать python для ее решения (у меня мало опыта). Мне нужен совет, как подойти к этой проблеме.

установка шестигранников

В приложении вы можете увидеть проблему. У меня есть домен L x B, и, учитывая размер ячейки шестиугольника (Ls), я нашел максимальное количество ячеек в прямом (n) и зигзагообразном (m) направлениях, чтобы охватить домен, оставаясь в нем. ErrorL и errorB-это ошибки, которые я совершаю между границей домена и ячейками, так как у меня есть целое число ячеек для использования, и эта ошибка должна быть сведена к минимуму.

Вот простой код (может быть, его можно получить намного проще, но он работает)

 from scipy import optimize import numpy as np  #case cells in L straight (n), in B zig zag (m)  L = 500 B = 200 Ls = 10 Lz = Ls*(3**(0.5)/2)  print('Ls =', Ls) print('Lz =', Lz) print('-------------')  def errorL(n):  return abs(L-(Ls*n   Ls/2))  def errorB(m):  return abs(B-(Lz*m   Lz/3))  resultL = optimize.minimize_scalar(errorL) resultB = optimize.minimize_scalar(errorB)  a = round(resultL.x) b = round(resultL.x)-1 c = round(resultB.x) d = round(resultB.x)-1  if (Ls*a   Ls/2) lt;= L:  print('n =', a)  print('errorL =', errorL(a)) else:  print('n =', b)  print('errorL =', errorL(b))  if (Lz*c   Lz/3) lt;= B:  print('m =', c)  print('errorB =', errorB(c))  else:  print('m =', d)  print('errorB =', errorB(d))  

Это был пример с заданным размером ячейки Ls, теперь я хотел бы найти способ сохранить Ls в диапазоне [a,b] и найти лучшие Ls, n и m, чтобы минимизировать ошибки и ошибки. Каждая минимизация errorL и errorB зависит от двух переменных, но выбор Ls влияет на обе. Я начал писать задачу минимизации с двумя переменными, но я не уверен, как продолжить, учитывая ошибки errorL и errorB для минимизации с одной и той же переменной Ls. Кроме того, я хотел бы работать только с n и m в качестве целых чисел. Как я могу это сделать?

Любые предложения приветствуются.

Большое спасибо

д-р

Ответ №1:

При постоянном Ls , вам не нужно решать задачу оптимизации для того, чтобы штрафовать m и n . Вы можете просто установить:

 n = floor((L-Ls/2)/Ls) m = floor((B-Lz/3)/Lz)  

и ошибки станут:

 errorL = L-(Ls*n   Ls/2) errorB = B-(Lz*m   Lz/3)  

и, конечно Lz , равен sqrt(3)/2*Ls

Таким образом, оба значения ошибок становятся функциями только одной переменной, т. е. Ls . Теперь вы можете определить единственную функцию затрат (например errorL*errorB , или errorL errorB ) и свести ее к минимуму без учета затрат.. Ls