Mam na zadanie taki program i utknąłem w martwym punkcie.
Napisać program symulujący ewolucję populacji osobników. Populacja może liczyć dowolną liczbę osobników. Każdy osobnik zawiera chromosom, który jest ciągiem liczb naturalnych. Chromosomy mogą być różnej długości. W każdym pokoleniu wylosowywanych jest k par osobników, które się następnie krzyżują. Krzyżowanie polega na tym, że u każdego osobnika dochodzi do pęknięcia chromosomu w dowolnym miejscu. Część początkowa chromosomu jednego osobnika łączy się z częścią końcową drugiego. Inaczej mówiąc: osobniki wymieniają się fragmentami swoich chromosomów. Jeden osobnik może być wylosowany do kilku krzyżowań. Po dokonaniu wszystkich krzyżowań w pokoleniu sprawdzane jest przystosowanie osobników do warunków środowiska. W tym celu dla każdego osobnika wyznaczana jest wartość f ∈ [0, 1] funkcji dopasowania.
Plik wejściowy ma następującą postać: Każda linia zawiera jednego osobnika. Osobnik charakteryzowany jest chromosomem, który jest przedstawiony jako ciąg liczb naturalnych rozdzielonych białymi znakami. Przykładowy plik wejściowy zawierający populację złożoną z czterech osobników:
8 2 56 9 8 6 25 45
6 92 43 7 98
2 4 34 5
23 66 22 8 34 6 1 6 8 7 88
Jedynie co mam to wypisywanie plików. Dalej nie mam pomysłu na losowanie i dzielenie.
#include <iostream>
#include <vector>
#include <string>
#include<sstream>
#include <fstream>
using namespace std;
struct osoba
{
vector<int> frag;
};
int main()
{
odczyt();
}
void odczyt()
{
fstream plikw;
plikw.open("Plik txt chrom.txt");
if (plikw.good() == false) cout << "Plki jest w zlym folderze, lub nie istnieje";
vector<osoba> chromosom;
for (string line; getline(plikw, line); cout << endl)
{
stringstream stem(line);
chromosom.emplace_back();
for (int temp; stem >> temp; cout << temp << ' ') chromosom.back().frag.push_back(temp);
}
plikw.close();
}
void mieszanie()
{
???????
}
Prosiłbym o pomoc i wyjaśnienie.
Ma to działać na vektorach i strukturze osoba.