2/9. lecke: Optimális keresés

 2009.11.02. 02:23

 

 

 

 

 

 

 

 

 

 

 

 

 

Az optimális választás feladata

 

Egy hátizsákba meghatározott térfogatú és fontossági értékű tárgyakat kel el beraknunk úgy, hogy az összes pontérték minél nagyobb legyen. Az összes tárgy térfogata együtt nagyobb, mint a hátizsák térfogata, tehát az összes tárgy nem rakható be. Meg kell határozni, hogy a tárgyak mely kombinációja esetén lesz a pontérték maximális.

 

Heurisztikus próbálkozás:                  -  Csökkenő pontérték szerint tesszük be a tárgyakat

-          Relatív fontosság (pontérték/térfogat) szerint csökkenő sorrendben töltjük fel a hátizsákot

A megoldást nem fogadjuk el, ha a feladat mérete a kitevőben van. Ha az alap a feladat mérete, akkor jó megoldásnak tekintjük (nk).

 

Általános feladat

 

Adott tárgyak halmazából valamilyen optimalitási szempont alapján a legjobb részhalmaz kiválasztása. Módszer:                        -  előállítjuk az összes lehetséges részhalmazát a halmaznak

-          Kiszámoljuk a pontértéket

-          Kiszámoljuk a térfogat-értéket, hogy még beleférjen

-          Kiválasztjuk a maximális pontértékűt

Ez egy Branch-Bound algoritmus, amely szeleteket vesz a keresési térben; az eleve reménytelen ágakkal nem próbálkozik.

A hátizsákos feladatra: Ha kivesszük az utoljára berakottat, a hátralévő összes lehetséges elem berakásával kaphatunk-e jobb megoldást, mint az eddigi legjobb? Ez a vágás. Ha ezt nem teljesíti, nem próbálkozunk ezzel az ággal.

 


Algoritmus

 

Procedure probal(i: integer, TW, AV: integer)

Var AV1: integer;

Begin

If TW+A[i].W<=limW then begin

                                                S:=S+[i];

                                                If i<n then probal(i+1, TW+A[i].W, AV)

                                                             Else

                                                                       If AV>MAXV then begin

                                                                                                  MAXV:=AV;

                                                                                                  OPTS:= S;

    End;

                                                           S:=S-[i];

                                                           End;

            AV1:= AV-A[i].V;

            If AV1>MAXV then begin

                                               If i<n then probal(i+1, TW, AV1)

                                                            Else

begin

                                                                       MAXV:=AV1; {maximum kiválasztás}

                                                                       OPTS:=S;

End;

                                               End;

End;

 

Magyarázat

 

I: a szinteket tárolja (hányadik tárggyal próbálkozunk)

TW: a hátizsákban lévő tárgyak összes súlyértéke

AV: híváskor az összes tárgy pontértékéttartalmazza

LimW: a hátizsákba rakható tárgyak maximális összsúlya

If TW+A[i].W: ha még a súlykorláton belül vagyunk, a következő tárgyat is betehetjük

S:=S+[i]: betesszük a következő tárgyat

If i<n: ha van még további tárgy, akkor nincs kész. Újrahívjuk a megnövelt súlyértékkel (az aktuális tárgyat beraktuk – TW+A[i].W)

Else if AV>MAXV: megtelt a hátizsák. Nagyobb-e a berakott új tárggyal a térfogat,befér-e? AV1:= AV-A[i].V: az utoljára berakott tárgy nélkül kaphatunk-e jobb megoldást, mint az eddigi legjobb?

If i<n: ha van még tárgy, be tudjuk rakni? (probal)

MAXV: feljegyezzük, mennyi a hátizsákban lévő pontérték

OPTS: optimális halmaz, a felhasznált tárgyak indexei

Ha az utolsó probal eljárás hívódik meg, a következő else ág nem hajtódik végre.

 

Hívása: probal(1,0,totv): probal(első elem, üres táska, tárgyak fontossági sorrendjeinek összege)

Az A tömbbe a tárgyakat súly szerinti növekvő sorrendben kell berakni

 

A bejegyzés trackback címe:

https://delphi-learning.blog.hu/api/trackback/id/tr651601242

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása