遗传算法 - 交叉和MPI

时间:2016-05-19 12:50:39

标签: c++ algorithm mpi genetic-algorithm crossover

当我试图将我的代码转换为MPI和Crossover解决方案时,我陷入了困境。我的问题是关于Crossover对我来说太难理解而且更难以实现所有这些MPI解决方案。如果有人可以给我提示,示例或任何相关文件。我将在下面提供我的代码供大家查看。

非常感谢

#include <string> 
#include <cstdlib> 
#include <iostream> 
#include <cassert> 
#include <algorithm> 
#include <vector> 

std::string allowed_chars = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

class selection 
{ 
public:
  static int fitness(std::string candidate) 
  { 
    assert(target.length() == candidate.length()); 

    int fitness_so_far = 0; 

    for (int i = 0; i < target.length(); ++i) 
    { 
      int target_pos = allowed_chars.find(target[i]); 
      int candidate_pos = allowed_chars.find(candidate[i]); 
      int diff = std::abs(target_pos - candidate_pos); 
      fitness_so_far -= std::min(diff, int(allowed_chars.length()) - diff); 
    } 

    return fitness_so_far; 
  } 

  // get the target string length 
  static int target_length() { return target.length(); } 
private: 
  static std::string target; 
}; 

std::string selection::target = "METHINKS IT IS LIKE A WEASEL";

void move_char(char& c, int distance) 
{ 
  while (distance < 0) 
    distance += allowed_chars.length(); 
  int char_pos = allowed_chars.find(c); 
  c = allowed_chars[(char_pos + distance) % allowed_chars.length()]; 
} 

std::string mutate(std::string parent, double mutation_rate) 
{ 
  for (int i = 0; i < parent.length(); ++i) 
    if (std::rand()/(RAND_MAX + 1.0) < mutation_rate) 
    { 
      int distance = std::rand() % 3 + 1; 
      if(std::rand()%2 == 0) 
 move_char(parent[i], distance); 
      else 
        move_char(parent[i], -distance); 
    } 
  return parent; 
}
bool less_fit(std::string const& s1, std::string const& s2) 
{ 
  return selection::fitness(s1) < selection::fitness(s2); 
} 

int main() 
{ 
  int const C = 100; 

  std::srand(time(0)); 

  std::string parent; 
  for (int i = 0; i < selection::target_length(); ++i) 
  { 
    parent += allowed_chars[std::rand() % allowed_chars.length()]; 
  } 

  int const initial_fitness = selection::fitness(parent); 

  for(int fitness = initial_fitness; 
      fitness < 0; 
      fitness = selection::fitness(parent)) 
  { 
    std::cout << parent << ": " << fitness << "\n"; 
    double const mutation_rate = 0.02 + (0.9*fitness)/initial_fitness; 
    typedef std::vector<std::string> childvec; 
    childvec childs; 
    childs.reserve(C+1); 

    childs.push_back(parent); 
    for (int i = 0; i < C; ++i) 
      childs.push_back(mutate(parent, mutation_rate)); 

    parent = *std::max_element(childs.begin(), childs.end(), less_fit); 
  } 
  std::cout << "final string: " << parent << "\n"; 
} 

1 个答案:

答案 0 :(得分:0)

对于交叉选择2父字符串和相关的拆分索引,

然后生成2个新字符串:

std::string new_string1 = s1.substring(0, split_index1) + s2.substring(split_index2);
std::string new_string2 = s2.substring(0, split_index2) + s1.substring(split_index1);`.