Saya perlu membuat vektor acak bilangan real a_i memenuhi batasan berikut:
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.
Apa yang akan menjadi algoritma khas untuk menghasilkan vektor jenis ini secara efisien?
random-generation
LouisChiffre
sumber
sumber
a_i
mengikuti distribusip_i
dan juga kurang dari ituc
? Itu karena distribusinyap_i
juga kurang dari ituc
? Di distribusi mana Anda berpikir?c
,A
,B
dan lambdas tetap?Jawaban:
Jika saya mengerti Anda dengan benar, hanya titik dalam beberapa volume kecil ruang n-dimensi yang memenuhi kendala Anda.
Batasan pertama Anda membatasi ke interior sebuah hypersphere, yang mengingatkan saya pada FAQ comp.graphics.algorithms "Seragam titik acak pada bola" dan Bagaimana cara menghasilkan titik yang terdistribusi secara merata dalam bola unit 3-d? Kendala kedua memotong sedikit keluar dari hypersphere, dan kendala lainnya semakin jauh mengurangi volume yang memenuhi kendala Anda.
Saya pikir hal paling sederhana untuk dilakukan adalah salah satu pendekatan yang disarankan oleh FAQ:
Dengan generator angka acak berkualitas tinggi yang cukup, ini memberi Anda satu set koordinat tersimpan yang memenuhi kriteria Anda dengan kepadatan seragam (diharapkan).
Sayangnya, jika Anda memiliki dimensi relatif tinggi n (yaitu, jika Anda membuat setiap vektor dari daftar koordinat yang relatif panjang), bidang bertuliskan (apalagi volume yang dipangkas) memiliki bagian yang sangat kecil dari total volume kotak pembatas total, jadi mungkin perlu menjalankan banyak iterasi, kebanyakan dari mereka menghasilkan poin yang ditolak di luar area terbatas Anda, sebelum menemukan titik di dalam area terbatas Anda. Karena komputer sekarang ini cukup cepat, apakah itu cukup cepat?
sumber
f1(x1) + f2(x2) == C
Ada saran di sini?