131 lines
2.2 KiB
C++
131 lines
2.2 KiB
C++
#include "values/DnaManager.hpp"
|
|
#include "values/mrand.hpp"
|
|
|
|
void DnaManager::init()
|
|
{
|
|
randSeed.a = mrand::getInt();
|
|
randSeed.b = mrand::getInt();
|
|
randSeed.c = mrand::getInt();
|
|
randSeed.d = mrand::getInt();
|
|
|
|
vector.resize(NUM_PER_GEN);
|
|
for (std::size_t i = 0; i < NUM_PER_GEN; i++)
|
|
{
|
|
newDna(&vector[i], &randSeed);
|
|
queued.push_back(&vector[i]);
|
|
}
|
|
}
|
|
|
|
void DnaManager::deinit()
|
|
{
|
|
}
|
|
|
|
Unit DnaManager::next()
|
|
{
|
|
if (queued.empty())
|
|
{
|
|
return {nullptr, Liked::tbd};
|
|
}
|
|
|
|
Dna *ret = queued.front();
|
|
queued.pop_front();
|
|
showed.push_back(ret);
|
|
return {ret, Liked::tbd};
|
|
}
|
|
|
|
void DnaManager::like(Unit unit)
|
|
{
|
|
Dna *found = nullptr;
|
|
for (auto &&i : showed)
|
|
{
|
|
if (i == unit.dna)
|
|
found = unit.dna;
|
|
}
|
|
|
|
if (found == nullptr)
|
|
{
|
|
TraceLog(LOG_ERROR, "NOT FOUND UNIT");
|
|
return;
|
|
}
|
|
if (unit.liked == Liked::yes)
|
|
{
|
|
liked.push_back(found);
|
|
}
|
|
else if (unit.liked == Liked::no)
|
|
{
|
|
disliked.push_back(found);
|
|
}
|
|
else
|
|
{
|
|
TraceLog(LOG_ERROR, "LIKED WITH NO VAULE");
|
|
return;
|
|
}
|
|
|
|
showed.remove(found);
|
|
|
|
if (showed.size() == 0 && queued.size() == 0)
|
|
{
|
|
newGen();
|
|
}
|
|
}
|
|
|
|
void DnaManager::newGen()
|
|
{
|
|
if (liked.size() == 0)
|
|
{
|
|
for (std::size_t i = 0; i < NUM_PER_GEN; i++)
|
|
{
|
|
newDna(&vector[i], &randSeed);
|
|
queued.push_back(&vector[i]);
|
|
}
|
|
disliked.clear();
|
|
return;
|
|
}
|
|
|
|
for (auto &&i : liked)
|
|
{
|
|
queued.push_back(i);
|
|
}
|
|
|
|
if (liked.size() == 1)
|
|
{
|
|
Dna *front = liked.front();
|
|
|
|
for (auto &&i : disliked)
|
|
{
|
|
clone(front, i, &randSeed);
|
|
queued.push_back(i);
|
|
}
|
|
|
|
disliked.clear();
|
|
liked.clear();
|
|
return;
|
|
}
|
|
|
|
if (liked.size() >= 2)
|
|
{
|
|
for (auto &&i : disliked)
|
|
{
|
|
size_t p1 = mrand::getValue(0, liked.size() - 1, &randSeed);
|
|
size_t p2 = mrand::getValue(0, liked.size() - 1, &randSeed);
|
|
while (p1 == p2)
|
|
{
|
|
p2 = mrand::getValue(0, liked.size(), &randSeed);
|
|
}
|
|
|
|
Dna *p1p = liked[p1];
|
|
Dna *p2p = liked[p2];
|
|
makeChild(p1p, p2p, i, &randSeed);
|
|
queued.push_back(i);
|
|
}
|
|
}
|
|
|
|
if (queued.size() == NUM_PER_GEN)
|
|
{
|
|
for (auto &&i : queued)
|
|
{
|
|
mutate(i, NUM_OF_MUT, &randSeed);
|
|
}
|
|
return;
|
|
}
|
|
} |