Code Monkey home page Code Monkey logo

drone-placement's Introduction

Drone Placement

Objective

Design an algorithm to place 1000 2-dimensional drones (looking like a disc) randomly and without collision within a L x L square meter area.

Input

  • N - The number of drones (equi-radius circles)
  • L - Length of each side of the square
  • r - Radius of each drone (circle)

Output

If a valid placement can be found, the coordinates of the center of each drone. If not, denote that a valid placement cannot be found for the given input.

Solution

  1. Let D=2r (diameter). Partition the L x L square into N non-overlapping rectangles where the width w and height h of each rectangle satisfies min(w, h)>=D. Any such rectangle has the ability to hold a single circle. To do this, start with the L x L square as the only rectangle. At each iteration of the algorithm:

    1. Pick one of the remaining rectangels satisfying w>=2D and/or h>=2D. Such a rectangle can be split into two rectangles each satisfying min(w, h)>=D. If none of the remaining rectangles satisfy this condition, terminate and go to Step 2.
    2. Split it along width or height, depending on whether w>=2D or h>=2D. If both w>=2D and h>=2D, randomly select the dimension to split along.
    3. Select the splitting point randomly (see below for details).
    4. Split the rectangle at the chosen splitting point. Now we have one more valid rectangle in our set.
    5. Repeat with steps i-iv.

  2. If less than N rectangles were found, then a valid solution does not exist.

  3. If N rectangles were found, place a circle in each rectangle randomly. Since we ensured that each rectangle satisfied min(w, h)>=D, this can always be done.

Selecting a splitting point (Step 1.iii. of solution outline)

Assume that the selected dimension to split a rectangle along has length p where p>=2D. The splitting point q is found as

q=D + TruncatedNormal(mean=0.5, variance=sigma^2, min=0, max=1) (p-2D)

Here TruncatedNormal is the Truncated Normal Distribution (https://en.wikipedia.org/wiki/Truncated_normal_distribution), which is a Gaussian restricted to range [min, max]. Note that

  1. When sigma=0, TruncatedNormal(mean=0.5, variance=0, min=0, max=1)=0.5, and hence the rectangle will always be split in half (q=p/2).
  2. When sigma -> infinity, TruncatedNormal approaches a uniform distribution and there will be randomness in the splitting location.

sigma=0 packs the circles tighter and has less randomness while sigma -> infinity packs the circles looser and has higher randomness. When L is small we have to restrict sigma and when L is large we can increase sigma. So to achieve the maximum possible randomness we choose the maximum sigma that allows to place all circles inside. This is done by using binary search.

Using the code

Since standard C++ libraries do not include the capability to calculate TruncatedNormal, a library developed by researchers at https://people.sc.fsu.edu/~jburkardt/cpp_src/truncated_normal/truncated_normal.html is used. This is reflected by truncated_normal.cpp and truncated_normal.h, and is the only dependency other than the standard C++ library.

The included CMAKE file could be helpful to compile the program.

Setting parameters

Values for N, r and L can be set as indicated in the main() function.

Parsing output

Output of the program can be printed to the console or be written to files, as controlled by in the main() function. The output files can be parsed by using the included Jupyter notebook visualize_results.ipynb to visualize the results.

Visualization of Results

L=200, r=2, N=1000


L=200, r=2, N=1000 (run 1)

L=200, r=2, N=1000 (run 2)

L=8, r=1, N=10


L=8, r=1, N=10 (run 1)

L=8, r=1, N=10 (run 2)

L=8, r=1, N=16


drone-placement's People

Contributors

samurdhilbk avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.