如何在约束下进行基因随机数

12次观看(最近30天)
我想基因两种矢量x(尺寸= 37x1)和y(尺寸= 37x1)的随机数(尺寸= 37x1)
100至1900使得任何两个矢量X或Y数量之间的差异应大于200。
我尝试一次又一次地生成随机数,同时拒绝他们不满足约束。
但是它使Infinte循环。
实际上X和Y是涡轮机的绳索。约束是不可能在任何其他涡轮机的200米半径中。做得非常快吗?谢谢
6条评论

登录发表评论。

接受的答案

亚当·丹兹(Adam Danz)
编辑:亚当·丹兹(Adam Danz) 2019年9月26日
这需要毫秒。
主要想法是从一组随机坐标开始,并不断替换离另一个坐标太近的坐标,直到任何一个距离1)所有距离都小于最小距离要求或2)每个坐标进行了100次尝试。
%定义参数
nPoints = 37;坐标数%
lim = [100,1900];%随机数的百分比
Mindist = 200;涡轮机之间的最小距离%
%创建随机坐标并连续替换坐标
百分比太接近另一点。最小距离时停止
%满足或进行npoints*100尝试。
xy = nan(npoints,2);
C = 0;%柜台
尽管任何(isnan(xy(:)))&& c <(npoints*100)
%用新的随机坐标填充NAN值
xy (isnan (xy)) =兰德(sum (isnan (xy (:)))) * ( lim (2)-lim(1)) + lim(1);
%识别离另一点太近的行
[〜,istooclose] = find(triu(square form(pdist(xy))
%替换与NAN过于近距离的坐标
xy(istooclose,:) = nan;
C = C+1;
结尾
如果循环必须退出并且缺少值仍然存在,则%投掷错误
如果any(isnan(xy(:)))
error('while-loop放弃了。有%d坐标缺少值。”,sum(isnan(xy(:,1))))))
结尾
%显示尝试数
fprintf('%d number of attempts.\n', C)
%显示最小距离
距离= squareform(pdist(xy));
fprintf('最小距离=%.2f \ n',最小(距离(距离〜= 0)))
绘图结果%
数字()
绘图(xy(:,1),xy(:,2),,'KS',,,,'MarkerSize',10)
网格
上图中的这些数据以<0.08秒的形式产生,坐标之间的最小距离为205.52。
3条评论
Siavash Soltanahmadi
Siavash Soltanahmadi 2021年2月14日
亲爱的 @adam Danz ,,,,
是否有一种方法可以在针对第一组随机数指定的同一范围内生成第二组随机数,其中第二组中的数字受到与第一个约束不同值的约束?
为了澄清,想象一下在一个同一空间中,我们旨在获得12个坐标,10个随机坐标之间的最小分离必须为“ 2”,并且必须在另外2个坐标之间(以及这2个和前10个坐标)之间的最小分离“ 5”。
谢谢,
SIA

登录发表评论。

更多答案(2)

布鲁诺·隆
布鲁诺·隆 2019年9月26日
类似的问题已回答 这个线程

乔斯(10584)
乔斯(10584) 2019年9月26日
蛮力尝试:
n = 20;
xyrange = [100 1900];
最小值= 200;
frim_counter = 1;
距离= 0;
尽管任何(距离<最小距离)&& under_counter <10000
attempt_counter = attempt_counter + 1 ;
pxy = randi(xyrange,n,2);
距离= pdist(pxy);
结尾
如果trim_counter <1000
绘图(pxy(:,1),pxy(:,2),,'bo');
别的
disp(“找不到职位。”);
结尾

社区寻宝

在Matlab Central中找到宝藏,发现社区如何为您提供帮助!

开始狩猎!