Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <random>
- #include <cstdlib>
- #include <iterator>
- #include <ctime>
- #include "Sign.h"
- #include "Edge.h"
- #include <random>
- std::vector<Sign> Sig;
- std::vector<Edge> Wierz;
- int iloscWierzcholkow = 0;
- int iloscKrawedzi = 0;
- float T = 1000000.0;
- float kara = 1000000.0;
- int *LosowaPermutacja = new int[16];
- float sumaLosowej = 0.0;
- float fi = 0.99;
- void Data(const std::string& a)
- {
- Sign s;
- Edge w;
- std::ifstream plik;
- plik.open(a.c_str());
- if (plik.good())
- {
- plik >> iloscWierzcholkow;
- for (int i = 0; i < iloscWierzcholkow; i++)
- {
- plik >> s;
- Sig.push_back(s);
- }
- plik >> iloscKrawedzi;
- for (int i = 0; i < iloscKrawedzi; i++)
- {
- plik >> w;
- Wierz.push_back(w);
- }
- }
- else
- {
- std::cout << "Brak pliku" << std::endl;
- }
- plik.close();
- }
- void PrintWczytaneDane()
- {
- for (int i = 0; i < Wierz.size(); i++)
- {
- std::cout << Wierz[i].pierwszy;
- std::cout << " - ";
- std::cout << Wierz[i].drugi;
- std::cout << " waga = ";
- std::cout << Wierz[i].waga << std::endl;
- }
- }
- int LosujWierzcholek()
- {
- int wybor = 0;
- int* tmpTab = new int[iloscWierzcholkow];
- for (int i = 0; i < iloscWierzcholkow; i++)
- {
- tmpTab[i] = Sig[i].liczba;
- }
- wybor = (rand() % iloscWierzcholkow - 1);
- return tmpTab[wybor];
- }
- void LosujPermutacje(bool czyZapisac)
- {
- int wylosowanyWierzcholek = 0;
- int *Odwiedzone = new int[iloscWierzcholkow];
- int licznikTablicyOdwiedzonych = 0;
- long float suma = 0.0;
- int losowaPermutacja = 0;
- do {
- wylosowanyWierzcholek = LosujWierzcholek();
- for (int i = 0; i < iloscWierzcholkow; i++)
- {
- if (Odwiedzone[i] == wylosowanyWierzcholek)
- {
- break;
- }
- if (i + 1 == iloscWierzcholkow)
- {
- Odwiedzone[licznikTablicyOdwiedzonych] = wylosowanyWierzcholek;
- licznikTablicyOdwiedzonych++;
- }
- }
- } while (licznikTablicyOdwiedzonych != 16);
- for (int i = 0; i < iloscWierzcholkow; i++)
- {
- for (int j = 0; j < Wierz.size(); j++)
- {
- if (i != iloscWierzcholkow - 1)
- {
- //sumujemy wagi krawedzi miedzy elementami
- if ((Odwiedzone[i] == Wierz[j].pierwszy && Odwiedzone[i + 1] == Wierz[j].drugi) || (Odwiedzone[i] == Wierz[j].drugi && Odwiedzone[i + 1] == Wierz[j].pierwszy))
- {
- suma += Wierz[j].waga;
- break;
- }
- else if (j + 1 == Wierz.size())
- {
- suma += kara;
- }
- }
- else if (i == iloscWierzcholkow - 1)
- {
- //sumujemy wagi elementow ostatniego z pierwszym
- if ((Odwiedzone[i] == Wierz[j].pierwszy && Odwiedzone[0] == Wierz[j].drugi) || (Odwiedzone[i] == Wierz[j].drugi && Odwiedzone[0] == Wierz[j].pierwszy))
- {
- suma += Wierz[j].waga;
- break;
- }
- else if (j + 1== Wierz.size())
- {
- suma += kara;
- }
- }
- }
- }
- if (czyZapisac)
- {
- for (int i = 0; i < iloscWierzcholkow; i++)
- {
- LosowaPermutacja[i] = Odwiedzone[i];
- }
- sumaLosowej = suma;
- }
- //PERMUTACJE NA EKRAN
- //std::cout << std::endl;
- //for (int i = 0; i < iloscWierzcholkow; i++)
- //{
- // std::cout << Odwiedzone[i] << " ";
- //}
- //printf("Suma: %.0f\n", suma);//wyswietlamy duze liczby bez e do potegi
- }
- void PrintLosowaPermutacja()
- {
- std::cout << std::endl << "Wylosowano: ";
- for (int i = 0; i < iloscWierzcholkow; i++)
- {
- std::cout << LosowaPermutacja[i] << " ";
- }
- printf("Suma: %.0f\n", sumaLosowej);//wyswietlamy duze liczby bez e do potegi
- }
- float RandomFloat(float min, float max)
- {
- return (max - min) * ((((float)rand()) / (float)RAND_MAX)) + min;
- }
- bool PrzestawWierzcholki()
- {
- int tmpPierwszy = 0;
- int tmpDrugi = 0;
- float tmpSuma = sumaLosowej;
- float roznica = 0.0;
- int pierwszy = 0;
- int drugi = 0;
- float prawdopodobienstwoAkceptacji = 0.0;
- float prawdopodobienstwo = 0.0;
- bool status = false;
- //Losujemy dwa wierzcholki do przestawienia
- pierwszy = (rand() % iloscWierzcholkow - 1);
- do
- {
- drugi = (rand() % iloscWierzcholkow - 1);
- } while (drugi==pierwszy);
- std::cout << std::endl << "Wybrano do przestawienia: " << pierwszy +1<< " Wartosc: " << LosowaPermutacja[pierwszy] << " i " << drugi +1<< " Wartosc: " << LosowaPermutacja[drugi] << std::endl;
- tmpPierwszy = LosowaPermutacja[pierwszy];
- tmpDrugi = LosowaPermutacja[drugi];
- LosowaPermutacja[pierwszy] = LosowaPermutacja[drugi];
- LosowaPermutacja[drugi] = tmpPierwszy;
- //Liczymy nowa sume
- sumaLosowej = 0.0;
- for (int i = 0; i < iloscWierzcholkow; i++)
- {
- for (int j = 0; j < Wierz.size(); j++)
- {
- if (i != iloscWierzcholkow - 1)
- {
- //sumujemy wagi krawedzi miedzy elementami
- if ((LosowaPermutacja[i] == Wierz[j].pierwszy && LosowaPermutacja[i + 1] == Wierz[j].drugi) || (LosowaPermutacja[i] == Wierz[j].drugi && LosowaPermutacja[i + 1] == Wierz[j].pierwszy))
- {
- sumaLosowej += Wierz[j].waga;
- break;
- }
- else if (j + 1 == Wierz.size())
- {
- sumaLosowej += kara;
- }
- }
- else if (i == iloscWierzcholkow - 1)
- {
- //sumujemy wagi elementow ostatniego z pierwszym
- if ((LosowaPermutacja[i] == Wierz[j].pierwszy && LosowaPermutacja[0] == Wierz[j].drugi) || (LosowaPermutacja[i] == Wierz[j].drugi && LosowaPermutacja[0] == Wierz[j].pierwszy))
- {
- sumaLosowej += Wierz[j].waga;
- break;
- }
- else if (j + 1 == Wierz.size())
- {
- sumaLosowej += kara;
- }
- }
- }
- }
- //Liczymy roznice sum krawedzi
- roznica = sumaLosowej - tmpSuma;
- printf("Roznica: %.0f\n", roznica); //wyswietlamy duze liczby bez e do potegi
- //Liczymy prawdopodobienstwo dla przestawienia
- prawdopodobienstwo = pow(exp(1.0), ((-1.0) * (roznica / T)));
- std::cout <<"Prawdopodobienstwo przestawienia: " <<prawdopodobienstwo <<std::endl;
- //Liczymy Prawdopodobienstwo akceptacji
- prawdopodobienstwoAkceptacji = RandomFloat(0.0, 1.0);
- std::cout << "Prawdopodobienstwo akceptacji: " << prawdopodobienstwoAkceptacji << std::endl;
- if ((roznica < 0) || (prawdopodobienstwoAkceptacji <= prawdopodobienstwo))
- {
- //jesli akceptujemy to zostawiamy
- T = fi * T;
- std::cout << "Temperatura: " << T << std::endl;
- return true;
- }
- else
- {
- //Jesli nie akceptujemy to przywracamy stan poprzedni
- LosowaPermutacja[pierwszy] = tmpPierwszy;
- LosowaPermutacja[drugi] = tmpDrugi;
- sumaLosowej = tmpSuma;
- T = fi * T;
- std::cout << "Temperatura: " << T << std::endl;
- return false;
- }
- }
- int main()
- {
- srand(time(NULL));
- int losowa = 0;
- int i = 0;
- Data("plik.txt"); // Wczytujemy pliik
- PrintWczytaneDane();// Wczytany plik na ekran
- int j = 0;
- /*do {*/
- i = 0;
- j++;
- for (int i = 0; i < 1000; i++)
- {
- losowa = std::rand() % 999 + 1;
- if (i == losowa)LosujPermutacje(true); // Losujemy 1000 permutacji z krawedzi i liczymy sume krawedzi
- else LosujPermutacje(false);
- }
- PrintLosowaPermutacja();
- do {
- i++;
- if (PrzestawWierzcholki())
- {
- std::cout << std::endl << "------------------------------AKCEPTACJA ITERACJA: "<<i<<"------------------------------" << std::endl;
- PrintLosowaPermutacja();
- }
- else
- {
- std::cout << std::endl << "----------------------------BRAK AKCEPTACJI ITERACJA: " << i << "---------------------------" << std::endl;
- PrintLosowaPermutacja();
- }
- } while (sumaLosowej > 3000);
- PrintLosowaPermutacja();
- //} while (j != 100);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement