Re: access violation question
On 27-12-2010 17:49, AnonMail2005@gmail.com wrote:
Please post your code.
Here is the code, that will compile on Codeblocks (gcc compiler), but
leads to an error during execution.
I removed most comments (in Dutch), all ofstream (output to file) parts
(so some of the code must seem pointless now), and I englished some
variable names. I used an input function rather than arguments to
main(), so I could give some suggestions about the input values.
Comments on the miserable coding are welcome, but that's not MY first
concern at the moment.
--------------------------------------------------------------
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;
unsigned int n, hoogste = 0, trnsize, nr_rows, nr_trns,
wissels, rounds;
double poolgem, pooltop, mutatiegraad;
typedef pair < vector<unsigned int>,unsigned int > paar;
vector<paar>vpool;
vector<pair <unsigned int,unsigned int> > vparen;
// rng used in random_shuffle()
class MyRandom // from Josuttis, p. 393-5
{
public:
ptrdiff_t operator() (ptrdiff_t max)
{
double tmp;
tmp = static_cast<double>(rand())
/ static_cast<double>(RAND_MAX);
return static_cast<ptrdiff_t>(tmp * max);
}
};
MyRandom rd;
inline bool groter (const paar& paar1, const paar& paar2)
{
return paar1.second > paar2.second;
}
inline unsigned int terugtel (vector<unsigned int>& vint)
{
unsigned int terugtel = 0, vangst = 0;
while (terugtel != vint.size())
{
terugtel++;
if (vint[terugtel] == terugtel + 1)
{
reverse (vint.begin(), vint.begin()+terugtel+1);
terugtel = 0;
++vangst;
}
}
return vangst;
}
inline unsigned int rvrs (vector<unsigned int> vint)
{
unsigned int teller = 0;
while (vint[0] != 1)
{
teller++;
reverse (vint.begin(), vint.begin()+vint[0]);
}
return teller;
}
void toon_hoogste (const vector<unsigned int>& vi)
{
cout << hoogste << " - ronde " << rounds << endl;
vector<unsigned int> vidup(n);
copy (vi.begin(), vi.end(), vidup.begin());
unsigned int bijtellen = terugtel (vidup);
}
void toon_pooltop ()
{
cout << "round " << rounds << ", average " << pooltop
<< endl;
}
double poolgemiddelde ()
{
double pooltotaal = 0.0;
for (unsigned int i = 0; i != nr_rows; ++i)
pooltotaal += vpool[i].second;
return pooltotaal / nr_rows;
}
void verwissel (const unsigned int index)
{
unsigned int score, x, y, hulpwaarde;
double klein;
vector<paar> vtrn(trnsize);
copy (vpool.begin()+index, vpool.begin()+index+trnsize,
vtrn.begin());
sort (vtrn.begin(), vtrn.end(), groter);
vector<paar> vkand_trn;
for (unsigned int deeln = 0; deeln != trnsize; ++deeln)
{
random_shuffle (vparen.begin(), vparen.end(), rd);
vector<paar> vkand_ouder;
for (unsigned int wisnr = 0; wisnr != wissels; ++wisnr)
{
vector<unsigned int> vtemp = vtrn[deeln].first;
x = vparen[wisnr].first;
y = vparen[wisnr].second;
swap (vtemp[x], vtemp[y]);
// if (x < vtemp.size() && y < vtemp.size())
// swap (vtemp[x], vtemp[y]);
score = rvrs(vtemp);
if (score > hoogste)
{
hoogste = score;
toon_hoogste (vtemp);
}
vkand_ouder.push_back(make_pair(vtemp,score));
}
sort (vkand_ouder.begin(), vkand_ouder.end(), groter);
for (unsigned int i = 0; i != 2; ++i)
vkand_trn.push_back(vkand_ouder[i]);
}
sort (vkand_trn.begin(), vkand_trn.end(), groter);
copy (vkand_trn.begin(),
vkand_trn.begin()+trnsize,
vpool.begin()+index);
}
void initialiseer_pool()
{
vector<unsigned int> row(n);
nr_rows = nr_trns * trnsize;
unsigned int score;
for (unsigned int i = 0; i != n; ++i)
row[i] = i+1;
for (unsigned int i = 0; i != nr_rows; ++i)
{
do
{
random_shuffle (row.begin(), row.end(),rd);
}
while (row[0] == 1 || row[row[0]-1] == 1);
score = rvrs(row);
if (score > hoogste)
{
hoogste = score;
toon_hoogste (row);
}
vpool.push_back(make_pair (row,score) );
}
poolgem = poolgemiddelde();
if (poolgem > pooltop)
{
pooltop = poolgem;
toon_pooltop();
}
}
void gegevensinvoer()
{
cout << "\n\nSettings like ...\n\n";
cout << "n = 20\n";
cout << "trnsize = 4\n";
cout << "nr_trns = 100\n";
cout << "prt = 15\n\n";
cout << "... will cause the program to stop,\n";
cout << "however the round in which this happens\n";
cout << "may as well be round 0 as 200.\n\n";
cout << "n (10-100): ";
cin >> n;
cout << endl << endl;
cout << "trnsize (to be safe, choose 4): ";
cin >> trnsize;
cout << endl << endl;
cout << "nr_trns (couple hundred): ";
cin >> nr_trns;
cout << endl << endl;
unsigned int alle_wissels = n * (n-1) / 2;
double prt;
cout << "prt (a lowish percentage): ";
cin >> prt;
wissels = static_cast<unsigned int>(prt * alle_wissels / 100.0);
cout << endl << endl;
}
int main()
{
srand(time(0));
gegevensinvoer();
// initialize vparen
for (int unsigned i = 0; i != n - 1; ++i)
for (int unsigned j = i + 1; j != n; ++j)
{
pair<unsigned int,unsigned int> p (i,j);
vparen.push_back(p);
}
rounds = 0;
pooltop = 0.0;
initialiseer_pool();
while (true)
{
rounds++;
cout << '=' << rounds << "=\n";
for (unsigned int i = 0; i != nr_trns; ++i)
verwissel (i*trnsize);
poolgem = poolgemiddelde();
if (poolgem > pooltop)
{
pooltop = poolgem;
toon_pooltop ();
}
for (unsigned int schud = 0; schud != nr_rows; ++schud)
random_shuffle (vpool.begin(), vpool.end(),rd);
}
return 0;
}