Как я должен Протестировать Генетический алгоритм

$img_file='http://www.somedomain.com/someimage.jpg'

$img_file=file_get_contents($img_file);

$file_loc=[110]SERVER['DOCUMENT_ROOT'].'/some_dir/test.jpg';

$file_handler=fopen($file_loc,'w');

if(fwrite($file_handler,$img_file)==false){
    echo 'error';
}

fclose($file_handler);
53
задан Jon Seigel 16 May 2010 в 17:07
поделиться

8 ответов

Вы можете написать избыточную нейронную сеть для анализа результатов вашего алгоритма и ранжирования выходных данных на основе ожидаемых результатов. :)

Разбейте свой метод настолько, насколько сможете. Затем вы также можете провести модульный тест только для случайной части, чтобы проверить диапазон значений. Даже проведите тестовый запуск несколько раз, чтобы увидеть, изменится ли результат.

n + 1 итераций, чтобы доказать, что он будет давать правильные результаты (независимо от детерминизма данных) для заданного входного диапазона / домена и ограничений на возможные значения во входных данных.

Изменить Я нашел эту стратегию для тестирования недетерминированные системы , которые могут дать некоторое понимание. Это может быть полезно для статистического анализа живых результатов, когда процесс TDD / разработки докажет, что логика верна.

14
ответ дан 7 November 2019 в 08:54
поделиться

Если вы говорите о TDD, я бы сказал, что определенно начните с выбора постоянного числа и расширения набора тестов оттуда. Я выполнил TDD для нескольких математических задач, и это помогает иметь несколько постоянных случаев, которые вы знаете и проработали вручную, чтобы работать с ними с самого начала.

W / R / T ваша 4-я точка, перемещение недетерминированного кода я думаю, что это, вероятно, подход, который стоит рассмотреть. Если вы можете разложить алгоритм и разделить недетерминированные проблемы, это должно упростить тестирование детерминированных частей. Пока вы осторожны в том, как называете вещи, я не думаю, что вы многим здесь жертвуете. Если я вас не неправильно понимаю, GA все равно будет делегировать этот код, но он живет где-то еще.

Что касается ссылок на очень хорошие книги по тестированию (для разработчиков), мне больше всего нравятся:

2
ответ дан 7 November 2019 в 08:54
поделиться

Я бы тестировал случайные функции, проверяя их несколько раз и анализируя, соответствует ли распределение возвращаемых значений статистическим ожиданиям (это требует некоторых статистических знаний).

4
ответ дан 7 November 2019 в 08:54
поделиться

Все ваши функции должны быть полностью детерминированными. Это означает, что ни одна из тестируемых функций не должна генерировать случайное число внутри самой функции. Вы захотите передать это как параметр. Таким образом, когда ваша программа принимает решения на основе ваших случайных чисел, вы можете передать репрезентативные числа, чтобы проверить ожидаемый результат для этого числа. Единственное, что не должно быть детерминированным, - это ваш фактический генератор случайных чисел, о котором вам действительно не нужно слишком беспокоиться, потому что вы не должны писать это сами. Вы должны иметь возможность просто предположить, что он работает, пока это установленная библиотека.

Это для ваших модульных тестов. Для ваших интеграционных тестов, если вы это делаете, вы можете изучить имитацию генерации случайных чисел, заменив его алгоритмом, который будет возвращать известные числа от 0 до n для каждого случайного числа, которое вам нужно сгенерировать.

1
ответ дан 7 November 2019 в 08:54
поделиться

Проверка того, что алгоритм дает одинаковый результат для тех же входных данных, может помочь вам, но иногда вы вносите изменения, которые изменяют поведение алгоритма выбора результатов.

Я бы приложил все усилия, чтобы получить тест, который гарантирует, что алгоритм дает правильный результат. Если алгоритм дает правильный результат для ряда статических начальных чисел и случайных значений, алгоритм работает или не нарушается в результате внесенных изменений.

Еще один шанс в TDD - это возможность оценить алгоритм. Если вы можете автоматически проверять, насколько хорош результат, вы можете добавить тесты, которые покажут, что изменение не привело к снижению качества ваших результатов или необоснованному увеличению времени расчета.

0
ответ дан 7 November 2019 в 08:54
поделиться

Я написал дидактическое приложение C # TDD Genetic Algorithm: http://code.google.com/p/evo-lisa-clone/

Давайте возьмем самый простой метод случайного результата в приложении: PointGenetics.Create, который создает случайную точку с заданными границами. Для этого метода я использовал 5 тестов, и ни один из них не зависит от конкретного начального числа:

http://code.google.com/p/evo-lisa-clone/source/browse/trunk/EvoLisaClone/EvoLisaCloneTest/PointGeneticsTest .cs

Тест на случайность прост: для большой границы (много возможностей) две последовательные сгенерированные точки не должны быть равными. Остальные тесты проверяют другие ограничения.

1
ответ дан 7 November 2019 в 08:54
поделиться

Компилятор должен уметь распознавать, что BigFoo не может быть преобразовано в IEnumerable , но это не так. Он просто видит, что это IEnumerable , и чувствует, что это потенциальный кандидат на перегрузку (даже несмотря на то, что ограничение, которое вы определили, заставляет T быть IFoo и int нельзя преобразовать в IFoo ). Хотя это неудобно, но это не так уж и важно. Просто приведите bigFoo к IFoo , и компилятор будет доволен:

fooContainer.Add((IFoo)bigFoo);

В качестве альтернативы вы можете сделать свою общую перегрузку Add uglier:

public void Add<T, U>(U group)
    where T : IFoo
    where U : IEnumerable<T>
{
}

В любом случае, у вас больше ввода, второе решение устраняет необходимость для звонков на Добавить , Затем вы также можете провести модульный тест только для случайной части, чтобы проверить диапазон значений. Даже проведите тестовый запуск несколько раз, чтобы увидеть, изменится ли результат.

1
ответ дан 7 November 2019 в 08:54
поделиться

Я настоятельно рекомендую изучить использование фиктивных объектов для ваших модульных тестов ( http://en.wikipedia.org/wiki/Mock_object ). Вы можете использовать их для имитации объектов, которые делают случайные предположения, чтобы вместо этого вы могли получить ожидаемые результаты.

0
ответ дан 7 November 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: