**Initialization:** generate an initial solution , set and ; |

** While a stopping time condition is not met and **** , do** |

1. initialize the value of the best move: set ; |

2. generate the best move: for each non assigned variable and each value , test move on as follows: |

(a) * assignment phase:* give value to variable and compute the associated set of conflicting variables; |

(b) * reassignment phase (optional):* for each variable of , if it is possible to assign another admissible value to |

without augmenting the number of violations, do it and remove from ; |

(c) let be the so obtained candidate neighbor solution (which might be non feasible at this stage); |

(d) update the best candidate move: if , set and ; |

3. * repairing phase on the best move:* remove the value of the conflicting variables of and let be the |

resulting new current solution; |

4. update the record: if , set and |

**Output**: solution (which is a complete feasible solution if ); |