MATLAB Answers

How to genetate random number under constraint

24 ビュー (過去 30 日間)
Muhammad Nabeel Hussain
Muhammad Nabeel Hussain 2019 年 9 月 26 日
コメント済み: Adam Danz 2019 年 9 月 26 日
I want to genetate two vector X(size=37x1) and Y(size=37x1) of random numbers between
100 to 1900 such that difference between any two numbers of one vector X or Y should be greater than 200.
I have tried generating random number again and again while rejecting if they dont met constraint.
but it make infinte loop.
Actually X and Y are cordinates of turbines. Constraint is no turbine can be in the 200 meter radius of any other turbine. Any idea for doing this very fast? Thanks

  6 件のコメント

表示 3 件の古いコメント
Bruno Luong
Bruno Luong 2019 年 9 月 26 日
Then your description "such that difference between any two numbers of one vector X or Y should be greater than 200." is incorrect. The two points
(100,1000)
(150, 100)
are separated by a distance larger than 200. But it is not satisfied what you have originally stated: since the difference of X is 50.
Please clarify your question.
Adam Danz
Adam Danz 2019 年 9 月 26 日
This is actually fairly easy to do if you just monitor the distance between the turbines rather than the distance between each x and y coordinate.
Your question states "any two numbers of one vector X or Y should be greater than 200." In that case, the turbines cannot be any closer than 200*sqrt(2).
Instead of choosing values of x and y individually that have a minimum distance of 200, you just need to monitor the distance between the turbine coordinates.
Adam Danz
Adam Danz 2019 年 9 月 26 日
@Muhammad Nabeel Hussain, I'm curous how you plotted the plane symbols. Mind explaining?

サインイン to comment.

採用された回答

Adam Danz
Adam Danz 2019 年 9 月 26 日
編集済み: Adam Danz 2019 年 9 月 26 日
This takes milliseconds.
The main idea is to start off with a set of random coordinates and continually replace coordinates that are too close to another coordinate until either 1) all distances are less than the minimum distance requirement or 2) 100 attempts were made per coordinate.
%Define parameters
nPoints = 37; %number of coordinates
lim = [100,1900]; %bounds of random numbers
minDist = 200; %minimum distance between turbines
% Create random coordinates and continually replace coordinates
% that are too close to another point. Stop when minimum distance
% is satisfied or after making nPoints*100 attempts.
xy = nan(nPoints,2);
c = 0; %Counter
while any(isnan(xy(:))) && c<(nPoints*100)
% Fill NaN values with new random coordinates
xy(isnan(xy)) = rand(1,sum(isnan(xy(:)))) * (lim(2)-lim(1)) + lim(1);
% Identify rows that are too close to another point
[~,isTooClose] = find(triu(squareform(pdist(xy)) < minDist,1));
% Replace too-close coordinates with NaN
xy(isTooClose,:) = NaN;
c = c+1;
end
% Throw error if the loop had to quit and missing values remain
if any(isnan(xy(:)))
error('The while-loop gave up. There are %d coordinates with missing values.',sum(isnan(xy(:,1))))
end
% Display number of attempts
fprintf('%d number of attempts.\n', c)
% Show the minimum distance
distances = squareform(pdist(xy));
fprintf('Min distance = %.2f\n', min(distances(distances~=0)))
% Plot results
figure()
plot(xy(:,1),xy(:,2), 'ks', 'MarkerSize', 10)
grid on
These data in the figure above were produced in <0.08 sec and the minimum distance between coordinates is 205.52.

  2 件のコメント

Muhammad Nabeel Hussain
Muhammad Nabeel Hussain 2019 年 9 月 26 日
Thankyou Adam Danz. It solved my problem.
Adam Danz
Adam Danz 2019 年 9 月 26 日
Glad I could help.
@Muhammad Nabeel Hussain, I'm curous how you plotted the plane symbols. Mind explaining?

サインイン to comment.

その他の回答 (2 件)

Bruno Luong
Bruno Luong 2019 年 9 月 26 日
Similar question has been answered in this thread

  0 件のコメント

サインイン to comment.


Jos (10584)
Jos (10584) 2019 年 9 月 26 日
Brute force attempt:
N = 20 ;
xyRange = [100 1900] ;
minimumDistance = 200 ;
attempt_counter = 1 ;
Distances = 0 ;
while any(Distances < minimumDistance) && attempt_counter < 10000
attempt_counter = attempt_counter + 1 ;
Pxy = randi(xyRange, N, 2) ;
Distances = pdist(Pxy) ;
end
if attempt_counter < 1000
plot(Pxy(:,1), Pxy(:,2),'bo') ;
else
disp('No positions found.') ;
end

  0 件のコメント

サインイン to comment.

サインイン してこの質問に回答します。


Translated by