Ich muss Zufallsvektoren von reellen Zahlen a_i erstellen, die die folgenden Bedingungen erfüllen:
abs(a_i) < c_i;
sum(a_i)< A; # sum of elements smaller than A
sum(b_i * a_i) < B; # weighted sum is smaller than B
aT*A*a < D # quadratic multiplication with A smaller than D
where c_i, b_i, A, B, D are constants.
Was wäre der typische Algorithmus, um diese Art von Vektor effizient zu erzeugen?
random-generation
LouisChiffre
quelle
quelle
a_i
folgt das der Verteilungp_i
und ist das auch wenigerc
? Das liegt daran, dass die Verteilungp_i
auch weniger istc
? In welcher Distribution denkst du?c
,A
,B
und Lambda - Ausdrücke festgelegt?Antworten:
Wenn ich Sie richtig verstehe, erfüllen nur Punkte in einem kleinen Volumen des n-dimensionalen Raums Ihre Einschränkungen.
Ihre erste Einschränkung beschränkt sie auf das Innere einer Hypersphäre, was mich an die häufig gestellten Fragen zu " comp.graphics.algorithms " "Einheitliche zufällige Punkte auf der Kugel" und " Wie werden gleichmäßig verteilte Punkte in der 3-D-Einheitskugel erzeugt? " Erinnert . Die zweite Einschränkung schneidet ein wenig aus der Hypersphäre heraus, und die anderen Einschränkungen verschwinden weiter bei dem Volumen, das Ihren Einschränkungen entspricht.
Ich denke, das Einfachste ist einer der in den FAQ vorgeschlagenen Ansätze:
Mit einem ausreichend hochwertigen Zufallszahlengenerator erhalten Sie einen Satz gespeicherter Koordinaten, die Ihre Kriterien mit (erwarteter) gleichmäßiger Dichte erfüllen.
Wenn Sie eine relativ hohe Dimensionalität n haben (dh wenn Sie jeden Vektor aus einer relativ langen Liste von Koordinaten konstruieren), hat die beschriftete Kugel (geschweige denn Ihr verkleinertes Volumen) einen überraschend kleinen Teil des Gesamtvolumens von Der gesamte Begrenzungsrahmen muss daher möglicherweise viele Iterationen ausführen, von denen die meisten abgelehnte Punkte außerhalb Ihres eingeschränkten Bereichs generieren, bevor ein Punkt innerhalb Ihres eingeschränkten Bereichs gefunden wird. Da Computer heutzutage ziemlich schnell sind, wird das schnell genug sein?
quelle
f1(x1) + f2(x2) == C
Irgendwelche Vorschläge hier?