Sziasztok,
A következő problémára szeretnék hatékony algoritmust találni:
- Adott több, különböző méretű kábel darab (pl: 1m, 3m, 4m, 5m, 32m, 47m, 57m, 500m, stb.)
- Adott több, különböző méretű kábel igény (pl: 45m, 100m, 110m, 18500m, stb.)
A cél az lenne, hogy megkeressük a legpontosabb egyezést, azaz ne vágjunk kábeldarabot további darabokra, ha van a kábel daraboknak olyan csoportja, amelynek összege kiadja a kábel igényt. Az igényt azonban minden esetben teljesíteni kell, tehát a kábelek darabolása néha elkerülhetetlen.
A jelenlegi megoldásomban azt vizsgálom, hogy x db tetszőleges szám összege ad-e pontos egyezést valamelyik kábelre, amiben x-et 1-től indulva folyamatosan növelem.
A problémám, hogy már 10 alatti x esetén is elérem a gép memóriájának határait és a futási sebesség is percekben mérhető (a kábel darabok száma és az igények száma is 100 feletti).
Előre is köszönöm a javaslatokat!
Hozzászólások
A pakolási probléma NP-teljes, azaz exponenciális idő/tárhely a megtalálása (https://en.wikipedia.org/wiki/Knapsack_problem).
Használj közelítő algoritmust.
+1 Ez a megoldás.
Először ezt gondoltam:
De százas nagyságrendű elemnél még az exponenciális algoritmusoknak sem kéne kitérdelni egy mai normális gép memóriáját és prociját.
Majd kiszámoltam mennyi 100! és meggondoltam magam... :D
http://www.cs.iastate.edu/~cs511/handout08/Approx_Knapsack.pdf
ε közelítésre O(n^3/ε) a futási idő.
Genetikus algoritmussal megoldás, programmal:
https://handcraftsman.wordpress.com/2012/04/23/unbounded-knapsack-probl…
+1 A genetikus algoritmusra, nekem is ez ugrott be először. Matlabban könnyű megoldani a gatool-lal, mindössze a pár soros jósági függvényt kell összedobni.
Köszönöm szépen!
A feladat így nem elég pontos, előbb definiáld, hogy milyen kritériumra kell optimalizálni. Azt tudjuk, hogy a szélsőérték az, ha nem kell semennyiszer vágni. De ha kell vágni, akkor hogyan értékeljük?
Ha például a legvégén 1+4 méter kimarad, az jobb vagy rosszabb, mintha 2+3 méter marad ki? Később lehet, hogy a maradékokat is fel kell használni, tehát nem dobódik ki, vagy de? Vagy az a fontos, hogy minél kevesebb darab vágás történjen, és mindegy, hogy milyen hosszok mentén?
--
Azt kene inkabb menedzselni hogy minel kevesebb olyan maradek maradjon amit kesobb nem lehet eladni mert ritka mint a feher hollo pl 1M alatti vagy mit tudom en.
Tehat ha kisebb lenne a maradek egy 5 meteres rendeles miatt mint az altalanos megrendelesekben eladhato ( ide felvenni a gyakori megrendeleseket x y z meretek ) akkor inkabb kezdjenek uj kabelt.
Ez tökéletes lenne, de sajnos nincsenek standard megrendelés méretek, teljesen változatos az 1m-től a 10km-ig.
Hmm de csak van megrendelesi statisztikatok hogy miket rendelnek. Most is irtad 1 metertol x kilometerig.
1M alatt nincs? Akkor nem szabad olyat vagni ami ala esne. Es igy tovabb felfele lehetne megnezni hogy peldaul ha kabel hossza beesik 20 meter ala abbol csak 1 evben egyszer rendelnek.
Persze azt is meg kell nezni mennyi helyetek van ha esetleg raktarozni kell ami esetleg tobbe kerul mintha kidobod azt a 30 cm-t a vegen ( ha ebbol sok van akkor erdemes azzal foglalkozni amit irtam )
Van statisztikánk, de a beépítési területtől és a kábel típusától függ a kábelhossz.
Ha a múltban sokszor is rendeltek egy adott méretet, nincs rá semmi garancia, hogy ez megismétlődik. Ezen felül az algoritmusnak a kábeltípustól függetlenül kellene működnie a jövőbeni típusokra is.
Elsődleges cél, hogy ne kelljen vágni.
Másodlagos cél, hogy minél nagyobb méretű darabok maradjanak, a kis darabkák csak selejtezésre jók... A kábelek hossza mindenképpen pozitív egész.
Magyarul egy cél van, a kimaradó darabok minél nagyobbak legyenek. Vagyis ha nem marad ki semmi, az a legjobb.
Azt írtad, hogy a darabok is és az igények is különbözőek. Ez biztos? Nem tűnik életszerűnek.
Mi van akkor, ha van X darab kábel, Y darab igény, és ki lehet őket elégíteni őket valahogyan a szempontok szerint legjobban, utána másnap bejön egy Y+1-edik igény, ami miatt tegnap mégis csak jobb lett volna máshogy vágni? Reméljük a legjobbakat, és nem kell vele foglalkozni?
--
Magyarul egy cél van, a kimaradó darabok minél nagyobbak legyenek. Vagyis ha nem marad ki semmi, az a legjobb.
Így van, erre kellene egy hatékony algoritmus...
Azt írtad, hogy a darabok is és az igények is különbözőek. Ez biztos? Nem tűnik életszerűnek.
Biztos, hogy különbözőek. Több fajta kábel van, némelyik 100, 200, 500, 1000m-es dobon érkezik. Van a múltból rengeteg kisebb darabunk is, amit el kellene használni.
Csak adott napi igényekkel számolunk, a hosszú távú tervezést más program végzi, és az alapján húzza be az új dobokat.
Az az egy tényező garantált, hogy az adott napra szükséges méternyi kábel legalább 10% biztonsági ráhagyással rendelkezésre áll.
... másnap bejön egy Y+1-edik igény, ami miatt tegnap mégis csak jobb lett volna máshogy vágni? Reméljük a legjobbakat, és nem kell vele foglalkozni?
Jelenleg azt szeretném elérni, hogy az aznapi vágásokat ki tudjam számolni maximum 10 percen belül. Ha sikerül elég hatékony algoritmust találni, ami 1-2 percen belül elfogadható eredményt ad, akkor lesz még 8 perc, amit ennek optimalizálására szánhat...
A különböző alatt ezt értettem: létezik-e, hogy van 2 darab egyforma hosszú igény, vagy 2 darab egyforma hosszú kábel a raktárban? Mert ennek az ellenkezője nem életszerű.
Másrészt azt sem tartom életszerűnek, hogy 17 darab 1 méteres kábelből raksz össze egy 17 méteres igényt. Pedig egy algoritmusnak nagyon csábító lenne a maradékok ily módon való felhasználása. Milyen kábel ez egyáltalán?
--
Vagy úúúúgy!
Bizisten azt hittem, hogy prog házi feladat.
Egy ilyen nekünk is jó jönne.
Itt is ugyan az a gond.
Sok dirib-darab kábel marad..
pch
--
http://www.buster.hu "A" számlázó
--
?
"kábel daraboknak olyan csoportja, amelynek összege kiadja a kábel igényt"
Azaz ha akarok venni nálatok 10m kábelt, akkor adtok egy adag felszecskázott darabot és kötögessem össze? :D
Ezt a része bezavar a megoldásba, mire gondoltál itt valójában?
Azzal mi a gond, hogy a legkevésbé szimpatikus ügyfél/dolgozó igényét a raktárban található darab kábelekkel elégíted ki, lehetőleg a legkisebbtől kiindulva, hogy megszabadulj a legproblémásabb daraboktól, majd az esetlegesen hiányzó részt egy lehetőleg megkezdett dobból vágod le oly módon, hogy minimum a dob kapacitásának a fele megmaradjon? Ha ez nem megoldható, akkor akár 2 dobot is megkezdhetsz neki, a lényeg, hogy a maradék minél használhatóbb legyen.
Ezzel egy tranzakció során megszabadulsz egy rakás darabtól, míg keletkezik új max 2.
Készítsd el a klasszikus pénzcímletező algoritmust.
Ha azzal elkészültél, készen lesz ez is.
milyen kabel lehet az amibol 1m es 18km is hasznalhato valamire? :)
a problemara: en elso korben kizarnam a hosszabb igenyeket, itt kicsi az eselye hogy maradekbol megoldhato, masreszt a kabel aran levo haszon fedezi a veszteseget ugyis.
utana elindulnek a leghosszabb igenytol lefele, megneznem van-e egyaltalan olyan hulladek ami ennel hosszabb, ha igen, akkor probalnek keresni hozza a rovid igenyekbol part ami egyutt kiadja valamelyik hulladek hosszat. ezt lehet mondjuk 3-5 kabelig novelni, az meg nem veszes szamolas.
es igy haladni az egyre rovidebb igenyek fele, mivel ott nagyobb az esely hogy valamelyik maradekbol meg kijon. persze ez nem ad tokeletes eredmenyt, de relative jo lehet.
amugy a statisztikat sem vetnem el, persze nem garancia semmire a multbeli igenyek, de azert jo tampontot adhat. ez alapjan lehetne sulyozni a hibakat.
"milyen kabel lehet az amibol 1m es 18km is hasznalhato valamire? :)"
Ki mondta, hogy a kábel jeltovábbításra van használva? :)
Pl Optikai hálózat ?
Van olyan is, ami 30m megy, de van olyan is, ami pl. városok között megszakítás nélkül.
en is optikara gondoltam egybol, de amilyen kabelbol km-eket fektetnek az eleg vastag es rugalmatlan ahhoz, hogy par meteres darabokat hasznalni tudj valamire.
arrol nem beszelve, hogy kis tavokra multi, nagyra monomodosu kabelt hasznalnak
A'rpi
Különböző típusú kábelekre, általánosan kell működnie.
ok, de akkor 1 megoldando esetben nem lesz egyszerre 1m es 17km igeny