Paweł Jakubik, nr indeksu: 214764 5.11.2011
Laboratorium z Teorii i metod optymalizacji – projekt
Opracowanie programu unifikacji
dla indywidualnie przydzielonego zadania.
Opracować program realizujący zadanie ogólne (tzn. opisane w przykładzie 1). Program powinien poprawnie działać także dla dowolnych danych podawanych z zewnętrznego pliku Dane.txt. Wyniki powinny być generowane do pliku zewnętrznego wyniki.txt wraz z komunikatami o wynikach pośrednich (wybory + wartość kosztu). Sprawdzenie poprawności dla danych z przykładu oraz danych zmodyfikowanych w ten sposób, że koszty magazynowania są 50-krotnie większe dla dwóch pierwszych typów transformatorów. Język dowolny z grupy: C, C++, C#, Java, Pascal, Fortran, Visual Basic, nawet Basic. Niedozwolony: Matlab.
Udało się wykonać następujące punkty:
Dowolne dane obejmują zarówno liczbę obwodów i wymagane obciążenie, jak tez mogą być dowolne transformatory o różnych mocach i różnych kosztach.
Liczba kolumn tez może być dowolna.
Pliki danych i wyników to pliki tekstowe.
Jako wyniki pośrednie maja być wypisane wszystkie macierze, komunikaty tekstowe o wyborze/odrzuceniu transformatora w danym stopniu pośrednim wraz z aktualnym kosztem, a na koniec komunikat o wyborze końcowym i koszt końcowy.
Program nie musi działać w środowisku graficznym, ale może.
Dane dołączone do zadania mają następującą postać:
Liczba obwodów | 3 | 5 | 2 | 4 |
obciążenie | 300 | 400 | 600 | 700 |
Moc trafo | Koszty roczne trafo | Rezerwa | ||
400 | 96 | 97 | 188 | 190 |
630 | 97 | 103 | 110 | 200 |
800 | 110 | 114 | 120 | 122 |
Wykonanie zadania:
Program1 został napisany w języku C przy użyciu programu Dec-C++ 4.9.9.2. W pliku dane.txt (lub innym wybranym przez użytkownika) w pierwszym wierszu powinny znajdować się wymiary badanej macierzy. W badanym przykładzie macierz jest wymiarów 5x6, gdzie 5 odpowiada ilości wierszy a 6 ilości kolumn. W kolejnym wierszu pliku powinna znajdować się liczba obwodów dla konkretnego obciążenia. Wartość tego obciążenia wpisujemy wiersz niżej. Następne wiersze to moc transformatora, odpowiadające im koszty roczne transformatora i koszty rezerwy.
W tym miejscu należy napomnieć, iż należy wiersze odpowiadające ilości obwodów i obciążenia uzupełnić odpowiednio o zera, aby dane te znajdowały się w kolumnie odpowiadających im kosztów rocznych.
Dla badanego przykładu poprawnie stworzony plik dane.txt2 powinien wyglądać następująco:
5 6
0 3 5 2 4 0
0 300 400 600 700 0
400 96 97 188 190 15
630 97 103 110 200 60
800 110 114 120 122 80
Dane wynikowe zapisywane są w pliku wynik.txt (lub innym wybranym przez użytkownika). W pliku tym podane są kolejne macierze kosztów (koszty roczne pomnożone przez odpowiednią wartość ilości obwodów), wartości rezerw, macierze D i macierze c wartości odrzucenia. Po każdorazowym wykonaniu obliczeń wyświetlany jest komunikat, która składowa macierzy c jest odrzucana. Po wykonaniu wszystkich kroków podany jest komunikat o wybranych rodzajach transformatorów i koszcie końcowym.
Po wprowadzeniu danych zadania plik wynik.txt zawiera następujące dane:
Macierz 1: wymiary 5x6
Macierz kosztow=
288 485 376 760
291 515 220 800
330 570 240 488
Macierz a=
15
60
80
Koszty utrzymania:1636
Macierz D=
3 30 0 0
0 0 20 0
0 0 0 272
Macierz c=
33
20
272
Wyrzucamy skladowa wektora C:20 dla mocy 630
KOLEJNY KROK:
Macierz kosztow=
288 485 376 760
330 570 240 488
Macierz a=
15
80
Koszty utrzymania:1596
Macierz D=
42 85 0 0
0 0 136 272
Macierz c=
127
408
Obliczenia zakonczone. Wynik koncowy to:
Koszty koncowe: 1596
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 300
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 400
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 600
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 700
Po otrzymaniu powyższych wyników należy sprawdzić poprawność otrzymanych danych poprzez zmodyfikowanie kosztów magazynowania dla pierwszych dwóch typów transformatora były 50 razy większe. Nasz plik wygląda następująco:
5 6
0 3 5 2 4 0
0 300 400 600 700 0
400 96 97 188 190 750
630 97 103 110 200 3000
800 110 114 120 122 80
W rezultacie otrzymujemy wynik (dane pośrednie umieszczone zostały w pliku wynik50.txt dostarczonym do sprawozdania):
Obliczenia zakonczone. Wynik koncowy to:
Koszty koncowe: 1708
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 300
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 400
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 600
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 700
Widać, że program działa poprawnie dla tego przypadku, gdyż tylko ten transformator spełnia założenia nieodrzucenia.
Kolejnym krokiem jest sprawdzenie poprawności działania naszego programu dla przykładu 5.1 umieszczonego w książce „Podstawy i metody optymalizacji”. Wynik końcowy to (pełny umieszczony został w pliku wynik_przykład.txt):
Obliczenia zakonczone. Wynik koncowy to:
Koszty koncowe: 1616
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 300
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 400
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 600
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 700
Zgadza się to z wynikami uzyskanymi w książce.
Dla kosztów magazynowania 50 razy większych dla dwóch pierwszych typów transformatora (plik wynik_przyklad50.txt):
Obliczenia zakonczone. Wynik koncowy to:
Koszty koncowe: 1718
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 300
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 400
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 600
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 700
Wykonane próby dodatkowe:
Próba wykonana dla przykładu 5.2 (przyklad52.txt):
5 6
0 2 5 3 4 0
0 300 400 600 700 0
400 94 97 188 190 150
630 97 103 110 200 600
800 110 114 120 122 800
Otrzymujemy wynik (wynik_przyklad52.txt):
Koszty koncowe: 2147
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 300
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 400
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 600
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 700
Rozszerzamy nasz przykład o dodatkowy transformator o mocy 900 kVA (plik dane_1.txt).
6 6
0 3 5 2 4 0
0 300 400 600 700 0
400 96 97 188 190 15
630 97 103 110 200 60
800 110 114 120 122 80
900 250 72 140 150 100
Otrzymujemy wynik końcowy (wynik_1.txt):
Obliczenia zakonczone. Wynik koncowy to:
Koszty koncowe: 1571
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 300
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 600
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 700
Nalezy wybrac transformator o mocy 900 kVA dla obciazenia 400
W jednej z kolumn w dwóch wierszach wstawiamy dwie te same wartości. Przykładowe dane (dane_2.txt):
6 6
0 3 5 2 4 0
0 300 400 600 700 0
400 96 97 188 190 15
630 97 103 110 200 60
800 110 114 120 122 80
900 110 72 140 150 100
W wyniku takiej operacji otrzymujemy wynik uwzględniający wszystkie obciążenia:
Obliczenia zakonczone. Wynik koncowy to:
Koszty koncowe: 1571
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 300
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 600
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 700
Nalezy wybrac transformator o mocy 900 kVA dla obciazenia 400
Dodanie jednej kolumny do danych z otrzymanego zadania (dane_3.txt)
5 7
0 3 5 2 4 3 0
0 300 400 600 700 800 0
400 96 97 188 190 210 15
630 97 103 110 200 220 60
800 110 114 120 122 180 80
Otrzymany wynik:
Obliczenia zakonczone. Wynik koncowy to:
Koszty koncowe: 2136
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 300
Nalezy wybrac transformator o mocy 400 kVA dla obciazenia 400
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 600
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 700
Nalezy wybrac transformator o mocy 800 kVA dla obciazenia 800
Przypadek dla którego koszty w kolejnym kroku są większe niż koszty w kroku poprzednim.
Niestety w obecnych próbach nie udało nam się otrzymać wzrostu kosztów w kolejnym kroku. Jednak program został tak skonstruowany, aby w takim przypadku wypisać odpowiedni komunikat oraz za wynik końcowy podać dane z poprzedniego kroku.
Wnioski:
Stworzony program wyrzuca poprawne wyniki dla danych otrzymanych wraz z treścią zadania, jak i dla danych z przykładu umieszczonej w książce „Podstawy metod optymalizacji” – oba zostały również zmodyfikowane o wartości dwóch pierwszych kosztów rezerw.
Dodatkowo została wykonana próba dla przykładu 5.2, która dała nam pomyślny wynik.
Poprawność działa została także sprawdzona dla przypadków o zwiększonej ilości kolumn i wierszy.
W momencie otrzymania w procesie unifikacji wartości kosztów zostaną zwiększone względem otrzymanych poprzednich, program wyrzuca odpowiedni komunikat i za wynik końcowy podaje wartość wybranych transformatorów dla poprzedniego kroku.