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

Podobne dokumenty