J; бих искал да напиша алгоритъм за "крайно разбъркване", за да сортирам моята mp3 колекция
Търся предложения за псевдокодове за сортирайте моите mp3 файлове, за да избегнете повтарящи се заглавия и изпълнители . Слушам кроони - Франк Синатра, Тони Бенет, Ела Фицджералд и др., Пеещи стари стандарти. Всеки изпълнител записва няколко едни и същи песни - Fly Me To The Moon, What You Watch Tonight, Stardust и др. Целта ми е да организирам песните (или да поръчам плейлиста) с максимално пространство между изпълнителите и заглавията на песните. Така че, ако имам 2000 песни и 20 са на Ела, бих искал да го чуя само веднъж на 100 песни. Ако 10 изпълнители пеят Fly Me To The Moon, бих искал да го чуя веднъж на 200 песни. Разбира се, искам да комбинирам тези две изисквания, за да създам моята „крайна комбинация“.

Знам, че въпросът е доста отворен. Все още не съм започнал да го програмирам, така че просто търся предложения за добър подход. Всъщност имам други изисквания за редовния интервал на останалите атрибути на песента, но няма да навлизам в подробности тук.
Като отправна точка променя кода, който намерих тук, за да манипулирам mp3 файлове и да чета ID3 тагове.
Написах малко приложение, което отговаря на моите нужди, използвайки отговора на parsifal по-долу. Тук написах и последващ въпрос. Благодаря за всички верни отговори!
Искате ли да стартирате програмата си веднъж и да генерирате плейлист или да изберете следващата песен на живо?
В последния случай отговорът е прост:
- Създайте таблица, съдържаща всичките ви песни, с изпълнител и заглавие.
- Създайте списък (свързаният списък е по-добър), за да съдържа наскоро възпроизведени заглавия на песни. Този списък е празен в началото и всеки път, когато пуснете песен, го добавяте към списъка. Когато списъкът показва желания размер "без повторение на песента", изтрийте най-стария (първи) запис.
- Също като списък на изпълнителите.
След това изборът на песен се превръща в следната последователност от стъпки:
- Случайно изберете песен от таблицата „всички песни“. Това е просто произволно число между 0 и размера на масива.
- Вижте дали тази песен вече е в списъка с възпроизведени песни. Ако е така, върнете се към стъпка 1.
- Вижте дали изпълнителят вече е в списъка с изиграни изпълнители. Ако е така, върнете се към стъпка 1.
- Добавете изпълнител/заглавие на песента към съответните списъци, като изтриете старите записи, ако е необходимо.
- Пуснете песента.
Има няколко възможни проблема, но те трябва да имат значение само ако правите това като задача, а не като реален проект.
- Както @Dukeling каза в коментар, ако колекцията ви е драстично дисбалансирана в полза на един изпълнител или заглавие на песен, може да се изгубите в цикъл, където постоянно отхвърляте песни. На практика това няма да е проблем. Решението е да се намали размерът на "вече видяните" списъци. И добавянето на броячи в стъпки 2 и 3 може да ви каже дали това е проблем (ако видите 10 грешки подред, задействайте предупреждение и/или намалете размера на списъка).
- Ако се опитвате да създадете плейлист, в който всичките ви песни са възпроизведени веднъж, трябва да премахнете песни от матрицата източник. Това също ще промени начина, по който се справяте с твърде много "наскоро изиграни" шах (тъй като евентуално бихте могли да се окажете само с един изпълнител във вашия източник).
- Ако вашите ID3 тагове изглеждат като моите, те съдържат много правописни грешки. Трябва ли „Дюк Елингтън“ да се различава от „Дюк Елингтен“? Ако е така, помислете за използване на съвпадение на Левенщайн, когато разглеждате списъци с "наскоро играни".
Вече направих нещо подобно, преди да използвам генератор (в C #, безкраен цикъл, който съвпада, дава всяка итерация на цикъл). Всяка итерация изследва своя набор от песни (или каквото и да било) и изхвърля тези, които са били възпроизведени твърде скоро (или независимо от отрицателните критерии). След това избирате такъв от филтрирания списък и актуализирате състоянието си. Тъй като състоянието ви се развива (свирите песни, които не са от Sinatra), критериите се рушат и вашите изключени песни започват да се включват отново.
Разбира се, има случаи, с които да се справим:
- Какво се случва, ако изхвърлите всички песни? (обикновено избирате такъв на случаен принцип, с надеждата да дестабилизирате държавата)
- Има ли някакви критерии, които трябва да се предпочитат? (Обикновено може да не искате да играете Fly Me to the Moon обратно до гърба и да предпочитате да не играете Sinatra, но ако това е всичко, което имате.)
- Какво се случва, ако вашата колекция от песни се актуализира по време на бой? (обикновено лесен за управление, но едновременността може да бъде проблем в зависимост от употребата)
Пренебрегвайки отклоненията във въпроса ви, повдигнат от Telastyn, изглежда, че имате вариация на проблема с раницата. За щастие това е доста добре документиран алгоритъм.
За набор от артикули, всеки с тегло и стойност, определете броя на елементите, които да бъдат включени в колекция, така че общото тегло да е по-малко или равно на дадено ограничение и общата стойност да е възможно най-голяма.
В тази статия са изброени някои потенциално подходящи вариации, заедно с допълнителен списък с проблемите с раниците.
Вариант на проблема с раницата е проблемът с многоцелевата раница. Алгоритъмът на колонията мравки се предлага като начин за решаване на този проблем. Подходът „колония на мравки“ може да е най-лесният начин да избегнете трудните аспекти на въпроса си.