How to give to the users the opportunity to change role as desired
You can do this with rules. 

Event: After saving user profile
Conditonal: field has value
Action: Assign role to user


Something long these lines. You will need to create a new rule for each role unless you do some special field-value handling. You will also need to create a few checks in here to prevent the rule from re-assigning a role to a user.