Iterasi urutan acak pada simpul BGL

Berikut beberapa contoh kode untuk membuat grafik dengan bgl dan mengulangi simpulnya. Saya ingin melakukan iterasi ini dalam urutan acak - dengan kata lain: loop harus memanipulasi setiap simpul, tetapi urutan simpul harus acak untuk setiap panggilan fungsi utama. Bagaimana saya bisa mencapainya?

Saya gagal bereksperimen dengan std::random_shuffle. Menurut saya ada berbagai macam konsep iterator, tetapi saya belum memahami perbedaannya.

  #include <iostream>                  
  #include <boost/graph/graph_traits.hpp>
  #include <boost/graph/adjacency_list.hpp>

  using namespace boost;

  // vertex struct to store some properties in vertices
  struct Vertex {
    std::string name;
  };

  int main(int,char*[]) {
    // create a typedef for the graph type
    typedef adjacency_list<vecS, vecS, undirectedS, Vertex> Graph;

    // declare a graph object
    Graph g(3);

    // prepare iteration 
    typedef graph_traits<Graph>::vertex_iterator vertex_iter;
    std::pair<vertex_iter, vertex_iter> vp;

    // add some property data to the vertices
    vp = vertices(g);
    g[*vp.first].name = "A";
    g[*(++vp.first)].name = "B";
    g[*(++vp.first)].name = "C";

    // iterate over the vertices
    for (vp = vertices(g); vp.first != vp.second; ++vp.first)     
      std::cout << g[*vp.first].name <<  " ";
    std::cout << std::endl;

    return 0;
  }

Sunting: Inilah solusi yang saya temukan berkat jawaban @Jay.

  #include <iostream>                  
  #include <boost/graph/graph_traits.hpp>
  #include <boost/graph/adjacency_list.hpp>
  #include <algorithm>    // std::random_shuffle
  #include <vector>       // std::vector
  #include <ctime>        // std::time
  #include <cstdlib>      // std::rand, std::srand

  using namespace boost;

  // vertex struct to store some properties in vertices
  struct Vertex {
    std::string name;
  };

  // random number generator function
  int myrandom (int i) { 
    return std::rand()%i;
  }

  int main(int,char*[]) {
    // create a typedef for the graph type
    typedef adjacency_list<vecS, vecS, undirectedS, Vertex> Graph;

    // declare a graph object
    Graph g(3);

    // prepare iteration 
    typedef graph_traits<Graph>::vertex_iterator vertex_iter;
    std::pair<vertex_iter, vertex_iter> vp;

    // add some property data to the vertices
    vp = vertices(g);
    g[*vp.first].name = "A";
    g[*(++vp.first)].name = "B";
    g[*(++vp.first)].name = "C";

    // initialize pseudo random number generator
    std::srand(unsigned (std::time(0)));

    // create offset vector
    std::vector<int> myvector;
    for (int i=0; i<3; ++i) {
      myvector.push_back(i);
    }

    // using myrandom to shuffle offset vector
    std::random_shuffle(myvector.begin(), myvector.end(), myrandom);

    // keep vp.first at the start 
    vp = vertices(g);

    // iterate over the vertices effectively shuffled by the offset
    vertex_iter dummy_iter;
    for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it) {
      dummy_iter = vp.first + *it;
      std::cout << g[*dummy_iter].name <<  " ";
    }
    std::cout << std::endl;

    return 0;
  }

person nevrome    schedule 26.03.2017    source sumber
comment
apa yang tidak berhasil dalam menggunakan std::random_shuffle?   -  person Jay    schedule 26.03.2017
comment
@Jay Saya mencoba menambahkan std::random_shuffle(vp.first, vp.second); tetapi kompilasi gagal. Kesalahannya sangat bertele-tele dan saya tidak yakin apa bagian pentingnya, tapi saya kira fungsi swap yang dipanggil secara internal oleh random_shuffle mengharapkan jenis masukan lain.   -  person nevrome    schedule 26.03.2017


Jawaban (2)



Untuk membuat nomor acak dalam rentang tertentu gunakan kode di bawah ini. #sertakan ctime dan #sertakan stdlib.h

    int getNumberRange(int min, int max)
    {
        srand(static_cast<unsigned int>(time(0)));

        // always call rand(); after srand() on visual vasic;
        rand();

        static const double fraction = 1.0 / (static_cast<double>(RAND_MAX) + 1.0);
        return static_cast<int>(rand() * fraction * (max - min + 1) + min);
    }



    getNumberRange(1, 100); //picks number between 1 and 100

Setiap kali Anda memerlukan nomor baru, ubah nilai rentang (1, 100) dan panggil fungsinya lagi.

person Felipe Lopez    schedule 26.03.2017
comment
Masalah saya bukanlah membuat generator nomor acak. Saya tidak mengerti bagaimana menggabungkan ini dengan konsep iterator. Bisakah Anda menjelaskan di mana memanggil fungsi Anda untuk mencapai urutan titik acak dalam kode contoh saya? Mungkin saya hanya tidak melihat yang jelas. - person nevrome; 26.03.2017