1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
|
1 | |
Мозгоштурм или нужна идея :)21.07.2009, 12:46. Показов 3631. Ответов 39
Метки нет (Все метки)
Друзья, нужна идея по одной программульке.
Задача состоит в следующем: Работаю с булевыми функциями 5-ти, 6-ти, 7-ми и т.д. переменных, т.е. представляет собой двоичный набор длины 32, 64, 128 и т.д. соответственно. Например, функция 5-ти переменных может быть представлена набором из 32 бит (0101 1110 0001 0110 0100 0000 1000 1111) Над этими наборами выполняются различные функции и проще всего их хранить как бинарный массив. Все было бы хорошо, если б не нужно было вычислять так называемую сложность этих самых функций. По сути сводится к вычислению сложности функции 5-ти переменных, т.е. 32 бита, но для вычисления этой сложности нужно обращаться к специальной библиотеке (читай - массиву) и передавать функции уже не двоичный этот вектор, а значение формата unsigned int. Теперь кратко и по пунктам: 1) необходимо хранить булевые (двоичные) наборы длины 32, 64, 128 и т.д. бит, мне проще всего работать с каждым как с массивом 2) набор длины 32 нужно каким-то образом быстро переводить в unsigned int В связи с вышесказанным вопрос - как лучше хранить эти двоичные вектора и перегонять их в unsigned int?
0
|
21.07.2009, 12:46 | |
Ответы с готовыми решениями:
39
Нужна идея для проекта Нужна идея или хотя бы пример (задание по теории автоматов) Какую 2D игру или приложение мне написать под Android? Нужна идея которая ещё не реализована. Заранее благодарен Нужна идея |
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
21.07.2009, 13:13 | 2 |
std::bitset, boost::dynamic_bitset смотрел?
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
||||||
21.07.2009, 13:24 | 3 | |||||
Покажи свой код, где ты ты определяешь набор длины 32-бита, набор 64-бита.
Как именно он хранится ? А что именно ты хочешь - чтобы быстро работало ? Тогда покажи какие именно операции ты делаешь со своими наборами. Может можно работать с битами не переводя 32-битное число в массив. Я бы хранил набор как указатель, если нет противопоказаний.
0
|
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
|
|
21.07.2009, 13:36 | 4 |
Molotoff, вот так вот и хранить. Перегонять либо из двоичного массива в десятичную систему) либо из десятичного числа перегонять в двоичный массив.
пишется не сложная функция по переводу. я бы перегонял двоичный массив в дестичное число (unsigned int)
0
|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
|
21.07.2009, 15:04 [ТС] | 5 |
Я реализую генетический алгоритм. Здесь кратко про этот алгоритм.
Так вот по условию задачи особи у меня кодируются 32, 64, 128 и т.д. битными векторами. Сначала я реализовывал для вектора длины 32 как unsigned int. При использовании генетических операторов - скрещивания, мутации и т.д., я переводил из unsigned int в булевый массив (с помощью побитовых операций), производил необходимые действия и обратно переводил в int, после чего вновь полученную особь проверя по специальной библиотеке (читай массиву) ее уровень приспособленности. В дальнейшем при работе с 64, 128 битными особями, надо выполнять очень много итераций и этот метод не очень эффективен. Вот меня и интересует вопрос, можно ли, имея 32-х элементный массив или вектор или битсет, быстро перегнать его в unsigned int. В литературе такого не нашел.
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
||||||
21.07.2009, 15:14 | 6 | |||||
Знаю что такое генетический алгоритм.
Разделим задачу на две части. (1) Как быстро перегнать массив в unsigned int. (2) Попробовать сделать все операции (скрещивание,мутации) прямо с uint32 *pset; Я не очень понял как именно ты считаешь уровень приспособленности ? Насчет (1). Например так:
0
|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
|
21.07.2009, 15:16 [ТС] | 7 |
Уровень приспособленности смотрю по заранее созданному массиву, т.е. сама особь есть число в unsigned int, это же по сути номер порядковый, по которому уже и лезу в массив за функцией приспособленности этой особи
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
||||||
21.07.2009, 15:21 | 8 | |||||
Насчет (2).
Например мутация одного элемента - это просто инвентирование бита в массиве.
Найди максимум в этом массиве приспособленности - вот тебе оптимальная особь.
0
|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
|
21.07.2009, 15:27 [ТС] | 9 |
нет, тут немного сложнее ситуация )))))
я реализовывал этот алгоритм для булевых функций 6-ти переменных, т.е. длинной 64 бита, они в свою очередь разбиваются на 2 по 5, и нужно найти с помощью генетического алгоритма такую функцию 5-ти переменных, которая бы минимизировала этот показатель, учитывая заранее заданные эти 2 части и самую себя То, что ты описал выше - это все замечательно, но тот же кроссовер мне кажется не так просто уже будет реализовывать при векторах длины 64 или 128
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
21.07.2009, 15:31 | 10 |
Еще и работать будет быстрее, чем на массиве - так как за одну операцию можно перенести до 32-ух элементов. Если избавиться от конвертирования из массива в uint32 *pset - это тоже даст прирост. Кстати может стандартные библиотеки для этого уже есть: std::bitset, boost::dynamic_bitset. Тогда и писать ничего не придется
0
|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
|
21.07.2009, 16:46 [ТС] | 11 |
Вот так выглядит одноточечный кроссовер. Если у меня особь занимает например 128 бит, значит она представляет собой массив 4-х переменных по 32 бита, соответственно надо каким-то образом разрывать эти особи и получать новые.
Далее, оператор инверсии - например, имеется вектор 110010100011 инвертируем выделенную часть, должно получиться 110010001011, если разбито на 4 переменные, то реализовать такие функции сложнее, чем с массивом
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
||||||
22.07.2009, 01:13 | 12 | |||||
Положу пока сюда кусок кода
Вообще из биологии я думал что кроссовер немного более сложный процесс, твой вариант проще. Как ты догадался это для 128-битных чисел. Осталось 4 однотипных куска дописать
0
|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
|
22.07.2009, 06:22 [ТС] | 13 |
твою идею понял, но там несколько сложнее - разрыв по хромосомам может произойти не только по элементам как у тебя, но и где-нибудь посередине одного из элементов массива. Тут уже надо генерировать маски и рвать по маскам.
Как быстро получить такую маску? А по поводу кроссовера - это простой или одноточечный кроссовер, их есть еще несколько вариантов.
0
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
||||||
22.07.2009, 07:16 | 14 | |||||
например так:
битные сдвиги и инкременты работают очень быстро.
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
22.07.2009, 10:30 | 15 |
2Molotoff: Да понял я, я просто не дописал
Добавлено через 3 минуты 4 секунды Маску быстро получить двумя способами - по заранее заданном массиву или с помощью только одной операции '<<'. Какой из этих двух способов будет быстрее - это нужно тестировать программу. Способ предложенный Patch плохой, так как там цикл, а это уже будет медленнее.
0
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|
22.07.2009, 10:36 | 16 |
а другого для битного поля нет. либо делать так, либо ассемблерной вставкой. а вот по одному биту - можно и одной операцией. но маски-массивы, кстати, все равно делать нужно, иначе медленно будет.
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|||||||||||
22.07.2009, 14:38 | 17 | ||||||||||
Где ты увидел битовые поля ?
А - ты наверное unsigned int обозвал битовым полем Операция сдвига на N в коде выполняется одной командой за один такт.
Получилось даже проще чем ожидал.
0
|
7 / 7 / 1
Регистрация: 22.07.2009
Сообщений: 104
|
|
22.07.2009, 15:23 | 18 |
Сообщение от odip
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
22.07.2009, 15:25 | 19 |
Ну да - конечно Pentium II, ты еще 486-ые вспомни
Ты прав конечно, но суть в том, что для сдвига на 31 бит не нужно крутить цикл 31 раз. И цикл будет во много раз медленнее. И потом я уже все сделал через массивы.
0
|
7 / 7 / 1
Регистрация: 22.07.2009
Сообщений: 104
|
|
22.07.2009, 15:26 | 20 |
В этом плане я и не пытался с тобой спорить
0
|
22.07.2009, 15:26 | |
22.07.2009, 15:26 | |
Помогаю со студенческими работами здесь
20
Нужна идея Нужна идея! Нужна идея... Нужна идея Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |