J; szeretnék írni egy "végső keverés" algoritmust az mp3 gyűjteményem rendezéséhez
Álkódjavaslatokat keresek rendezze az mp3 fájljaimat, hogy ne ismétlődjenek a címek és az előadók . Üvöltőket hallgatok - Frank Sinatra, Tony Bennett, Ella Fitzgerald stb., Régi színvonalat énekelve. Minden előadó több azonos dalt is felvesz - Fly Me to The Moon, What You Watch Tonight, Stardust stb. Célom, hogy a dalokat úgy rendezzem el (vagy rendeljem meg a lejátszási listát), hogy az előadók és a dalok címe között a lehető legnagyobb tér legyen. Tehát, ha 2000 dalom van, és 20 Ellától származik, akkor azt csak egyszer szeretném hallani 100-ból. Ha 10 előadó énekli a Fly Me To The Moon-t, akkor azt egyszer 200-ban szeretném hallani. Természetesen ezt a két követelményt szeretném ötvözni a "végső keverékem" megalkotása érdekében.

Tudom, hogy a kérdés meglehetősen nyitott. Még nem kezdtem el programozni, ezért csak javaslatokat keresek a jó megközelítéshez. Valójában más követelményeket támasztok a dal többi attribútumának rendszeres távolságával kapcsolatban, de itt nem részletezem.
Kiindulásként módosítom az itt talált kódot az mp3 fájlok manipulálása és az ID3 címkék olvasása céljából.
A parsifal alábbi válasza segítségével írtam egy kis alkalmazást, amely megfelel az igényeimnek. Itt írtam egy utólagos kérdést is. Köszönöm a helyes válaszokat!
Szeretné egyszer futtatni a programot, létrehozni egy lejátszási listát, vagy élőben kiválasztani a következő dalt?
Ez utóbbi esetben a válasz egyszerű:
- Hozzon létre egy táblázatot, amely tartalmazza az összes dalát, előadóval és címmel.
- Hozzon létre egy listát (jobb egy összekapcsolt lista), amely tartalmazza a nemrégiben lejátszott dalok címét. Ez a lista az elején üres, és minden alkalommal, amikor egy dalt játszik, felveszi a listára. Amikor a listán megjelenik a kívánt méret "nincs dal ismétlés", törölje a legrégebbi (első) bejegyzést.
- Ugyanaz a művészek listája.
A dal kiválasztása a következő lépésekké válik:
- Véletlenszerűen válasszon ki egy dalt az "összes dal" táblázatból. Ez csak egy véletlenszerű szám 0 és a tömb mérete között.
- Nézze meg, hogy ez a dal szerepel-e már a lejátszott dalok listájában. Ha igen, folytassa az 1. lépéssel.
- Nézze meg, hogy az előadó már szerepel-e a lejátszott művészek listáján. Ha igen, folytassa az 1. lépéssel.
- Adja hozzá a dal előadóját/címét a megfelelő listákhoz, szükség esetén törölje a régi bejegyzéseket.
- Játssza le a dalt.
Számos lehetséges kérdés létezik, de ezeknek csak akkor van jelentősége, ha ezt megbízásként, nem pedig valós projektként végzi.
- Ahogy @Dukeling egy megjegyzésben elmondta, ha gyűjteményed drasztikusan nincs egyensúlyban egyetlen előadó vagy dal címe mellett, akkor elveszhet egy olyan hurokban, ahol folyamatosan elutasítja a dalokat. A gyakorlatban ez nem jelent problémát. A megoldás a "már látott" listák méretének csökkentése. A számlálók hozzáadásával a 2. és 3. lépésben megtudhatja, hogy ez probléma-e (ha egymás után 10 hibát lát, indítson el figyelmeztetést és/vagy csökkentse a lista méretét).
- Ha olyan lejátszási listát próbál létrehozni, amelyben az összes zeneszám egyszer lejátszásra kerül, el kell távolítania a dalokat a forrásmátrixból. Ez megváltoztatja a túl sok "nemrégiben játszott" sakkkal való bánásmódodat is (mert valószínűleg csak egy előadóhoz juthatsz a forrás tábládon).
- Ha az ID3 címkéid az enyémhez hasonlítanak, sok helyesírási hibát tartalmaznak. A "Duke Ellington" -nak különböznie kell a "Duke Elingten" -től? Ha igen, fontolja meg a Levenstein párosító használatát a "nemrég lejátszott" listák böngészésekor.
Már csináltam valami ilyesmit, mielőtt egy generátort használtam (C # -ben egy végtelen ciklus, amely megegyezik minden ciklus iterációjával). Minden iteráció megvizsgálja dalainak (vagy bármi másnak) a készletét, és elveti azokat, amelyeket túlságosan nemrég játszottak (vagy a negatív kritériumtól függetlenül). Ezután kiválaszt egy egyet a szűrt listából, és frissíti az állapotát. Ahogy állapotod fejlődik (nem Sinatra dalokat játszol), a kritériumok összeomlanak, és a kizárt dalaid újra kezdenek lenni.
Természetesen vannak esetek, amelyekkel foglalkozni kell:
- Mi történik, ha kidobja az összes dalt? (általában véletlenszerűen választ egyet, az állam destabilizálásának reményében)
- Vannak olyan kritériumok, amelyeket előnyben kell részesíteni? (Általában előfordulhat, hogy nem akarja a Fly Me to the Moon-t játszani háttal, és inkább nem a Sinatrat játszik, de ha csak ez van.)
- Mi történik, ha verekedés közben frissül a dalgyűjtemény? (általában könnyen kezelhető, de a párhuzamosság problémát jelenthet a felhasználástól függően)
Figyelmen kívül hagyva a Telastyn által felvetett kérdésben szereplő kiugró értékeket, úgy tűnik, hogy a hátizsák problémája eltér. Szerencsére ez egy elég jól dokumentált algoritmus.
Tömeggel és értékkel rendelkező tételkészletek esetében határozza meg a gyűjteménybe beillesztendő elemek számát úgy, hogy az össztömeg kisebb vagy egyenlő legyen egy adott határértékkel, és az összérték a lehető legnagyobb legyen.
Néhány potenciálisan releváns variációt felsorol ebben a cikkben, a hátizsákokkal kapcsolatos problémák további listájával együtt.
A hátizsák probléma egyik változata a többcélú hátizsák probléma. A hangya telep algoritmusát javasolják ennek a problémának a megoldására. A "hangya telep" megközelítés lehet a legegyszerűbb módja annak, hogy elkerülje kérdésének nehéz vonatkozásait.