def generate_neighbour
      n = 0
      begin
        if n >= 100
          # taking too long to generate a neighbour,
          # loosen the neighbourhood structure so we explore further
          # debug("loosening distributions")
          @distributions.each do |param, dist|
            dist.loosen
          end
        end
        # preform the probabilistic step move for each parameter
        neighbour = Hash[@distributions.map { |param, dist| [param, dist.draw] }]
        n += 1
      end while self.is_tabu?(neighbour)
      @tabu << neighbour
      @members << neighbour
    end
def generate_neighbour
      n = 0
      begin
        if n >= 100
          # taking too long to generate a neighbour,
          # loosen the neighbourhood structure so we explore further
          # debug("loosening distributions")
          @distributions.each do |param, dist|
            dist.loosen
          end
        end
        # preform the probabilistic step move for each parameter
        neighbour = Hash[@distributions.map { |param, dist| [param, dist.draw] }]
        n += 1
      end while self.is_tabu?(neighbour)
      @tabu << neighbour
      @members << neighbour
    end
generate a single neighbour