Lista z losową ilością list (które posiadają losową ilość elementów)

0

Witam mam do napisania o to taki program

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. Osobniki, dla których wartość f < w (gdzie w jest progiem wymierania), są usuwane z populacji. Osobniki, dla których f > r (gdzie r jest progiem rozmnażania) są klonowane. A osobniki, dla których w 6 f 6 r pozostają w populacji, ale się nie rozmnażają.

Program uruchamiany jest z linii poleceń z wykorzystaniem następujących przełączników (kolejność przełączników jest dowolna):

  • i plik wejściowy z populacją
  • o plik wyjściowy z populacją
  • w współczynnik wymierania w ∈ [0, 1]
  • r współczynnik rozmnażania r ∈ [0, 1]
  • p liczba pokoleń p
  • k liczba k par osobników losowanych do krzyżowania

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:

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

Plik wyjściowy ma identyczny format.

i mam do tego narzucone o takie wymagania:

  1. Celem projektu jest przećwiczenie implementacji i korzystania z dynamicznych
    struktur danych (np. listy, drzewa) i zarządzania pamięcią w programie. Warunkiem sine qua non jest użycie w programie tych struktur.
  2. Użycie bibliotecznych kontenerów (np. vector, list itd.) ani dynamicznie alokowanych tablic nie spełnia warunku z pkt. 1.
  3. Typu string można używać wyłącznie do przechowywania napisów, np. nazw plików itd. Nie jest dopuszczalne użycie tego typu do przechowywania ciągów danych,
    np. ciągu liczb.
  4. Przed implementacją konieczna jest akceptacja struktury danych przez prowadzącego zajęcia.
  5. Program powinien być podzielony na pliki z deklaracjami (.h) i definicjami
    (
    .cpp).
  6. Wszystkie funkcje muszą być skomentowane w doxygenie.

Ogólnie mówiąc mam problem z wymyśleniem funkcji która wygeneruje mi listę z losową ilością elementów (osobników) a każdy z elementów będzie kolejną listą z losową ilością liczb oraz z tym jak listy mają pękać w losowych punktach i wymieniać się z inną losową częścią w innej liście.
Bardzo prosił bym o pomoc w napisaniu tych kilku funkcji z resztą już sobie dam radę.

0

Lista, to struktura składająca się z 2 pól:

  • wartości
  • wskaźnika na kolejny element listy

Generowanie listy, to nic innego niż N razy dodanie czegoś na początek listy. Chyba dasz sobie z tym radę.

0

Spróbowałem zrobić ten projekt za pomocą 1 listy lecz nie da się go tak wykonać, a od paru dni nie mogę wykombinować jak włożyć jedną listę do drugiej (nie mogę zrozumieć jak powinna wyglądać struktura listy zawierająca drugą listę.
Tak wygląda struktura na podstawie, której zrobiłem listę generującą mi osobnika

struct osobnik
{
	int chromosom ;
	osobnik * next;
};

Bardzo proszę o pomoc i wytłumaczenie mi jak powinna wyglądać struktura dla listy mającej x osobników, a z resztą już sobie poradzę.

0

Jako element listy przechowuj sobie kolejną listę. Najlepiej będzie zrobić to przy pomocy szablonu:

template <typename T>
struct list {
  T value;
  list<T>* next;
}

typedef list<int> osobnik;
typedef list<osobnik*> populacja;
0

Przerabiając Twój przykład:

struct gen
{
    int wartosc;
    gen * next;
};

struct osobnik
{
    gen * chromosom;
    osobnik * next;
};

Chromosom to lista wartości (genów). Populacja to lista osobników.

0

Mam do wykonania ten sam projekt, jeżeli jeszcze tego nie oddałeś to u mnie listy wyglądają tak

//struktura listy dwukierunkowej, deklaracja typu elementu listy
struct generation
{
	generation *next, *prev;
	int key;
};
//deklaracja typu klasy listy dwukierunkowej

struct dList
{
	int z=0;
	generation *front, *back;
	//konstruktor
		dList()
		{
			front = back = nullptr;
		}
		dList&operator=(const dList&x)
		{
			this->~dList();
			new(this)dList(x);
			return *this;
		}
		dList(const dList&x)
		{
			front = back = nullptr;
			for (generation*g=x.front;g;g=g->next)
			{
				push_back(g->key);
			}
		}
	//destruktor
	~dList()
	{
		
		generation *p;

		while (front)
		{
			p = front->next;
			delete front;
			front = p;
		}
		
	}
	//dodaje element na końcu listy
	void push_back(int p)
	{
		if (front == nullptr)
		{
			front = new generation;
			front->key = p;
			front->prev = nullptr;
			front->next = nullptr;
			back = front;
			z++;
		}
		else
		{
			back->next = new generation;
			back->next->key = p;
			back->next->prev = back;
			back->next->next = nullptr;
			back = back->next;
			z++;
		}
	}
	//dodaje element na początku listy
	void push_start(int p)
	{
		if (back == nullptr)
		{
			front = new generation;
			front->key = p;
			front->prev = nullptr;
			front->next = nullptr;
			back = front;
			z++;
		}
		else
		{
			front->prev = new generation;
			front->prev->key = p;
			front->prev->next = front;
			front->prev->prev = nullptr;
			front = front->prev;
			z++;
		}
	}

};
//struktura odpowiedzialna za przypisanie jednemu osobnikowi listy jego chromosomów
struct man
{
	dList genotype;
	man *next, *prev;
};

struct population
{
	man *front, *back;
	int z=0;
	//konstruktor
	population()
	{
		front = back = nullptr;
	}
	//destruktor
	~population()
	{
		man *p;

		while (front)
		{
			p = front->next;
			delete front;
			front = p;
		}
	}
	//dodaje element na koniec listy
	void push_in(dList p)
	{
		
		if (front == nullptr)
		{
			front = new man;
			front->genotype = p;
			front->prev = nullptr;
			front->next = nullptr;
			back = front;
			z++;
		}
		else
		{
			back->next = new man;
			back->next->genotype = p;
			back->next->prev = back;
			back->next->next = nullptr;
			back = back->next;
			z++;
		}

	}
};

mam nadzieję, że pomogło

1 użytkowników online, w tym zalogowanych: 0, gości: 1