• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dzielenie elementów vektora.

Object Storage Arubacloud
0 głosów
468 wizyt
pytanie zadane 13 grudnia 2020 w C i C++ przez Alphaaa Nowicjusz (120 p.)
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include<sstream>
#include<time.h>
const std::string cel = "2 4 24 2 8 65 43";
struct osobnik
{
	std::vector<int> allel;
};
void wczytywanie()
{
	std::fstream plik;
	plik.open("Chromosom.txt");
	if (plik.good() == false) std::cout << "Plki jest umieszczony w zlym folderze, lub nie istnieje";
	std::vector<osobnik> chromosom;
	std::cout << "Wszytkie osobniki : \n\n";
	for (std::string line; getline(plik, line); std::cout << std::endl)
	{
		std::stringstream ss(line);
		chromosom.emplace_back();
		for (int temp; ss >> temp; std::cout << temp << ' ') chromosom.back().allel.push_back(temp);
	}
	std::cout << "\n\nilosc elementow vektora : " << chromosom.size();
	plik.close();


}



int main()
{
	wczytywanie();

}

Muszę zrobić algorytm genetyczny. Niestety nie wiem jak zrobić funkcję losowania z mieszaniem par rodziców ze sobą. 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.

W konsoli wypisuje takie dane. 

Wszytkie osobniki :

2 9 84 9 5 6 25 12
2 98 56 2 54
5 2
8 5 22 5 48 6 1 9 8 7 554 25 235 32


ilosc elementow vektora : 4
C:\Users\48882\source\repos\lab 5 1\Debug\lab 5 1.exe (proces 15940) zakończono z kodem 0.
Aby automatycznie zamknąć konsolę po zatrzymaniu debugowania, włącz opcję Narzędzia -> Opcje -> Debugowanie -> Automatycznie zamknij konsolę po zatrzymaniu debugowania.
Naciśnij dowolny klawisz, aby zamknąć to okno...

Proszę o wytłumaczenie jak w ogóle mam się za to zabrać. Z tego co wiem to co mam zakodowane powinno być poprawne. 

2 odpowiedzi

0 głosów
odpowiedź 13 grudnia 2020 przez tangarr Mędrzec (154,860 p.)
Z góry zaznaczam, że nie jestem pewien czy dobrze zrozumiałem problem.

Zabrałbym się za to zadanie następująco:
1. Utworzyłbym dwa wektory przechowujące fragmenty łańcuchów z genami. Nazwałbym je poczatki i konce.
2. Dla każdego osobnika wylosowałbym punk złamania z przedziału od 1 do długość-2 (żeby w obu częściach zawsze znajdował się przynajmniej jeden element) i dodał odpowiadające mu fragmenty do wektorów poczatki i konce.
3. Potem bym losowo przemieszał jeden z wektorów
4. Na koniec bym złączył odpowiadające sobie części z wektorów poczatki i konce.
0 głosów
odpowiedź 13 grudnia 2020 przez mokrowski Mędrzec (155,460 p.)

O takie działanie mutacji Ci chodziło?

#include <vector>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>

std::vector<int> cross_genom(const std::vector<int>& parent1, const std::vector<int>& parent2) {
    static struct _ { _() { srand(time(nullptr)); } } s;
    auto split_index_parent1 = rand() % parent1.size();
    auto split_index_parent2 = rand() % parent2.size();
    std::vector<int> result;
    result.reserve(split_index_parent1 + (parent2.size() - split_index_parent2));
    result.assign(parent1.cbegin(), parent1.cbegin() + split_index_parent1);
    std::copy(parent2.cbegin() + split_index_parent2, parent2.cend(), back_inserter(result));
    return result;
}

int main() {
    auto v1 = std::vector<int>({1, 2, 3, 4, 5, 6, 7, 8, 9});
    auto v2 = std::vector<int>({10, 20, 30 ,40, 50, 60, 70, 80, 90});
    auto v3 = cross_genom(v1, v2);
    for (const auto v: v3) {
        std::cout << v << ' ';
    }
    std::cout << '\n';
}

 

komentarz 13 grudnia 2020 przez Alphaaa Nowicjusz (120 p.)
No tak, chodzi o coś takiego, ale co w przypadku jak mamy np. 10 linijek z pliku wejściowego czyli 10 chromosomów i musimy mieć w sumie 5 takich par rodziców.
komentarz 14 grudnia 2020 przez mokrowski Mędrzec (155,460 p.)
No a gdzie trudność? Nie umiesz wczytać danych z pliku? Masz problem z wylosowaniem par? Czy jak mi podpowiada intuicja, składasz z fragmentów odpowiedzi całe zadanie?

Podobne pytania

0 głosów
1 odpowiedź 207 wizyt
pytanie zadane 19 kwietnia 2016 w C i C++ przez niezalogowany
0 głosów
4 odpowiedzi 1,072 wizyt
pytanie zadane 6 grudnia 2015 w C i C++ przez DualOxygen Użytkownik (810 p.)
0 głosów
1 odpowiedź 157 wizyt
pytanie zadane 24 sierpnia 2022 w C i C++ przez polandonion Mądrala (7,040 p.)

92,614 zapytań

141,465 odpowiedzi

319,773 komentarzy

61,996 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...