|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
|
Мозгоштурм или нужна идея :)21.07.2009, 12:46. Показов 3839. Ответов 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
Нужна идея для проекта
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
| 21.07.2009, 13:13 | |
|
std::bitset, boost::dynamic_bitset смотрел?
0
|
|
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
||||||
| 21.07.2009, 13:24 | ||||||
|
Покажи свой код, где ты ты определяешь набор длины 32-бита, набор 64-бита.
Как именно он хранится ? А что именно ты хочешь - чтобы быстро работало ? Тогда покажи какие именно операции ты делаешь со своими наборами. Может можно работать с битами не переводя 32-битное число в массив. Я бы хранил набор как указатель, если нет противопоказаний.
0
|
||||||
|
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
|
|
| 21.07.2009, 13:36 | |
|
Molotoff, вот так вот и хранить. Перегонять либо из двоичного массива в десятичную систему) либо из десятичного числа перегонять в двоичный массив.
![]() пишется не сложная функция по переводу. я бы перегонял двоичный массив в дестичное число (unsigned int)
0
|
|
|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
||
| 21.07.2009, 15:04 [ТС] | ||
|
Так вот по условию задачи особи у меня кодируются 32, 64, 128 и т.д. битными векторами. Сначала я реализовывал для вектора длины 32 как unsigned int. При использовании генетических операторов - скрещивания, мутации и т.д., я переводил из unsigned int в булевый массив (с помощью побитовых операций), производил необходимые действия и обратно переводил в int, после чего вновь полученную особь проверя по специальной библиотеке (читай массиву) ее уровень приспособленности. В дальнейшем при работе с 64, 128 битными особями, надо выполнять очень много итераций и этот метод не очень эффективен. Вот меня и интересует вопрос, можно ли, имея 32-х элементный массив или вектор или битсет, быстро перегнать его в unsigned int. В литературе такого не нашел.
0
|
||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
||||||
| 21.07.2009, 15:14 | ||||||
|
Знаю что такое генетический алгоритм.
Разделим задачу на две части. (1) Как быстро перегнать массив в unsigned int. (2) Попробовать сделать все операции (скрещивание,мутации) прямо с uint32 *pset; Я не очень понял как именно ты считаешь уровень приспособленности ? Насчет (1). Например так:
0
|
||||||
|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
||
| 21.07.2009, 15:16 [ТС] | ||
|
0
|
||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|||||||
| 21.07.2009, 15:21 | |||||||
|
Насчет (2).
Например мутация одного элемента - это просто инвентирование бита в массиве.
![]() Найди максимум в этом массиве приспособленности - вот тебе оптимальная особь.
0
|
|||||||
|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
||
| 21.07.2009, 15:27 [ТС] | ||
)))))я реализовывал этот алгоритм для булевых функций 6-ти переменных, т.е. длинной 64 бита, они в свою очередь разбиваются на 2 по 5, и нужно найти с помощью генетического алгоритма такую функцию 5-ти переменных, которая бы минимизировала этот показатель, учитывая заранее заданные эти 2 части и самую себя ![]() То, что ты описал выше - это все замечательно, но тот же кроссовер мне кажется не так просто уже будет реализовывать при векторах длины 64 или 128
0
|
||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
||
| 21.07.2009, 15:31 | ||
Еще и работать будет быстрее, чем на массиве - так как за одну операцию можно перенести до 32-ух элементов. Если избавиться от конвертирования из массива в uint32 *pset - это тоже даст прирост. Кстати может стандартные библиотеки для этого уже есть: std::bitset, boost::dynamic_bitset. Тогда и писать ничего не придется
0
|
||
|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
|
| 21.07.2009, 16:46 [ТС] | |
|
Вот так выглядит одноточечный кроссовер. Если у меня особь занимает например 128 бит, значит она представляет собой массив 4-х переменных по 32 бита, соответственно надо каким-то образом разрывать эти особи и получать новые.
Далее, оператор инверсии - например, имеется вектор 110010100011 инвертируем выделенную часть, должно получиться 110010001011, если разбито на 4 переменные, то реализовать такие функции сложнее, чем с массивом
0
|
|
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
||||||
| 22.07.2009, 01:13 | ||||||
|
Положу пока сюда кусок кода
![]()
Вообще из биологии я думал что кроссовер немного более сложный процесс, твой вариант проще. Как ты догадался это для 128-битных чисел. Осталось 4 однотипных куска дописать
0
|
||||||
|
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
|
|
| 22.07.2009, 06:22 [ТС] | |
|
твою идею понял, но там несколько сложнее - разрыв по хромосомам может произойти не только по элементам как у тебя, но и где-нибудь посередине одного из элементов массива. Тут уже надо генерировать маски и рвать по маскам.
Как быстро получить такую маску? А по поводу кроссовера - это простой или одноточечный кроссовер, их есть еще несколько вариантов.
0
|
|
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
|||||||
| 22.07.2009, 07:16 | |||||||
битные сдвиги и инкременты работают очень быстро.
0
|
|||||||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
| 22.07.2009, 10:30 | |
|
2Molotoff: Да понял я, я просто не дописал
![]() Добавлено через 3 минуты 4 секунды Маску быстро получить двумя способами - по заранее заданном массиву или с помощью только одной операции '<<'. Какой из этих двух способов будет быстрее - это нужно тестировать программу. Способ предложенный Patch плохой, так как там цикл, а это уже будет медленнее.
0
|
|
|
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
|
||
| 22.07.2009, 10:36 | ||
а другого для битного поля нет. либо делать так, либо ассемблерной вставкой. а вот по одному биту - можно и одной операцией. но маски-массивы, кстати, все равно делать нужно, иначе медленно будет.
0
|
||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|||||||||||
| 22.07.2009, 14:38 | |||||||||||
|
Где ты увидел битовые поля ?
А - ты наверное unsigned int обозвал битовым полем ![]() Операция сдвига на N в коде выполняется одной командой за один такт.
Получилось даже проще чем ожидал.
0
|
|||||||||||
|
7 / 7 / 1
Регистрация: 22.07.2009
Сообщений: 104
|
||
| 22.07.2009, 15:23 | ||
0
|
||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
| 22.07.2009, 15:25 | |
|
Ну да - конечно Pentium II, ты еще 486-ые вспомни
![]() Ты прав конечно, но суть в том, что для сдвига на 31 бит не нужно крутить цикл 31 раз. И цикл будет во много раз медленнее. И потом я уже все сделал через массивы.
0
|
|
|
7 / 7 / 1
Регистрация: 22.07.2009
Сообщений: 104
|
|
| 22.07.2009, 15:26 | |
|
В этом плане я и не пытался с тобой спорить
0
|
|
| 22.07.2009, 15:26 | |
|
Помогаю со студенческими работами здесь
20
Нужна идея
Нужна идея! Нужна идея... Нужна идея Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|