Improving reliability of embedded systems through dynamic memory manager optimization using grammatical evolution