Visszalépéses maximumkiválasztás

Hasonló dokumentumok
Informatikai tehetséggondozás:

Visszalépéses kiválogatás

Visszalépéses keresés korlátozással

Backtrack-es feladat-variációk

Algoritmusok és adatszerkezetek I. 7. előadás

Informatikai tehetséggondozás:

Rekurzió 2. Belépő a tudás közösségébe Informatika szakköri segédanyag

Problémamegoldási stratégiák

Adatszerkezetek II. 10. előadás

Kombinatorikai algoritmusok. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Feladatmegoldási stratégiák

Kombinatorikai algoritmusok

Összetett programozási tételek 2.

Algoritmizálás, adatmodellezés tanítása 7. előadás

Informatikai tehetséggondozás:

Informatikai tehetséggondozás:

Egyszerű programozási tételek

A 2011/2012 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Algoritmizálás, adatmodellezés tanítása 1. előadás

Algoritmizálás, adatmodellezés tanítása 8. előadás

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

Algoritmizálás, adatmodellezés tanítása 1. előadás

A 2013/2014 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Algoritmusok és adatszerkezetek I. 10. előadás

A 2008/2009 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Visszalépéses keresés

Programozási tételek. Dr. Iványi Péter

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

Összetett programozási tételek

A 2010/2011 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Függvények II. Indítsuk el az Excel programot! A minta alapján vigyük be a Munka1 munkalapra a táblázat adatait! 1. ábra Minta az adatbevitelhez

Algoritmizálás, adatmodellezés tanítása 2. előadás

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny második forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Multihalmaz, intervallumhalmaz

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny második fordulójának feladatai. INFORMATIKA II. (programozás) kategória

Algoritmizálás és adatmodellezés tanítása 2. előadás

Hatékonyság 1. előadás

Adatbázis és szoftverfejlesztés elmélet. Programozási tételek

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

A 2009/2010 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

PROGRAMOZÁSI TÉTELEK

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

A 2015/2016 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

ELEMI PROGRAMOZÁSI TÉTELEK

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

Közismereti informatika I. 4. előadás

Algoritmusok és adatszerkezetek I. 1. előadás

Felvételi tematika INFORMATIKA

Informatikai tehetséggondozás:

Szövegfeldolgozás II.

Gyakorló feladatok Gyakorló feladatok

Programozás alapjai. 5. előadás

Web-programozó Web-programozó

Rendezések. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar október 24.

Adatszerkezetek II. 6. előadás

Informatikai tehetséggondozás:

Algoritmizálás és adatmodellezés 2. előadás

A lineáris programozás alapfeladata Standard alak Az LP feladat megoldása Az LP megoldása: a szimplex algoritmus 2018/

Mintapélda1 Hányféleképpen állhatnak sorba egy bolt pénztáránál a vásárlók, ha 3-an, 4-en, 5-en, k-an vannak?

Neptun.Net Oktatásszervezői segédanyag. Debreceni egyetem május 07.

A lineáris programozás alapfeladata Standard alak Az LP feladat megoldása Az LP megoldása: a szimplex algoritmus 2017/

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

BACKTRACKING Visszalépéses keresés

Függvényábrázolás II.

Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

OKTV 2007/2008 Informatika II. kategória döntő forduló Feladatlap. Oktatási Hivatal

I. Internetes keresési feladatok (ajánlott idő: 20 perc)

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

3. Osztályok II. Programozás II

2009/2010. tanév tavaszi félév záróvizsga időpontjai az Informatika Karon

Minta felvételi feladatsor programozásból

Programozási segédlet

JAVASLAT A TOP-K ELEMCSERÉK KERESÉSÉRE NAGY ONLINE KÖZÖSSÉGEKBEN

Mohó stratégia. Feladat: Megoldás:

Dokumentáció az 1. feladatsorhoz (egyszerű, rövidített kivitelben)

Algoritmizálás és adatmodellezés tanítása 3. előadás

Közismereti informatika 2.zh T-M szakirány

Hatékonyság 2. előadás

HELYI TANTERV / INFORMATIKA

Oszd meg és uralkodj stratégia

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny első fordulójának feladatai. INFORMATIKA II. (programozás) kategória

32. A Knuth-Morris-Pratt algoritmus

Bevezetés a programozásba I.

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

55/2014. (IV.28.) számú határozatot A Toronyi Csicsergő Óvoda évi

Bevezetés a programozásba. 5. Előadás: Tömbök

Objektum Orientált Programozás VII.

Rekurzív algoritmusok

A SELECT működése. Ttanar tábla: Tdiak tábla:

A 35/2016. (VIII. 31.) NFM rendelet szakmai és vizsgakövetelménye alapján.

Archivált tanulmányi adatok importálása. Felhasználói dokumentáció verzió 2.0.

INFORMATIKAI ALAPISMERETEK

Vizsgalap létrehozása az ETRben

Egyszerű programozási tételek

A 2014/2015 tanévi Országos Középiskolai Tanulmányi Verseny döntő forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

3. Előadás. Megyesi László: Lineáris algebra, oldal. 3. előadás Lineáris egyenletrendszerek

Gazdasági informatika gyakorlat

Átírás:

Belépő a tudás közösségébe Informatika szakköri segédanyag Visszalépéses maximumkiválasztás Heizlerné Bakonyi Viktória, Horváth Győző, Menyhárt László, Szlávi Péter, Törley Gábor, Zsakó László Szerkesztő: Abonyi-Tóth Andor, Zsakó László A kiadvány A felsőoktatásba bekerülést elősegítő készségfejlesztő és kommunikációs programok megvalósítása, valamint az MTMI szakok népszerűsítése a felsőoktatásban (EFOP-3.4.4-16-2017-006) című pályázat keretében készült 2017-ben. 0

1. Munkásfelvétel: N állás N jelentkező Egy vállalkozás N különböző állásra keres munkásokat. Pontosan N jelentkező érkezett, ahol minden jelentkező megmondta, hogy mely munkákhoz ért, illetve amihez ért, arra mennyi fizetést kérne. Legyen F[i,j] értéke 0, ha az i. jelentkező a j. munkához nem ért, illetve F[i,j]=A>0, ha ért hozzá és A forintot szeretne kapni érte. Állások: 1. 2. 3. 4. 5. 1. jelentkező: 100 0 0 100 0 2. jelentkező: 0 200 0 0 0 3. jelentkező: 200 100 0 0 0 4. jelentkező: 0 0 200 0 400 5. jelentkező: 500 0 400 0 200 A vállalkozás vezetője azt szeretné, ha az összes állást betöltenék, de úgy, hogy számára ez a lehető legkisebb költséggel járna. A következőt gondolta ki: első lépésként állítsuk elő az összes lehetséges állásbetöltést (ha van egyáltalán olyan). Ez azt jelenti, hogy minden jelentkezőhöz hozzárendelünk egy állás sorszámot két feltétellel: olyan állást választhatunk számára, amihez ért (F(i,j)>0); olyan állást választhatunk számára, amit még nem adtunk másnak (Volt(i,j,x) függvény értéke hamis). Megoldás(N,F,Db,Y): Összes_állás(1,N,F,Db,Y,x) Az Összes_állás eljárás első paramétere az aktuálisan vizsgált jelentkező i sorszáma legyen, a második paramétere pedig a jelentkezők (és egyben állások) N száma! A megoldásban használt fontos változók: x az aktuálisan számolt megoldás: x[i] az i. jelentkezőnek adott munka sorszáma Db a megoldások száma; Y a megoldásokat tartalmazó vektor. 1

Összes_állás(i,N,F,Db,Y,x): Ha i>n akkor Db:=Db+1; Y[Db]:=x akkor x[i]:=j; Összes_állás(i+1,N,F,Db,Y,x) Volt(i,j,x): k:=1 Ciklus amíg k<i és x[k] j k:=k+1 Volt:=(k<i) Függvény vége. Ezután nincs más hátra, mint az Y vektorban összegyűlt megoldásokból kiválasztani a vállalkozó számára leggazdaságosabbat. Nagyon hamar kiderülhet azonban, hogy túlságosan sok elem lehet az Y vektorban. A megoldási ötlet: felesleges az összes lehetséges megoldást tárolni, elég csupán minden lépés után a leggazdaságosabbat. A megoldásban használt fontos változók: x az aktuálisan számolt megoldás: X[i] az i. jelentkezőnek adott munka sorszáma Y a legjobb megoldás. Legjobb_állás(i,N,F,Y,x): Ha i>n akkor Ha Költség(N,F,x)<Költség(N,F,Y) akkor Y:=x akkor x[i]:=j; Legjobb_állás(i+1,N,F,Y,x) Költség(N,F,x): s:=0 Ciklus i=1-től N-ig s:=s+f[i,x[i]] Költség:=s Függvény vége. Itt egy kicsi probléma léphet fel: az első megoldást mivel hasonlítjuk? Vegyünk fel egy új változót, ami az eddigi legjobb megoldás költségét tartalmazza! Állítsuk ennek az értékét a program elején a legnagyobb egész számra! Ha egy megoldást találunk, akkor az ennél biztosan jobb lesz, azaz lecserélhetjük rá. 2

Megoldás(N,F,Maxkölt,Y): Maxkölt:=+ Legjobb_állás(1,N,F,Maxkölt,Y,x) A megoldásban használt fontos változók: x az aktuálisan számolt megoldás: x[i] az i. jelentkezőnek adott munka sorszáma Maxkölt az eddigi legjobb megoldás költsége; Y a legjobb megoldás. Legjobb_állás(i,N,F,Maxkölt,Y,x): Ha i>n akkor Ha Költség(N,F,x)<Maxkölt akkor Y:=x; Maxkölt:=Költség(N,F,x) akkor x[i]:=j; Legjobb_állás(i+1,N,F,Maxkölt,Y,x) Előfordulhat természetesen, hogy a feladatnak egyáltalán nincs megoldása, azaz legjobb megoldás sincs: Állások: 1. 2. 3. 4. 5. 1. jelentkező: 0 0 100 100 0 2. jelentkező: 0 200 0 0 100 3. jelentkező: 200 100 0 0 0 4. jelentkező: 0 0 200 400 0 5. jelentkező: 0 0 400 200 0 Már csak egy apróságra gondolhatunk: ha van egy megoldásunk és a most készülő megoldásról látszik, hogy már biztosan rosszabb lesz többe fog kerülni, akkor azt már nem érdemes tovább vinni. Legyen az eljárás paramétere az eddigi költség, s az eljárást csak akkor folytassuk, ha még nem érjük el a korábban kiszámolt maximális költséget. Emiatt nem a megoldások elkészültekor kell számolni költséget, hanem menet közben, folyamatosan. A megoldást is módosítanunk kell, a Legjobb_állás eljárásnak új paramétere lesz, az aktuális előtti választások költ költsége. 3

A megoldásban használt fontos változók: x az aktuálisan számolt megoldás: x[i] az i. jelentkezőnek adott munka sorszáma költ az aktuálisan számolt megoldás költsége; Maxkölt az eddigi legjobb megoldás költsége; Y a legjobb megoldás. Megoldás(N,F,Maxkölt,Y): Maxkölt:=+ Legjobb állás(1,0,n,f,maxkölt,y,x) Legjobb_állás(i,költ,N,F,Maxkölt,Y,x): Ha i>n akkor Ha költ<maxkölt akkor Y:=x; Maxkölt:=költ és költ+f[i,j]<maxkölt akkor x[i]:=j Legjobb_állás(i+1,költ+F[i,j], N,F,Maxkölt,Y,x) Minta kódok C++ cpp/1_munkasfelvetel_n_allas_n_jelentkezo/fel adat.cpp C# cs/1_munkasfelvetel_n_allas_n_jelentkezo/feladat.cs Java Pascal Python java/1_munkasfelvetel_n_allas_n_jelentkezo/feladat.java pas/1_munkasfelvetel_n_allas_n_jelentkezo/feladat.pas py/1_munkasfelvetel_n_allas_n_jelentkezo/feladat.py 2. Munkásfelvétel: N állás M jelentkező Egy vállalkozás N különböző állásra keres munkásokat. A hirdetésre M jelentkező érkezett (M<N), ahol minden jelentkező megmondta, hogy mely munkákhoz ért, illetve amihez ért, arra mennyi fizetést kérne. Legyen F(i,j) értéke 0, ha az i. jelentkező a j. munkához nem ért, illetve F(i,j)=A>0, ha ért hozzá és A forintot szeretne kapni érte. 4

Állások: 1. 2. 3. 4. 5. 1. jelentkező: 100 0 0 100 0 2. jelentkező: 0 200 0 0 0 3. jelentkező: 200 100 0 0 0 4. jelentkező: 0 0 200 0 400 A vállalkozás vezetője azt szeretné, ha az összes jelentkezőt fel tudná venni, de úgy, hogy számára ez a lehető legkisebb költséggel járna. A megoldás nagyon hasonló az előzőhöz: itt nem akkor van kész egy megoldás, ha N jelentkezőnek adtunk munkát, hanem akkor, ha az M jelentkezőnek adtunk munkát: Megoldás(N,M,F,Maxkölt,Y): Maxkölt:=+ Legjobb állás(1,0,n,m,f,maxkölt,y,x) Legjobb_állás(i,költ,N,M,F,Maxkölt,Y,x): Ha i>m akkor Ha költ<maxkölt akkor Y:=x; Maxkölt:=költ és költ+f[i,j]<maxkölt akkor x[i]:=j Legjobb_állás(i+1,költ+F[i,j], N,M,F,Maxkölt,Y,x) Egy vállalkozás N különböző állásra keres munkásokat. A hirdetésre M jelentkező érkezett (M>N), ahol minden jelentkező megmondta, hogy mely munkákhoz ért, illetve amihez ért, arra mennyi fizetést kérne. Legyen F(i,j) értéke 0, ha az i. jelentkező a j. munkához nem ért, illetve F(i,j)=A>0, ha ért hozzá és A forintot szeretne kapni érte. A megoldási ötlet: ne jelentkezőhöz keressünk állást, hanem álláshoz jelentkezőt! Így a feladat megoldása az előzőével majdnem megegyezik, csupán a két index szerepét kell felcserélni. Állások: 1. 2. 3. 4. 1. jelentkező: 100 0 0 100 2. jelentkező: 0 200 0 0 3. jelentkező: 200 100 0 0 4. jelentkező: 0 0 200 0 5. jelentkező: 500 0 400 0 5

Legjobb_állás(i,költ,N,M,F,Maxkölt,Y,x): Ha i>n akkor Ha költ<maxkölt akkor Y:=x; Maxkölt:=költ különben Ciklus j=1-től M-ig Ha nem Volt(j,i,x) és F[j,i]>0 és költ+f[j,i]<maxkölt akkor x[j]:=i Legjobb_állás(i+1,költ+F[i,j], N,M,F,Maxkölt,Y,x) A feladat megoldása tesztelhető az elkészült forráskód feltöltésével itt: Weboldal Szint Téma Feladat https://mester.inf.elte.hu/ Haladó Visszalépéses keresés 5. Munka 3. Munkásfelvétel: N állás N jelentkező, nem lehet mind felvenni Egy vállalkozás N különböző állásra keres munkásokat. Pontosan N jelentkező érkezett, ahol minden jelentkező megmondta, hogy mely munkákhoz ért, illetve amihez ért, arra mennyi fizetést kérne. Legyen F(i,j) értéke 0, ha az i. jelentkező a j. munkához nem ért, illetve F(i,j)=A>0, ha ért hozzá és A forintot szeretne kapni érte. Állások: 1. 2. 3. 4. 5. 1. jelentkező: 100 0 0 100 0 2. jelentkező: 0 200 0 0 0 3. jelentkező: 200 100 0 0 0 4. jelentkező: 0 0 200 0 400 5. jelentkező: 500 400 0 0 0 A vállalkozás vezetője azt szeretné, ha az összes állást betöltenék, de úgy, hogy számára ez a lehető legkisebb költséggel járna. Nem biztos azonban, hogy ez lehetséges. Akkor is érdekes lehet azonban egy olyan megoldás, amiben a lehető legtöbb munkát adhatjuk ki. A megoldás ötlete: Vezessünk be egy N+1. fiktív állást, amihez azt gondoljuk, hogy mindenki ért! Legyen ennek az ára nagyobb, mint minden más összeg a táblázatunkban (maxért)! Az N+1. állásra engedjük meg, hogy többen is válasszák! 6

Állások: 1. 2. 3. 4. 5. 6. 1. jelentkező: 100 0 0 100 0 1000 2. jelentkező: 0 200 0 0 0 1000 3. jelentkező: 200 100 0 0 0 1000 4. jelentkező: 0 0 200 0 400 1000 5. jelentkező: 500 400 0 0 0 1000 Belátható, hogy a leggazdaságosabb megoldásban ekkor a lehető legkevesebb fiktív állás lesz, azaz a legtöbb állást tudjuk betölteni. Legjobb_állás(i,költ,N,F,maxért,Maxkölt,Y,x): Ha i>n akkor Ha költ+maxért<maxkölt akkor Y:=x; Maxkölt:=költ+maxért és költ+f[i,j]<maxkölt akkor x[i]:=j Legjobb_állás(i+1,költ+F[i,j], N,F,maxért,Maxkölt,Y,x) A feladat megoldása tesztelhető az elkészült forráskód feltöltésével itt: Weboldal https://mester.inf.elte.hu/ Szint Téma Feladat 4. L üzlet K pékség Egy üzletlánc L üzlete K pékségtől rendelhet kenyeret. Megadjuk, hogy az egyes üzletek mennyi kenyérre tartanak igényt, és azt, hogy az egyes pékségek mennyit sütnek naponta. Továbbá adott az is, hogy az egyes üzletek mely pékségekkel állnak kapcsolatban. Az üzletek csak egyetlen egy pékségtől rendelhetnek (az adott napon). Ha ismerjük azt is, hogy az egyes pékségek hány forintért adják a kenyeret, akkor megadhatjuk, hogy hova honnan szállítsák a kenyeret úgy, hogy az az üzletláncnak a lehető legkevesebbe kerüljön! 7

Pékségek: 1. 2. 3. 4. Igény 1. üzlet: igaz hamis hamis hamis 200 2. üzlet: igaz hamis hamis hamis 100 3. üzlet: hamis igaz hamis hamis 300 4. üzlet: igaz hamis igaz hamis 200 5. üzlet: hamis hamis hamis igaz 200 6. üzlet: hamis hamis igaz igaz 100 7. üzlet: igaz hamis igaz hamis 100 Van 400 600 400 400 Ár 200 300 250 100 Ez a feladat is visszalépéses maximumkiválasztás, első lépésként azonban próbáljuk megfogalmazni az összes megoldás előállítását! Adatok: Kapcs[i,j] igaz, ha az i. üzletbe a j. pékségből lehet szállítani Van[j] a j. pékségben előállított kenyérmennyiség Igény[i] az i. üzlet kenyérigénye Ár[j] a j. pékségben előállított kenyerek ára A megoldásban az i. üzletbe lehet a j. üzletből szállítani, ha van közöttük kapcsolat és a j. pékségben a kisebb sorszámú üzletek által elvitt kenyérmennyiség után még maradt annyi, amennyi az i. üzletnek kell. Megoldás(L,K): Összes_rendelés(L,K,1) 8

Összes_rendelés(L,K,i): Ha i>l akkor Db:=Db+1; Y[Db]:=x különben Ciklus j=1-től K-ig Ha vankenyér(i,j) és Kapcs[i,j] akkor x[i]:=j; Összes_rendelés(L,K,i+1) vankenyér(i,j): s:=van[j] Ciklus k=1-től i-1-ig Ha Y[k]=j akkor s:=s-igény[k] vankenyér:=s Igény[i] Ezt ezután már nem túl nehéz átfogalmazni maximumkiválasztásra: Megoldás(L,K): Maxkölt:=+ Legjobb_rendelés(L,K,1) Legjobb_rendelés(L,K,i): Ha i>l akkor Ha Költség(x)<Maxkölt akkor Y:=x Maxkölt:=Költség(x) különben Ciklus j=1-től K-ig Ha vankenyér(i,j) és Kapcs[i,j] akkor x[i]:=j; Legjobb_rendelés(L,K,i+1) A költségszámítás egy összegzés ha az i. üzlet az X[i]. pékségtől rendel kenyeret, akkor annak az ára Ár[X[i]]*Igény[i]. Költség(x): s:=0 Ciklus i=1-től L-ig s:=s+ár[x[i]]*igény[i] Költség:=s Függvény vége. A költségszámítást itt is elvégezhetnénk menet közben, megtakarítva ezzel a költség függvény megírását: Megoldás(L,K): Maxkölt:=+ Legjobb_rendelés(L,K,1,0) Összes_rendelés(L,K,i,költ): Ha i>l akkor Ha költ<maxkölt akkor Y:=x 9

Maxkölt:=Költség(x) különben Ciklus j=1-től K-ig Ha vankenyér(i,j) és Kapcs[i,j] akkor x[i]:=j; z:=költ+ár[j]*igény[i] Összes_rendelés(L,K,i+1,z) A feladat megoldása tesztelhető az elkészült forráskód feltöltésével itt: Weboldal https://mester.inf.elte.hu/ Szint Téma Feladat 10