C ++ Укрепление обучения и умные указатели - PullRequest
6 голосов
/ 07 июля 2011

Я выполняю магистерский проект по сенсомоторному онлайн-обучению роботов с использованием методов обучения с подкреплением (Q, сарса, TD (λ), критик-актер, R и т. Д.). В настоящее время я разрабатываю среду, в которой будет использоваться обучение с подкреплением более высокого уровня и управление API-интерфейсом робота более низкого уровня.

Поскольку состояния зависят от датчика робота и могут (будут) увеличиваться в геометрической прогрессии, я буду размещать их в куче. Так как это может создать множество проблем, ошибок и т. Д., И поскольку распараллеливание (то есть многопоточность) является аспектом обучения с подкреплением, которое я хочу исследовать, я пока не уверен, какие умные указатели использовать.

Разработка моего собственного шаблона / класса для умного указателя потребует времени и отладки, которых у меня нет. Итак, мне интересно, я должен использовать STL auto_ptr? Я вижу, у них есть проблемы, используемые в векторах. Должен ли я использовать boost::shared_ptr? Состояния должны быть разделены между многими классами и алгоритмами. Или я должен использовать boost::ptr_vector? Поскольку состояния будут находиться в классе контейнера задач в векторе, будет ли этого достаточно? Состояния должны быть общими, копируемыми, ссылочными, сериализуемыми, непостоянными, поточно-ориентированными и не будут удалены. Также важно пространство памяти и время вычислений.

Что вы посоветуете как лучшая интеллектуальная реализация ptr для такой задачи?

Спасибо!


Похоже, мне придется попытаться использовать boost :: ptr_vector с классом State, и если это окажется неэффективным, используйте std :: vector и включите 0X. Спасибо всем за ваши ответы и предложения!

Ответы [ 3 ]

4 голосов
/ 07 июля 2011

Указатели на единоличное владение труднее злоупотреблять, по модулю std::auto_ptr.Вы можете рассмотреть возможность использования boost::scoped_ptr, который еще безопаснее (хотя он не может передать право собственности и не может быть возвращен из функции).Когда дело доходит до контейнеров, вы могли бы использовать контейнер указателя, но также можно использовать, например, std::vector без интеллектуальных указателей, если соответствующие типы не используются полиморфно.

Общее владение должнооставаться в исключительном случае;не злоупотребляйте boost::shared_ptr.

1 голос
/ 07 июля 2011

Я никогда не находил умный класс ptr, который мне нравился, когда я занимался с ++. Я написал свой собственный в конце.

У него была функция кеша для скорости, так что вы продолжали выделять и освобождать память, она могла просто висеть в памяти и использовать ее повторно. Кроме того, у него не было конструктора по умолчанию, поэтому вы должны были передавать его функциям / методам по ссылке, иначе компилятор мог бы показать ошибку, так как он не создавал временную копию памяти, особенно при работе с большими файлами изображений.

Написание собственного кода не займет много времени, и вы также можете добавить к нему свой собственный код проверки границ.

1 голос
/ 07 июля 2011

Другие предложения пропущены.boost::intrusive_ptr работает лучше, чем shared_ptr, потому что ему не нужно второе выделение для хранения счетчика ссылок.Недостатком intrusive_ptr является небольшая дополнительная бухгалтерия и отсутствие возможности использовать weak_ptr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...