Advertisement
Le_BuG63

Untitled

Dec 17th, 2014
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <chrono>
  3. #include <cassert>
  4. #include <cstdint>
  5. #include <vector>
  6. #include <random>
  7.  
  8. // Tutoriel pratique d'un ami, Piticroissant: http://piticroissant.wordpress.com/2014/04/19/bien-generer-les-nombres-pseudo-aleatoires/
  9. template <typename T>
  10. T random(const T& min, const T& max)
  11. {
  12.     static_assert(std::is_arithmetic<T>::value,
  13.             "random() needs arithmetic type");
  14.  
  15.     static std::random_device rd;
  16.     static std::mt19937 gen{rd()};
  17.  
  18.     return typename std::conditional<
  19.             std::is_integral<T>::value,
  20.             std::uniform_int_distribution<T>,
  21.             std::uniform_real_distribution<T>>::type{min, max}(gen);
  22. }
  23.  
  24. class Mutation {
  25. public:
  26.     Mutation() {
  27.  
  28.     }
  29.  
  30.     ~Mutation() {
  31.         m_individuID.clear();
  32.         m_listIndividu.clear();
  33.     }
  34.  
  35.     void    setIndividu(uint32_t nindividu) {
  36.         std::cout << "ID de départ: ";
  37.  
  38.         for(auto i = 0; i < nindividu; ++i) {
  39.             m_individuID.push_back(i);
  40.             std::cout << m_individuID.at(i) << " ";
  41.         }
  42.  
  43.         assert(!m_individuID.empty());
  44.  
  45.         std::cout << std::endl;
  46.     }
  47.  
  48.  
  49.     void    processMutation() {
  50.         uint32_t    totalGeneration = 1;
  51.         bool        winner = false;
  52.  
  53.         auto timeBegin = std::chrono::system_clock::now();
  54.  
  55.         while(!winner) {
  56.             nextGeneration();
  57.             ++totalGeneration;
  58.  
  59.             if(verifWin()) {
  60.                 winner = true;
  61.             }
  62.         }
  63.  
  64.         auto timeEnd = std::chrono::system_clock::now();
  65.  
  66.         std::chrono::duration<double> result = (timeEnd - timeBegin);
  67.  
  68.         std::cout << "Mutation gagnante " << m_individuWinner << " en " << totalGeneration << " générations (" << result.count() << "s)";
  69.     }
  70.  
  71. private:
  72.     void    nextGeneration() {
  73.         for(auto actindividu = 0; actindividu < m_individuID.size(); ++actindividu) {
  74.             int chance = random(0, static_cast<int>(m_individuID.size()));
  75.  
  76.             for(int i = 0; i < chance; ++i) {
  77.                 m_listIndividu.push_back(m_individuID.at(actindividu));
  78.             }
  79.         }
  80.  
  81.         for(int i = 0; i <  m_individuID.size(); ++i) {
  82.             int here = random(0, static_cast<int>(m_listIndividu.size() - 1));
  83.  
  84.             m_individuID.at(i) = m_listIndividu.at(here);
  85.  
  86.             std::cout << m_individuID.at(i) << " ";
  87.         }
  88.  
  89.         std::cout << std::endl;
  90.  
  91.         m_listIndividu.clear();
  92.     }
  93.  
  94.     bool        verifWin() {
  95.         bool    win = false;
  96.         auto    tmp = m_individuID.at(0);
  97.         auto    max = m_individuID.size();
  98.  
  99.         for(int i = 1; i < max; ++i) {
  100.             if(m_individuID.at(i) == tmp) {
  101.                 m_individuWinner = m_individuID.at(i);
  102.                 win = true;
  103.             }
  104.             else {
  105.                 i = max;
  106.                 win = false;
  107.             }
  108.         }
  109.         return win;
  110.     }
  111.  
  112. private:
  113.     uint32_t                m_individuWinner;
  114.  
  115.     std::vector<uint32_t>   m_listIndividu;
  116.     std::vector<uint32_t>   m_individuID;
  117. };
  118.  
  119. int main(int argc, char *argv[]) {
  120.  
  121.     Mutation mutation;
  122.  
  123.     uint32_t    nindividu;
  124.  
  125.     std::cout << "Nombre d'individus: ";
  126.     std::cin >> nindividu;
  127.  
  128.     mutation.setIndividu(nindividu);
  129.  
  130.     std::cout << std::endl;
  131.  
  132.     mutation.processMutation();
  133.  
  134.     return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement