48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
import numpy as np
|
|
|
|
from . import pb
|
|
|
|
########################################################################
|
|
# Objective functions
|
|
########################################################################
|
|
|
|
# Decoupled from objective functions, so as to be used in display.
|
|
def to_sensors(sol):
|
|
"""Convert a vector of n*2 dimension to an array of n 2-tuples.
|
|
|
|
>>> to_sensors([0,1,2,3])
|
|
[(0, 1), (2, 3)]
|
|
"""
|
|
sensors = []
|
|
for i in range(0,len(sol),2):
|
|
sensors.append( ( int(round(sol[i])), int(round(sol[i+1])) ) )
|
|
return sensors
|
|
|
|
|
|
def cover_sum(sol, domain_width, sensor_range):
|
|
"""Compute the coverage quality of the given vector."""
|
|
domain = np.zeros((domain_width,domain_width))
|
|
sensors = to_sensors(sol)
|
|
return np.sum(pb.coverage(domain, sensors, sensor_range))
|
|
|
|
|
|
########################################################################
|
|
# Initialization
|
|
########################################################################
|
|
|
|
def rand(dim, scale):
|
|
"""Draw a random vector in [0,scale]**dim."""
|
|
return np.random.random(dim) * scale
|
|
|
|
|
|
########################################################################
|
|
# Neighborhood
|
|
########################################################################
|
|
|
|
def neighb_square(sol, scale):
|
|
"""Draw a random vector in a square of witdh `scale`
|
|
around the given one."""
|
|
# TODO handle constraints
|
|
new = sol + (np.random.random(len(sol)) * scale - scale/2)
|
|
return new
|
|
|