Autonomic Performance Optimization with Application to Self-Architecting Software Systems