mathPAD 2008, UMK, Toruń Krzysztof Leśniak
Transkrypt
mathPAD 2008, UMK, Toruń Krzysztof Leśniak
# KL 18,23,31vii2008 mathPAD 2008, UMK, Toruń Przykłady rozwiązywania zadań z użyciem komputera Krzysztof Leśniak Zadanie 3. Stolarz produkuje 2 rodzaje stolików: szachowy i nocny. Stolik szachowy kosztuje 440 zł, ale wymaga zużycia materiałów za 200 zł i wykonywany jest przez 6 godzin, podczas gdy stolik nocny kosztuje 260 zł, pochłania materiały o wartości 100 zł, a jego wykonanie zabiera 5 godzin pracy. Stolarz pracuje tygodniowo przez 5 dni po 8 godzin każdego dnia i nie może wydać na materiały więcej niz 1000 zł na tydzień. Wyznaczyć optymalny (najbardziej zyskowny) plan produkcji. koszt czas cena materiałó wykonania produktu w 200 zł 6h 440 zł stolik szachowy stolik 100 zł nocny max. 1000 zł 5h 260 zł 40 h ? (Źródło: "Matematyka się liczy" Podręcznik do kl.1liceum i technikum, WSiP 2002 ) Przygotowania Wypisujemy zależności dla zmiennych decyzyjnych: x - liczba stolików szachowych, y - liczba stolików nocnych koszt := 200*x + 100*y 200 × x + 100 × y czas := 6*x + 5*y 6×x+5× y //ograniczenia jawnie podane w zadaniu ograniczenia := [koszt <= 1000, czas <= 40]; //warunki nieujemności (ograniczenia naturalne) ograniczenia := append( ograniczenia, x>=0, y>=0 ); [ [ 200 × x + 100 × y £ 1000, 6 × x + 5 × y £ 40 ] 200 × x + 100 × y £ 1000, 6 × x + 5 × y £ 40, 0 £ x, 0 £ y cena := 440*x + 260*y 440 × x + 260 × y ] 1 440 × x + 260 × y zysk := cena - koszt 240 × x + 160 × y Niekonieczna acz użyteczna ilustracja graficzna Zbadajmy zakres wartości zmiennych decyzyjnych x, y solve(czas <= 40,x); solve(koszt <= 1000,x); 5× y x- 6 x Î - ¥, 20 3 y x - 2 x Î - ¥, 5 max(5,20/3) 20 3 float(%) 6.666666667 n ÅÅÅÅ ¯¯ ³ n Å ¯¯ ( ÅÅÅ ÅÅo Åio ] solve(czas <= 40,y); solve(koszt <= 1000,y); y - 6 5× x y Î - ¥, 8 n ÅÅÅÅ ¯¯ ( ]o { ¯ ( ]} y - 2 × x y Î - ¥, 10 Szkicujemy obszar decyzyjny z użyciem gotowej komendy ObszarD := linopt::plot_data([ograniczenia,zysk], [x, y]): plot(ObszarD); Maximize 240*x + 160*y y-axis 9 8 7 6 5 4 3 2 1 -1 1 -1 2 3 4 5 6 x-axis i na pieszo Obszar := plot::Inequality(ograniczenia, x=-1..8, y=-1..11, Mesh=[200,200], FillColorFalse=[1,1,1]): plot(Obszar); y 10 2 y 10 8 6 4 2 -1 1 2 3 4 5 6 7 8 x Następnie szkicujemy wykres funkcji celu (zysku) plotfunc3d(zysk, x=0..7, y=0..10) Zysk przy uwzględnieniu ograniczeń zysk_ogr := proc(x,y) local zogr; begin if ograniczenia then zogr:=zysk: else zogr:=0: end_if: return(zogr); end_proc: plotfunc3d(zysk_ogr, x=0..7, y=0..10); 3 Taka definicja funkcji zysku z ograniczeniami nie działa. Definiujemy teraz poprawnie funkcję zysku przy ograniczeniach zysk_ogr := proc(x,y) local zogr; begin if (x>=0) and (y>=0) and (200*x+100*y<=1000) and (6*x+5*y<=40) then zogr:=240*x+160*y: else zogr:=0: end_if: return(zogr); end_proc: i szkicujemy wykres: plotfunc3d(zysk_ogr, x=0..7, y=0..10, Mesh=[200,200]) 4 Rachunki poświadczające obserwacje geometryczne Znajdujemy wierzchołki obszaru decyzyjnego (wielokąta) W := linopt::corners([ograniczenia,zysk],[x,y]): Wierzcholki := W[1]; 0, 0 , 0, 8 , 52 , 5 , 5, 0 n [ ] [ ] hÅ i [ ] o Możemy też wypisać wszystkie punkty przecięcia linii ograniczających obszar decyzyjny korzystając z gotowej opcji All P := linopt::corners([ograniczenia,zysk],[x,y],All): Przeciecia := P[1]; 0, 0 , 0, 8 , 0, 10 , 52 , 5 , 5, 0 , 20 3,0 lub ,,na pieszo", jak poniżej. Linie ograniczające obszar decyzyjny (wielokąt) Linia := [x = 0, y = 0, czas = 40, koszt = 1000]: Linia[1]; Linia[4]; x=0 n[ ] [ ] [ ] hÅ i [ ] hÅÅÅ io 200 × x + 100 × y = 1000 Punkty przecięcia wszystkich linii PunktyPrzec := {}: //inicjalizacja pustej listy punktów for i from 1 to 4 do for j from 1 to i-1 do //kolejny punkt przecięcia linii prostych przeciecie := solve({Linia[i],Linia[j]},{x,y}): PunktyPrzec := PunktyPrzec union przeciecie: end_for: end_for: PunktyPrzec; x = 0, y = 0 , x = 5, y = 0 , x = 0, y = 8 , x = 0, y = 10 , x = 52 , y = 5 , x = 20 3 , y=0 n[ ][ ][ ][ ] h Å i h ÅÅÅ io Niejako przy okazji wyszukiwania wierzchołków system zbadał gdzie realizuje się maksimum W; print(Unquoted, "Punkt realizacji maksimum (x,y)= ".W[3]); print(Unquoted, "Wartość maksymalna = ".W[2]); 0, 0 , 0, 8 , 52 , 5 , 5, 0 , 1400, 52 , 5 Punkt realizacji maksimum (x,y)= [5/2, 5] Wartość maksymalna = 1400 hn[ ] [ ] hÅ i [ ]o hÅ ii Suche rozwiązanie Nie stosując żadnych wizualizacji bezpośrednio rozwiązujemy zagadnienie PL (tj. programowania liniowego) polegające na maksymalizacji zysku (wyrażonego funkcją celu) przy zadanych ograniczeniach linopt::maximize([ograniczenia, zysk]); 5 OPTIMAL, y = 5, x = 52 , 1400 h n Åo i Interpretacja wyniku: w przeciągu tygodnia należy produkować 5 stolików nocnych i 2 stoliki Interpretacja wyniku: w przeciągu tygodnia należy produkować 5 stolików nocnych i 2 stoliki szachowe oraz dodatkowy stolik szachowy raz na 2 tygodnie. delete ograniczenia, koszt, czas, cena, zysk, zysk_ogr, Obszar, ObszarD, Wierzcholki, W, Przeciecia, P, Linia, PunktyPrzec, przeciecie: 6