Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <conio.h>
- #include <cstdlib>
- #include <ctime>
- #include <string>
- #include <stdlib.h>
- #include <stdio.h>
- using namespace std;
- struct prz
- {
- int czas;
- int beg;
- int end;
- };
- struct inst
- {
- int czas_op1;
- int czas_op2;
- int maszyna_op1;
- int maszyna_op2;
- bool op1=false;
- bool op2 = false;
- };
- class gen
- {
- public:
- int **rozwiazanie;
- int **czas, czas_m1, czas_m2;
- int ile;
- int nr_ins;
- gen()
- {
- }
- gen(int nn,int nr)
- {
- rozwiazanie = new int *[2];
- for (int i = 0; i <= 2; i++)
- rozwiazanie[i] = new int[nn];
- for (int i = 0; i <= nn; i++)
- {
- rozwiazanie[1][i] = 0;
- rozwiazanie[2][i] = 0;
- }
- czas = new int*[2];
- for (int i = 0; i <= 2; i++)
- czas[i] = new int[nn];
- for (int i = 0; i <= nn; i++)
- {
- czas[1][i] = 0;
- czas[2][i] = 0;
- }
- ile = nn;
- nr_ins = nr;
- }
- void inicializuj(int **insta)
- {
- int mm = 0, zad1, zad2, dodano = 0, dd = 0;
- for (int i = 1; i <= ile; i++)
- {
- zad1 = rand() % ile + 1;
- zad2 = rand() % ile + 1;
- while (zad1 == zad2)
- zad1 = rand() % 50 + 1;
- dd++;
- while (dodano < dd)
- {
- if (insta[2][zad1] == 1 && insta[3][zad1] == 0)//czy jest to operacja 1 zad1 i czy zostala wykonana //maszyna1
- {
- rozwiazanie[1][i] = zad1;
- insta[3][zad1] = 1;
- dd = ++dodano;
- mm = 1;
- czas[1][i] = insta[1][zad1];
- break;
- }
- else if (insta[5][zad1] == 1 && insta[6][zad1] == 0)//maszyna2
- {
- rozwiazanie[2][i] = zad1;
- insta[6][zad1] = 1;
- dd = ++dodano;
- mm = 2;
- czas[2][i] = insta[4][zad1];
- break;
- }
- else if (insta[2][zad1] == 2 && insta[3][zad1] == 0)//czy jest to operacja 2 zad1 i czy zostala wykonana // maszyna1
- {
- rozwiazanie[1][i] = zad1;
- insta[3][zad1] = 1;
- dd = ++dodano;
- mm = 1;
- czas[1][i] = insta[1][zad1];
- break;
- }
- else if (insta[5][zad1] == 2 && insta[6][zad1] == 0)//maszyna2
- {
- rozwiazanie[2][i] = zad1;
- insta[6][zad1] = 1;
- dd = ++dodano;
- mm = 2;
- czas[2][i] = insta[4][zad1];
- break;
- }
- zad1 = rand() % ile + 1;
- while (zad1 == zad2)
- zad1 = rand() % 50 + 1;
- }
- dd++;
- while (dodano < dd)
- {
- if (mm == 1)/////////////////////////////////////////////////////////////////////////////////w zad 1 byla maszyna 1
- {
- if (insta[5][zad2] == 1 && insta[6][zad2] == 0)//maszyna2
- {
- rozwiazanie[2][i] = zad2;
- insta[6][zad2] = 1;
- dd = ++dodano;
- czas[2][i] = insta[4][zad2];
- break;
- }
- else
- if (insta[5][zad2] == 2 && insta[6][zad2] == 0)//maszyna2
- {
- rozwiazanie[2][i] = zad2;
- insta[6][zad2] = 1;
- dd = ++dodano;
- czas[2][i] = insta[4][zad2];
- break;
- }
- }
- else/////////////////////////////////////////////////////////////////////////////////////////w zad 1 byla maszyna 2
- {
- if (insta[2][zad2] == 1 && insta[3][zad2] == 0)//czy jest to operacja 1 zad2 i czy zostala wykonana // maszyna1
- {
- rozwiazanie[1][i] = zad2;
- insta[3][zad2] = 1;
- dd = ++dodano;
- czas[1][i] = insta[1][zad2];
- break;
- }
- else
- if (insta[2][zad2] == 2 && insta[3][zad2] == 0)//czy jest to operacja 2 zad2 i czy zostala wykonana // maszyna1
- {
- rozwiazanie[1][i] = zad2;
- insta[3][zad2] = 1;
- dd = ++dodano;
- czas[1][i] = insta[1][zad2];
- break;
- }
- }
- zad2 = rand() % ile + 1;
- }
- }
- cout << endl << "inicializacja zakonczona nr"<< this->nr_ins << endl;
- //**********************czyszczenie dodanych
- for (int i = 1; i <= ile; i++)
- {
- insta[3][i] = 0;
- insta[6][i] = 0;
- }
- }
- void crossover(gen b)
- {
- }
- void mutacja()
- {
- }
- void kary()
- {
- for (int i = 1; i <= ile; i++)
- {
- czas_m1 += czas[1][i];
- czas_m2 += czas[2][i];
- }
- }
- void wypisz()
- {
- cout << "\ninit nr"<<nr_ins<<"\nM1: ";
- for (int i = 1; i <= ile; i++)
- {
- cout << rozwiazanie[1][i] << " ";
- }
- cout << "\tczas: "<<czas_m1;
- cout << "\nM2: ";
- for (int i = 1; i <= ile; i++)
- {
- cout << rozwiazanie[2][i] << " ";
- }
- cout << "\tczas: "<<czas_m2;
- }
- };
- void generator();
- void program();
- void save();
- int main()
- {
- int zad;
- srand(time(NULL));
- cout << "1. Generuj instancje\n";
- cout << "2. Rozwiaz instancje\n";
- cin >> zad;
- switch (zad)
- {
- case 1:generator(); break;
- case 2:program(); break;
- }
- _getch();
- return 0;
- }
- void generator()
- {
- int ile, ile_przerw, rad1 = 0, rad2 = 0, max1 = 0, max2 = 0,test;
- inst *instancja;
- fstream plik;
- string nazwa;
- cout << "podaj nazwe dla pliku:\n";
- cin >> nazwa;
- nazwa += ".txt";
- cout << "\npodaj ilosc zadan:\n";
- cin >> ile;
- //**********************************************instancja
- instancja = new inst[ile];
- for (int i = 0; i <= ile; i++)//losowe wartosci dla zadan
- {
- instancja[i].czas_op1 = rand() % 20 + 1; //czas dla op1 zad i
- instancja[i].czas_op2 = rand() % 20 + 1; //czas dla op2 zad i+
- instancja[i].maszyna_op1 = rand() % 2 + 1;
- if (instancja[i].maszyna_op1 == 1)
- instancja[i].maszyna_op2 = 2;
- else
- instancja[i].maszyna_op2 = 1;
- }
- //*********************************************przerwy
- test = ile / 2;
- ile_przerw = rand()%test + 2;
- cout << ile_przerw;
- prz *przerwy = new prz[ile_przerw];
- for (int i = 0; i <= ile; i++)
- {
- if (instancja[i].maszyna_op1 == 2)
- max2 += instancja[i].czas_op1;
- else
- max2 += instancja[i].czas_op2;
- }
- max1 = max2 / ile_przerw;
- for (int i = 0; i <= ile_przerw; i++)
- {
- rad2 = rand() % max1 + (rad2 + rad1);// kiedy zaczyna sie przerwa
- rad1 = rand() % (max1 / 2);//czas trwania przerwy
- przerwy[i].czas = rad1;
- przerwy[i].beg = rad2;
- przerwy[i].end = rad2 + rad1;
- }
- //********************************************zapis do pliku
- plik.open(nazwa.c_str(), ios::out);
- if (!plik.is_open())
- cout << "error otwarcia pliku";
- else
- {
- plik << ile << "\n";
- for (int i = 0; i <= ile; i++)
- {
- plik << instancja[i].czas_op1 << ";" << instancja[i].czas_op2 << ";" << instancja[i].maszyna_op1 << ";" << instancja[i].maszyna_op2 << "\n";
- }
- plik << ile_przerw << "\n";
- for (int i = 0; i <= ile_przerw; i++)
- {
- plik << i << ";" << przerwy[i].czas << ";" << przerwy[i].beg << ";" << przerwy[i].end << "\n";
- }
- plik.close();
- cout << "\nwygenerowano!\n";
- }
- //********************************************zwalnianie pamieci
- delete[] przerwy;
- delete[] instancja;
- }
- void save()
- {
- }
- void program()
- {
- fstream plik;
- string nazwa, buf;
- prz *przerwa;
- inst *instancja;
- bool insta = false, przer = false;
- int ile, ile_przerw;
- int **nowytyp;
- //*********************************************************************************************plik
- cout << "podaj nazwe pliku do otwarca(bez rozszerzenia):\n";
- cin >> nazwa;
- nazwa += ".txt";
- plik.open(nazwa.c_str(), ios::in);
- getline(plik, buf);//////////////////////////////////wczytanie instancji
- ile = atoi(buf.c_str());
- instancja = new inst[ile];
- nowytyp = new int*[6];
- for (int i = 0; i <= 6; i++)
- nowytyp[i] = new int[ile];
- for (int i = 0; i <= ile; i++)
- {
- getline(plik, buf, ';');
- instancja[i].czas_op1 = atoi(buf.c_str());
- getline(plik, buf, ';');
- instancja[i].czas_op2 = atoi(buf.c_str());
- getline(plik, buf, ';');
- instancja[i].maszyna_op1 = atoi(buf.c_str());
- getline(plik, buf);
- instancja[i].maszyna_op2 = atoi(buf.c_str());
- if (instancja[i].maszyna_op1 == 1)
- {
- nowytyp[1][i] = instancja[i].czas_op1;//maszyna1
- nowytyp[2][i] = 1;//nr op1
- nowytyp[3][i] =0 ;//dodana
- nowytyp[4][i] = instancja[i].czas_op2;//maszyna2
- nowytyp[5][i] = 2;//nr op2
- nowytyp[6][i] = 0;//nie doadna
- }
- else
- {
- nowytyp[1][i] = instancja[i].czas_op2;//maszyna1
- nowytyp[2][i] = 2;
- nowytyp[3][i] = 0;
- nowytyp[4][i] = instancja[i].czas_op1;//maszyna2
- nowytyp[5][i] = 1;
- nowytyp[6][i] =0 ;
- }
- }
- getline(plik, buf);////////////////////////////////wczytanie przerw
- ile_przerw = atoi(buf.c_str());
- przerwa = new prz[ile_przerw];
- for (int i = 0; i <= ile_przerw; i++)
- {
- getline(plik, buf, ';');
- getline(plik, buf, ';');
- przerwa[i].czas = atoi(buf.c_str());
- getline(plik, buf, ';');
- przerwa[i].beg = atoi(buf.c_str());
- getline(plik, buf);
- przerwa[i].end = atoi(buf.c_str());
- }
- plik.close();
- //********************************************************************************************inicjalizacja populacji
- gen **tab = new gen*[50];//inicjowanie tablicy populacji
- for (int i = 0; i <= 50; i++)
- {
- tab[i] = new gen(ile,i);
- }
- bool jest = false;
- for (int i = 0; i < 50; i++)
- {
- tab[i]->inicializuj(nowytyp);
- }
- for (int i = 0; i < 50; i++)
- {
- tab[i]->kary();
- tab[i]->wypisz();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement