package edu.hawaii.ics.yucheng;
/**
* A class that creates random graphs.
*/
class GraphRandomizer {
/** The maximum possible battery consumption value. */
private static final int MAX_CONSUMPTION = 99;
/** The maximum possible height. */
private static final int MAX_HEIGHT = 9;
/** The maximum possible priority value. */
private static final int MAX_PRIORITY = 99;
/** The maximum possible width. */
private static final int MAX_WIDTH = 9;
/** The minimum possible battery consumption value. */
private static final int MIN_CONSUMPTION = 1;
/** The minimum possible height. */
private static final int MIN_HEIGHT = 1;
/** The minimum possible priority value. */
private static final int MIN_PRIORITY = 1;
/** The minimum possible width. */
private static final int MIN_WIDTH = 1;
/**
* Initializes a vertex in the graph.
*
* @param i The horizontal coordinate.
*
* @param j The vertical coordinate.
*
* @param builder The graph builder.
*
* @return The consumption value for the vertex.
*/
private static int initCell(final int i, final int j,
final GraphBuilder builder) {
assert null != builder;
if (builder.base().equals(i, j))
return 0;
if (random(0, 9) == 0) {
builder.setObstacle(i, j, true);
return 0;
}
final int priority = random(MIN_PRIORITY, MAX_PRIORITY);
final int consumption = random(MIN_CONSUMPTION, MAX_CONSUMPTION);
builder.setPriority(i, j, priority);
builder.setConsumption(i, j, consumption);
return builder.consumption(i, j);
}
/**
* Creates and returns a new random graph.
*
* @return A new random graph.
*/
public static Graph newGraph() {
// Create the random size.
final int width = random(MIN_WIDTH, MAX_WIDTH);
final int height = random(MIN_HEIGHT, MAX_HEIGHT);
final GraphBuilder builder = new GraphBuilder(width, height);
// Randomly select the base.
final int x = random(0, width - 1);
final int y = random(0, height - 1);
builder.setBase(x, y);
// Loop over each vertex and randomly create the attributes.
int sum = 0;
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
sum += initCell(i, j, builder);
// Set the capacity based on 0 - 100% of the sum of the capacities.
builder.setCapacity(sum * random(0, 100) / 100);
builder.setPriority(x, y, 0);
builder.setConsumption(x, y, 0);
// Return the new graph.
return builder.toGraph();
}
/**
* Returns a random number between a minimum and maximum value.
*
* @param min The minimum value.
*
* @param max The maximum value.
*
* @return A random number between a minimum and maximum value (inclusive).
*/
private static int random(final int min, final int max) {
return (int) (Math.random() * (1 + max - min) + min);
}
}