# KL 18,2,1vii2008 mathpad 2008, UMK, Toruń Przykłady rozwiązywania zadań z użyciem komputera Krzysztof Leśniak Zadanie. 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 godzin, podczas gdy stolik nocny kosztuje 20 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łówykonaniaproduktu w stolik 200 zł h 440 zł szachowy stolik 100 zł 5 h 20 zł nocny max. 1000 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 := *x + 5*y 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, x + 5 y 40] [200 x + 100 y 1000, x + 5 y 40, 0 x, 0 y] 1 cena := 440*x + 20*y 440 x + 20 y
440 x + 20 y zysk := cena - koszt 240 x + 10 y Niekonieczna acz użyteczna ilustracja graficzna Zbadajmy zakres wartości zmiennych decyzyjnych x, y solve(czas <= ³ 40,x); ÅÅio solve(koszt <= 1000,x); nx -ÅÅÅ xî 5 y -, 20 nx - y 2ÅÅ xî( -, 5] o ÅÅ max(5,20/) 20 float(%).7 solve(czas <= 40,y); solve(koszt <= 1000,y); ny - 5 x ÅÅÅ Î( 8] o x y Î( -, 10]} {y - 2 y -, Szkicujemy obszar decyzyjny z użyciem gotowej komendy ObszarD := linopt::plot_data([ograniczenia,zysk], [x, y]): plot(obszard); y-axis 9 8 7 5 4 2 1 Maximize 240*x + 10*y -1 1 2 4 5-1 x-axis i na pieszo Obszar := plot::inequality(ograniczenia, x=-1..8, y=-1..11, Mesh=[200,200], FillColorFalse=[1,1,1]): plot(obszar); 2 y 10
y 10 8 4 2-1 1 2 4 5 7 8 Następnie szkicujemy wykres funkcji celu (zysku) plotfuncd(zysk, x=0..7, y=0..10) x 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: plotfuncd(zysk_ogr, x=0..7, y=0..10);
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 (*x+5*y<=40) then zogr:=240*x+10*y: else zogr:=0: end_if: return(zogr); end_proc: i szkicujemy wykres: plotfuncd(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]; n [0, 0],[0, 8],h 52 ÅÅ, 5 i,[5, 0] 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]; n [0, 0],[0, 8],[0, 10],h 52 ÅÅ, 5 i,[5, 0],h 20 ÅÅ, 0 io 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 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; n [x = 0, y = 0],[x = 5, y = 0],[x = 0, y = 8],[x = 0, y = 10],hx = 5 2ÅÅ, y = 5 i,hx = 20 ÅÅ, y = 0 io Niejako przy okazji wyszukiwania wierzchołków system zbadał gdzie realizuje się maksimum W; print(unquoted, "Punkt realizacji maksimum (x,y)= ".W[]); print(unquoted, "Wartość maksymalna = ".W[2]); hn [0, 0],[0, 8],h 52 ÅÅ, 5 i,[5, 0] o, 1400,h 52 ÅÅ, 5 ii Punkt realizacji maksimum (x,y)= [5/2, 5] Wartość maksymalna = 1400 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 hoptimal,ny = 5, x = 5 2ÅÅo, 1400i 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: