There's a fairly simple solution really... 20% of the public smokes. The cruise lines could take 20% of their inventory and designate them smoking allowed.. and place them all on the aft portion of the ship. That way the smoke would head aft when the ship is underway, and only smokers in those aft cabins would be affected.
Those who want to chose an aft cabin would do so knowing they are booking into a smoking area. The remainder of the ship's interiors would then be designated smoke free, except perhaps one lounge.
Of course there would still be some complaining they've lost the right to book an aft cabin, but then they'd most likely be people who are only happy if they always get exactly what they want out of everything in life