Artificial intelligence 如何实现有序交叉
所以我有两个父母 ABCDE EDCBA 我是否可以从以下两个选项中选择一个子集: 来自父一:ACD 来自父二:EDC 然后我将父一复制到子一,但以父二的顺序复制所选子集,因此: 子代一:DBCAEArtificial intelligence 如何实现有序交叉,artificial-intelligence,genetic-algorithm,Artificial Intelligence,Genetic Algorithm,所以我有两个父母 ABCDE EDCBA 我是否可以从以下两个选项中选择一个子集: 来自父一:ACD 来自父二:EDC 然后我将父一复制到子一,但以父二的顺序复制所选子集,因此: 子代一:DBCAE 后代二:CDEBA回答标题问题: : 更多理论:镜像: 相关::< P>这是C++中用我自己的随机类实现的代码。我不确定旋转是否正确,但交叉似乎是合法的。在一天结束时,你不会得到任何重复 #include <array> #include <random> #include
后代二:CDEBA回答标题问题: : 更多理论:镜像:
<>相关::< P>这是C++中用我自己的随机类实现的代码。我不确定旋转是否正确,但交叉似乎是合法的。在一天结束时,你不会得到任何重复
#include <array>
#include <random>
#include <iostream>
// I converted this found code into a functional class
// http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
class MyRandom
{
public:
MyRandom() : gen(rd()) {}
int nextInt(const int& max)
{
std::uniform_int_distribution<> dis(0, max);
return dis(gen);
}
private:
std::random_device rd;
std::mt19937_64 gen;
std::uniform_int_distribution<> setdis;
bool disSet = false;
};
void crossover(std::vector<int>& parent1, std::vector<int>& parent2)
{
int size = int(parent1.size());
MyRandom rand;
int number1 = rand.nextInt(7);
int number2 = rand.nextInt(7);
int start = fmin(number1, number2);
int end = fmax(number1, number2);
std::vector<int> child1;
std::vector<int> child2;
for(int i = start; i<end; i++)
{
child1.push_back(parent1[i]);
child2.push_back(parent2[i]);
}
int geneIndex = 0;
int geneInparent1 = 0;
int geneInparent2 = 0;
for (int i = 0; i<size; i++)
{
geneIndex = (end + i) % size;
geneInparent1 = parent1[geneIndex];
geneInparent2 = parent2[geneIndex];
bool is_there = false;
for(int i1 = 0; i1<child1.size(); i1++)
{
if(child1[i1] == geneInparent2)
{
is_there = true;
}
}
if(!is_there)
{
child1.push_back(geneInparent2);
}
bool is_there1 = false;
for(int i1 = 0; i1<child2.size(); i1++)
{
if(child2[i1] == geneInparent1)
{
is_there1 = true;
}
}
if(!is_there1)
{
child2.push_back(geneInparent1);
}
}
std::rotate(child1.begin(), child1.begin()+start, child1.end());
std::rotate(child2.begin(), child2.begin()+start, child2.end());
for(int i = 0; i<size; i++)
{
parent1[i] = child2[i];
parent2[i] = child1[i];
}
}
int main(int argc, const char * argv[]) {
std::vector<int> parent1 = {0, 1, 2, 3, 4, 5, 6, 7};
std::vector<int> parent2 = {7, 6, 5, 4, 3, 2, 1, 0};
for(int i = 0; i<8; i++)
{
std::cout << parent1[i] << " ";
}
std::cout << std::endl;
for(int i = 0; i<8; i++)
{
std::cout << parent2[i] << " ";
}
std::cout << std::endl;
crossover(parent1, parent2);
for(int i = 0; i<8; i++)
{
std::cout << parent1[i] << " ";
}
std::cout << std::endl;
for(int i = 0; i<8; i++)
{
std::cout << parent2[i] << " ";
}
std::cout << std::endl;
return 0;
}
谢谢,这正是我想要的!
#include <array>
#include <random>
#include <iostream>
// I converted this found code into a functional class
// http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
class MyRandom
{
public:
MyRandom() : gen(rd()) {}
int nextInt(const int& max)
{
std::uniform_int_distribution<> dis(0, max);
return dis(gen);
}
private:
std::random_device rd;
std::mt19937_64 gen;
std::uniform_int_distribution<> setdis;
bool disSet = false;
};
void crossover(std::vector<int>& parent1, std::vector<int>& parent2)
{
int size = int(parent1.size());
MyRandom rand;
int number1 = rand.nextInt(7);
int number2 = rand.nextInt(7);
int start = fmin(number1, number2);
int end = fmax(number1, number2);
std::vector<int> child1;
std::vector<int> child2;
for(int i = start; i<end; i++)
{
child1.push_back(parent1[i]);
child2.push_back(parent2[i]);
}
int geneIndex = 0;
int geneInparent1 = 0;
int geneInparent2 = 0;
for (int i = 0; i<size; i++)
{
geneIndex = (end + i) % size;
geneInparent1 = parent1[geneIndex];
geneInparent2 = parent2[geneIndex];
bool is_there = false;
for(int i1 = 0; i1<child1.size(); i1++)
{
if(child1[i1] == geneInparent2)
{
is_there = true;
}
}
if(!is_there)
{
child1.push_back(geneInparent2);
}
bool is_there1 = false;
for(int i1 = 0; i1<child2.size(); i1++)
{
if(child2[i1] == geneInparent1)
{
is_there1 = true;
}
}
if(!is_there1)
{
child2.push_back(geneInparent1);
}
}
std::rotate(child1.begin(), child1.begin()+start, child1.end());
std::rotate(child2.begin(), child2.begin()+start, child2.end());
for(int i = 0; i<size; i++)
{
parent1[i] = child2[i];
parent2[i] = child1[i];
}
}
int main(int argc, const char * argv[]) {
std::vector<int> parent1 = {0, 1, 2, 3, 4, 5, 6, 7};
std::vector<int> parent2 = {7, 6, 5, 4, 3, 2, 1, 0};
for(int i = 0; i<8; i++)
{
std::cout << parent1[i] << " ";
}
std::cout << std::endl;
for(int i = 0; i<8; i++)
{
std::cout << parent2[i] << " ";
}
std::cout << std::endl;
crossover(parent1, parent2);
for(int i = 0; i<8; i++)
{
std::cout << parent1[i] << " ";
}
std::cout << std::endl;
for(int i = 0; i<8; i++)
{
std::cout << parent2[i] << " ";
}
std::cout << std::endl;
return 0;
}