Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Эволюция в виртуальной машине

Автор: UncoNNecteD
Дата сообщения: 21.04.2004 16:04
Вы ушли в дебри. Ничего продуктивного у вас не выйдет так.
ArtSh
Против твоих идей один простой пример - надо определить кто находится рядом с неким существом - если мы берем матричную систему - все просто, делаем +1 -1 к координатам ячейки и смотрим кто в ней находится. Если же ячеек нет и координата - вещественное число - чтобы определить например какие существа в радиусе R надо будет перебрать всех и посчитать квадрат расстояния по векторам с вещесвенными числами. Нужен будет суперкомпьютер - точно говорю. И это самый простой пример.
Автор: Crazy_Shrike
Дата сообщения: 21.04.2004 17:32
Во-во.

Добавлено
Делается проход по массиву существ и каждый сам осматривается - получет информацию о тех ячеек, которые ему нужны.
Автор: UncoNNecteD
Дата сообщения: 22.04.2004 14:08
Давайте лучше добавлять и прорабатывать свойства и методы твари и ячейки.
Автор: Crazy_Shrike
Дата сообщения: 22.04.2004 15:26
Давайте. Мой клас:
Хромосома:
- отведенное твари время жизни;
- масса;
- энергия;
- пол;
- либидо (то бишь радиус видимости партнера);
- ген, отвечающий за принадлежность твари обычной расе или расе хищников;
- радиус обзора (сколько клеток может видеть, т.е. получать информацию о них);

Координаты: х,у;
Возраст.

Методы...
- методы для возвращения десятичных значений всех параметров, заложенных в гене,
- методы для прибавления и отнимания единицы к тем же параметрам. (Решил, что параметры могут меняться только с шагом 1);
- метод случайного шага (сам не знаю зачем);
- метод, собирающий информацию о клетках, анализирующий ее и принимающий решение сделать шаг в определенном направлении, для чего есть
- 8 методов - напрвлений шага.

- ну и два приватных метода, делающих десятичную интерпритацию генов и записывающего десятичную информацию в гены.

У меня, например, пока псё.
Автор: ArtSh
Дата сообщения: 22.04.2004 15:44

Цитата:
если мы берем матричную систему - все просто, делаем +1 -1 к координатам ячейки и смотрим кто в ней находится


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

А объекты можно хранить и в сортированном виде, и использовать скоростные алгоритмы сортировки и поиска.

И на счет суперкомпьютеров. При вставке 1000000 объектов типа int у меня ушло 5сек. (Athlon2500+, nForce2Ultra400, DDR700MB )
Автор: Crazy_Shrike
Дата сообщения: 22.04.2004 16:58
Чтобы изменить свойство у всех объектов, придется перебирать все клетки?

Зачем, если цикл идет по объектам... не понимаю... да и зачем у всех объектов менять свойства...? И зачем его сортировать и по какому параметру? Вапще не понимаю.

А про вставку объектов... Куда вставляли-то?

Извиняюсь, если я не понимаю чего-то очевидного... но объясните, пожалуйста.
Автор: UncoNNecteD
Дата сообщения: 22.04.2004 19:17
ArtSh
Ты где то далеко от нас

Цитата:
чтобы изменить к-л свойство у всех объектов придется перебирать все клетки

Во первых есссно перебирать надо не все клетки, а все объекты по индексу массива (списка).


Цитата:
И на счет суперкомпьютеров. При вставке 1000000 объектов типа int у меня ушло 5сек. (Athlon2500+, nForce2Ultra400, DDR700MB )

Куда и зачем ты их вставлял ? Ты попробуй сгенери хотя бы 1000 объектов с случайными координатами типа real и расчитав расстояние от одного объекта до всех остальных определи какие объекты находятся в радиусе досигаемости Rd.


Crazy_Shrike

Цитата:
Хромосома:
- отведенное твари время жизни;
- масса;
- энергия;
- пол;
- либидо (то бишь радиус видимости партнера);
- ген, отвечающий за принадлежность твари обычной расе или расе хищников;
- радиус обзора (сколько клеток может видеть, т.е. получать информацию о них);

Координаты: х,у;
Возраст.


1)Во первых, время жизни ДОЛЖНО зависить от условий обитания. В генах заложено только максимальное время жизни от которого каждый тик должна отниматся некая дельта зависящая от того насколько сыто, одето, обуто существо (фигурально конечно )
2)Во вторых, масса я так понимаю тоже начальная ? Или существо не растет при жизни ? - Значит надо добавить массу в свойства помимо хромосомы.
3)То же самое о энергии.
4)С полом понятнее
5) Либидо - тоже должно имется в свойствах отдельно, так как тоже зависит от здоровья существа.

Пока все, подумай пока об этом.



Добавлено
И еще, предлагаю всю информацию нужную в процессах обсчета дублировать вне хромосомы, дабы не забирать время на дешифровку, а хромосому оставить только для скрещивания.
Автор: Crazy_Shrike
Дата сообщения: 23.04.2004 13:13
Масса и энергия, да, естественно, начальная.
Время жизни может меняться, так что с этим проблем нет.
Про дублирование... По-моему, блесятщая идея!

Давайте обсуждать алгоритмы расчетов, например, комфортности, которая влияет на время жизни...
Автор: UncoNNecteD
Дата сообщения: 23.04.2004 15:08
Давай пока что опишем объект твари, с учетом дублирования и изменяющихся параметров. Обдумаем окончательно/утвердим.
Перепиши пожалуйста свой объект с учетом этого.

И еще хотелось бы узнать мысли о скрещивании хромосом.
Автор: beeos
Дата сообщения: 23.04.2004 15:37
Секундочку. Соображение насчет начальной массы, времени жизни etc.
Предлагаю хранить в хромосоме не начальные значения, а модификаторы, эмулирующие генетическую предрасположенность. Я уже как-то упоминал об этом, но было несколько сыровато...
Живой пример: среднее время жизни существа положим в 1000 тактов. Вводим в хромосому модификатор жизнеспособности. Имеем существо с жизнеспособностью 0.7 и существо с жизнеспособностью 0.8, живущие в нормальных условиях 700 и 800 тактов соответственно. На первый взгляд принципиальных различий нет, но модификаторы позволяют рассчитывать параметры более гибко, т.е. при глобальном катаклизме среднее время жизни уменьшается до 900 тактов, и пропорционально меняется время жизни существ. Точнее, даже правильнее было бы рассчитывать не полное время жизни, а остаток, но это уже подробности технической реализации.
Другие параметры рассчитываются аналогично.
Конечно, на ресурсы придется разориться, но тем больше поводов придумать красивые оптимизированные алгоритмы..
Автор: Crazy_Shrike
Дата сообщения: 23.04.2004 17:23
2 unconnected

Хорошо, поработаю. Тут надо вспомнить перегрузку функций.
Представлю в понедельник.

Скрещнивание... Тут есть несколько методов. Самый часто используемый: берется хромосома одного родителя и в него вставляется участок случайной длины хромомомы другого родителя начиная со слуайной позиции. Можно брать биты с обейх хромосом по одному, но это, как мне кажется туповато... В общем, я остановился на первом методе.
И нужно время от времени делать мутации. Будет какой-то, еще не придумал какой, коефициент для задания их частоты, вернее, вероятности.

2 beeos

Модификаторы... нужно подумать... сейчас ничего не скажу...

До понедельника!
Автор: UncoNNecteD
Дата сообщения: 23.04.2004 18:34
Надо бы радиацию ввести, которая будет увеличивать коэфициент мутации.
Автор: Crazy_Shrike
Дата сообщения: 23.04.2004 18:48
Да, мутагенность среды...
Автор: UncoNNecteD
Дата сообщения: 23.04.2004 19:42
И еще устойчивость к мутации!
Таким макаром будет эволиционная развилка, может создасться тип - устойчивый к радиации
Автор: unhappy
Дата сообщения: 23.04.2004 22:53
Хромосомы скрещивать как в у Лукьяненко :))
Ну и как в обычной биологии :)
Берется доминирующий ген. То есть нужна тейбла с иерархией генов :)

И кста - а что если координаты сделать двойственые несколько - поясню - например сделать так, что система изначально считает, что точка(1,1), точка(1,2), точка(2,1), точка(2,2) находятся в "одной локации" с именем область(1,1).
Э потом идет простая проверка на вхождение, работа с элементами набора.
И потом - можно реализовать это в нормальной таблице - имхо тогда обраббатывать данные будет легче?
Автор: ArtSh
Дата сообщения: 24.04.2004 15:05
На счет координаты типа double я может быть поторопился, однако, если вы проходите только по клеткам, которые содержат клетки, то зачем хранить информацию о других клетках?

На счет вставки. Лучше всего хранить данные в динамическом массиве или списке, в таком случае, при обработке данных основной операцией (при небольших размерах хранящихся объектов, как например класс нашего объекта) будет вставка значений в массив.

И на счет скрещивания генов. Можно обрабатывать их по формуле НГ=х*ПГ+у*МГ
где НГ ген ребенка, ПГ ген "папы", МГ ген "мамы", х*х+у*у=1
Автор: Crazy_Shrike
Дата сообщения: 27.04.2004 09:40
Давйте пока обсудим такой вопрос. Может быть, самый главный. Возможно ли в подобной модели запустить бесконечное совершенствование или все закончится тривиально - будет найден оптимальный организм? Может нужны какие-то базы знаний для каждого организма, в которых будут храниться всякие сведения о пережитых событиях, там,.. самые важные будут наследоваться и т.д...
Автор: ArtSh
Дата сообщения: 27.04.2004 17:00
на мой взгляд сперва надо понять алгоритмы основных действий наших объектов, а затем, по мере прояснения ситуации вносить изменения в типы данных.
Автор: UncoNNecteD
Дата сообщения: 28.04.2004 10:47
Crazy_Shrike
Нужно предусмотреть возможность этой эволюции, а в конечном итоге это мы и увидим - получим ли идеальный организм Это и есть конечная цель.
Автор: Crazy_Shrike
Дата сообщения: 28.04.2004 12:30
Вот, родил, наконец-то:

/*

Параметр длина диапазон биты

Life time - 20 bit, [~10^6]; 0-19
Mass - 10 bit, [~10^3]; 20-29
Energy - 10 bit, [~10^3]; 30-39
Sex - 1 bit, 40
Libido - 10 bit, [~10^3]; 41-50
Predator - 1 bit, 51
ViewRadius- 7 bit, [64]; 52-58;

*/
class CEssence{
public:
CEssence();

int GetX();
int GetY();

void LoadCurrentCellInfo(int,int,int); //Info about Cell properties

void LoadInfoAboutEnvironment();

int RandomMove();
int MoveE();
int MoveSE();
int MoveS();
int MoveSW();
int MoveW();
int MoveNW();
int MoveN();
int MoveNE();

int GetLifeTime();
void IncLifeTime();
void DecLifeTime();

int GetMass();
void IncMass();
void DecMass();

int GetEnergy();
void IncEnergy();
void DecEnergy();

bool GetSex();

int GetLibido();
void IncLibido();
void DecLibido();

void SetPredator(bool);
bool GetPredator();

int GetViewRadius();
void IncViewRadius();
void DecViewRadius();

int GetAge();
void IncAge();

private:
bool hromosoma[100];
int lifetime;
int mass;
int energy;
bool sex;
int libido;
bool predator;
int viewradius;
int x;
int y;
int age;

void SetBinary(int,int,int);
int GetDecimal(int,int);
void VarInitialization(); //hromosoma->vars;
void HromosomaInitialization(); //vars->hromosoma;


};

Вот, значит, сделал, как предлагали. Новшество в том, что параметры хранятся теперь в приватных переменных. Пока не происходит скрещивания, оперируем с этими переменными, а перед скрещиванием, функцией HromosomaInitialization() загоняем все в хромосому - кодируем. После скрещивания происходит декодирование - VarInitialization() и дальше до следующего скрещивания снова работаем с переменными. Короче, не нужно каждый раз делать кодирование/декодирование.

Функции void SetBinary(int,int,int); int GetDecimal(int,int); -
это функции - кодировщик и декодеровщик, соответственно. Кодировщик - записывает инфу в гены. Принимает десятичное число, стартовую и конечную позицию гена, переводит в двоичный код и записывает в ген. Декодировщи - обратно. Принимает стартовую и конечную позицию гена и возвращает десятичное.



Добавлено
Да, остальные методы я описывал. Разве что движение... Методы, типа MoveX() - это шаги по всем сторонам горизонта, как на карте, 8 направлений.

Добавлено
И это... говорил, по-моему, про молчащие области... или хотел только...
В общем, в живых хромомсомах "говорящие" гены занимают всего несколько процентов длины самой хромосомы. Остальные - молчащие области, которые ни за что не отвечают и белки с них не синтезируются. Кстати, может кто не знает... сам офигел недавно. Рак - это когда информация начинает читаться именно с молчащих участков хромосомы...
Так вот, предлагаю ввести такие области. Они могут быть резервом для мутаций. Как вам идея?
Автор: Crazy_Shrike
Дата сообщения: 30.04.2004 07:37
Ну что?
Unconnected !? Где вы, люди? Скажите что-нибудь!
Автор: beeos
Дата сообщения: 30.04.2004 08:55
Идея неплохая, но опять же ведет к усложнению системы. Не совсем понятно, как эти участки будут храниться, т.е. как определять их и отделять от информативных участков.
Автор: Crazy_Shrike
Дата сообщения: 30.04.2004 10:30
Не вижу проблемы...
Главное, следить за картой хромомсомы...
Я сайтик наваял, там подробнее написано...
www.e-volution.freehost.kiev.ua
Автор: Dimoneo
Дата сообщения: 30.04.2004 21:17
чето не могу достучаться до сайта...
Автор: ArtSh
Дата сообщения: 04.05.2004 16:18
А зачем так много функций? И вообще, какой алгоритм программы?
Как инициализируется мир? Когда и при каких условиях вызываются функции?
Автор: Crazy_Shrike
Дата сообщения: 06.05.2004 10:32
Зачем много функций? Как зачем? Хоть написано еще не много, но все они создавались по мере необходимости...
В начале программы создается массив 100х100 объектов типа Cell. У каждой клетки есть запас ресурсов и время их регенерации. Также инициализируется динамический массив объектов Essence, которые имеют случайные начальные координаты. Потом идет бесконечный цикл - такты. В каждом такте кажый организм получает информацию о клетке, в которой находится, осматривается (собирает матрицу с информацией о соседних клетках) и принимает решение куда ему податься или остаться на месте. Пока вкратце так...

Добавлено
Большинство методов использются приватно. Например, когда метод сбора информации о соседних клетках обрабатывает инфу, то принимает решение в какую сторону шагнуть... Стараюсь вызывать как можно меньше методов извне, а всю нагрузку об обработке и принтятии решений переложить на внутренние методы. Так объект будет максимально "независим" что ли, от главной программы, т.е. "думать" самостоятельно. По-моему, это логично... да и так учили на ООП...
Автор: ArtSh
Дата сообщения: 07.05.2004 09:32
Методы можно упростить, например функции Move.. можно заменить одной с тремя параметрами (объект будет занимать меньше места и быстрей копироваться). Тоже касается остальных функций.

И, пожалуйста,напиши алгоритм инициализации на алгоритмическом языке, будет понятней и удобней. И еще, все параметры изменяются в конце такта у всех объектов?
Автор: Crazy_Shrike
Дата сообщения: 07.05.2004 10:14
А чего писать-то? Я не понимаю...
Когда объявляется массивы клеток и существ, их конструкторы присваивают всем необходимым переменным какие-либо значения - стартовые параметры.
Автор: ArtSh
Дата сообщения: 07.05.2004 10:35
Например:

Выделение памяти.
цикл: (по всем клеткам ?)
вызов конструктора.
вставка объекта в массив.
конец.

/*Вызов конструткора:
????
конец.*/

цикл: бесконечный
цикл: по всем объектам
вызвать ххх процедуру.
конец.
конец.

/*процедура ххх
?????
конец.*/
Автор: UncoNNecteD
Дата сообщения: 07.05.2004 10:35
Crazy_Shrike
int Move(int where);

Зачем функции типа GetMass если можно просто обратится к параметру объекта Obj->Mass ?
Соответственно делать inc(Obj->Mass) и dec(Obj->Mass)

К остальным функциям то же самое.


Код:
private:
bool hromosoma[100];
int lifetime;
int mass;
int energy;
bool sex;
int libido;
bool predator;
int viewradius;
int x;
int y;
int age;

void SetBinary(int,int,int);
int GetDecimal(int,int);
void VarInitialization(); //hromosoma->vars;
void HromosomaInitialization(); //vars->hromosoma;

Страницы: 123456

Предыдущая тема: C++: Построчное чтение файла в Builder


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.