Насколько я понимаю, плохо – это когда разница между минимумом и максимумом очень большая, хорошо – когда эта разница маленькая (по крайней мере на конце графика). Также имеет значение гладкость.
Я вижу здесь два варианта решения:
1. Описательный.
Вы сами формулируете критерии "хорошести", и находите способ её измерения. То есть нужна функция L: "множество функций" -> [0, 1], и если L(f) = 1, то график f хороший, если L(f) = 0, то график f плохой.
2. Машинное обучение.
Здесь вам всё равно нужно описать какие-то критерии функции, и для каждой функции соорудить вектор-признак. Например, вектор-признак может содержать информацию (значение максимума; значение минимума; разность между макс и мин; какой-то показатель гладкости (может быть вычислить производную в каждой точке, и смотреть чтобы производная менялась не сильно); площадь подграфика и т.п.).
Затем, собираете выборку графиков, для них получаете выборку векторов-признаков, и дальше можете использовать алгоритмы классификации: логистическая регрессия, нейронные сети, SVM и т.п. Успех данного подхода зависит от того, насколько хорошо придуманный вами вектор-признак будет описывать ваши же критерии.
Результатом будет та же функция L: "множество функций" -> [0, 1], только, возможно, вы не сможете осмыслить её работу (не будет словестного критерия, как в п.1), но она также будет выдавать на выход является функция хорошей или плохой.