La reponse courte est oui! Il peut fonctionner et est aussi simple que de multiplier le vecteur par un entier et de prendre la partie entière de chacune de ses composantes.tn∈ ( 0 , 1)rém
La réponse la plus longue est que votre intuition est correcte, qu'en pratique elle a des résultats mitigés selon le choix de:
- quelle séquence vous choisissez (Halton, Sobol, etc.)
- les paramètres de base (par exemple, 2,3,5, ...)
- et dans une moindre mesure, la valeur de .m
Cependant, j'ai récemment écrit un article de blog détaillé "L'efficacité déraisonnable des séquences quasi aléatoires , sur la façon de créer facilement une séquence ouverte à faible écart dans des dimensions arbitraires, qui est beaucoup plus susceptible de discrétisation que les séquences existantes à faible écart existantes, telles que les séquences Halton et Kronecker.
La section de l'article intitulée "Couverture" traite spécifiquement de votre question de discrétiser les séquences à faible écart.
Dans les carrés d'image suivants (qui indiquent un point de réseau entier unique) avec moins de rouge, cela implique une distribution plus uniforme, car chaque carré rouge indique que la cellule ne contient pas de point bleu. On peut clairement voir comment même la séquence distribue des points par rapport à d'autres méthodes contemporaines.R
La solution est une méthode de récurrence additive (modulo 1) qui généralise le problème 1-Dimensionnel dont la solution dépend du Golden Ratio. La solution au problème de dimension , dépend d'une constante spéciale , où est la valeur de la plus petite valeur réelle positive de telle que
réϕréϕréX
Xré+ 1= x + 1
Pour , , qui est le nombre d'or canonique.ré= 1ϕ1= 1,618033989 ...
Pour , , qui est souvent appelé la constante plastique, et possède de belles propriétés. Cette valeur a été supposée être probablement la valeur optimale pour un problème bidimensionnel connexe [Hensley, 2002].ré= 2ϕ2= 1,3247179572 ...
Jacob Rus a publié une belle visualisation de cette séquence bidimensionnelle à faible écart, qui peut être trouvée ici .
Avec cette constante particulière à la main, le calcul du terme -ème est maintenant extrêmement simple et rapide à calculer:n
R :tn=αα0+ nαα( mod1 ) ,n = 1 , 2 , 3 , . . .
whereαα=(1ϕd,1ϕ2d,1ϕ3d,...1ϕdd),
Bien sûr, la raison pour laquelle on appelle cela une séquence de récurrence est que la définition ci-dessus est équivalente à
R:tn+1=tn+αα(mod1)
Dans presque tous les cas, le choix de ne change pas les caractéristiques clés, et donc pour des raisons de simplicité évidente, est le choix habituel. Cependant, certains arguments, relatifs à la symétrie, suggèrent que est un meilleur choix.αα0αα0=00αα0=1/21/2
Le code Python est
# Use Newton-Rhapson-Method
def gamma(d):
x=1.0000
for i in range(20):
x = x-(pow(x,d+1)-x-1)/((d+1)*pow(x,d)-1)
return x
d=5
n=1000
# m can be any number.
# In the diagram above it is chosen to be exactly sqrt of n,
# simply to to make the visualization more intuitive
# so that ideally each cell should have exactly one dot.
m=10
g = gamma(d)
alpha = np.zeros(d)
for j in range(d):
alpha[j] = pow(1/g,j+1) %1
z = np.zeros((n, d))
c = (np.zeros((n,d)).astype(int)
for i in range(n):
z = (0.5 + alpha*(i+1)) %1
c = (np.floor(m *z)).astype(int)
print(c)
J'espère que cela pourra aider!