LibreTime: Radio Broadcast & Automation Platform
Go to file
dakriy 5b5c68c628
feat(legacy): implement subset sum solution to show scheduling (#3019)
### Description

When running a radio station it is generally a good idea to reduce dead
air time. The current algorithm for adding tracks to a block/show can
leave a lot of dead air time at the end as it doesn't use a very good
algorithm. Adding tracks to a show until it is full while making it as
full as possible is a well known problem in computer science. It is the
[Subset Sum Problem](https://en.wikipedia.org/wiki/Subset_sum_problem).
This PR implements a Randomized Greedy with Local Improvement (RGLI)
approximation solution for the Subset Sum Problem. The new algorithm is
only used when sort type is random and overflow is not enabled and there
is no limit on the number of tracks that can be used.

**This is a new feature**:

Improvement on an existing feature. 

**I have not updated the documentation to reflect these changes**:

I did not update the documentation because the current scheduling
algorithm is not currently documented and its existing features have not
changed.

### Testing Notes

**What I did:**

I first attempted a fully polynomial time approximation scheme solution,
however it is really bad at finding good solutions for high density
values and can kinda slow the more tracks/time you have. So I instead
implemented an RGLI which is O(nlogn) and has been giving much better
results.

I implemented the solution in a separate project and tested it and timed
the values with a normal distribution of 500 songs with a mean of 3
minutes and a standard deviation of 1 minute. With a show size of 1 hour
the algorithm took around 10-15 ms to run. When adjusting the block size
and track size the algorithm still was pretty quick to run. Am going to
be testing on an instance with lots of tracks later, will update PR when
I have done that.

**How you can replicate my testing:**

_How can the reviewer validate this PR?_

### **Links**

Closes #3018
2024-10-13 15:31:08 +02:00
.github chore(deps): update lycheeverse/lychee-action action to v2 (#3091) 2024-10-10 10:17:10 +01:00
analyzer fix(analyzer): make ffmpeg filters less aggressive (#3086) 2024-10-07 20:55:18 +01:00
api chore(deps): update dependency uvicorn to >=0.17.6,<0.32.0 (#3081) 2024-09-30 16:32:04 +01:00
api-client chore(main): release 4.2.0 (#3028) 2024-06-22 18:16:49 +02:00
dev chore: add mailpit to dev setup 2023-06-02 07:44:34 +01:00
docker feat!: use nginx to serve media files (#2860) 2023-12-30 18:59:15 +01:00
docs docs: update SoundExchange costs (#3070) 2024-08-29 08:57:12 +01:00
installer feat(installer): add the `--storage-path` flag (#2865) 2024-01-01 14:38:05 +01:00
legacy feat(legacy): implement subset sum solution to show scheduling (#3019) 2024-10-13 15:31:08 +02:00
playout chore: fix linting ignore comments (#3084) 2024-09-30 16:08:23 +01:00
shared chore(main): release 4.2.0 (#3028) 2024-06-22 18:16:49 +02:00
tools fix: pin pip version to <24.1 to allow installing pytz (celery) (#3043) 2024-06-22 17:35:30 +02:00
worker chore(main): release 4.2.0 (#3028) 2024-06-22 18:16:49 +02:00
.codespellignore chore: release 3.2.0 (#2754) 2023-10-16 21:26:59 +02:00
.dockerignore feat: add container setup 2022-09-14 11:09:52 +02:00
.env.dev chore: move dev env files to dev subfolder 2023-04-12 08:11:21 +01:00
.gitattributes Create .gitattributes to ensure proper cloning with Windows Git 2017-04-09 14:41:52 -04:00
.gitignore chore: use a secure dev environment 2023-04-12 08:11:21 +01:00
.pre-commit-config.yaml chore(deps): update pre-commit hook adamchainz/django-upgrade to v1.22.1 2024-10-12 15:04:49 +00:00
.vale.ini chore: reenable vale rule after fix (#2965) 2024-03-02 14:15:50 +01:00
CHANGELOG.md chore(main): release 4.2.0 (#3028) 2024-06-22 18:16:49 +02:00
CONTRIBUTING.md chore: fix CONTRIBUTING symlink again 2023-04-03 12:39:24 +02:00
Dockerfile fix: docker warnings "keywords casing do not match" (#3048) 2024-06-29 20:26:44 +01:00
LEGACY.md Add Table of Content to LEGACY file 2021-09-02 20:55:16 +02:00
LICENSE Small update to LICENSE 2021-09-02 16:06:26 +02:00
Makefile build: replace custom release script with release-please (#2817) 2023-12-22 19:19:12 +01:00
README.md chore: fix broken link check (#3039) 2024-06-22 11:44:35 +02:00
SECURITY.md docs: move release docs in the release section 2023-04-12 16:50:04 +01:00
Vagrantfile feat(installer)!: change default listen port to 8080 (#2852) 2023-12-29 17:49:07 +01:00
cloud-init.yml feat: rewrite cloud-init config (#2853) 2023-12-29 17:57:59 +01:00
codecov.yml test(worker): setup testing 2022-09-09 14:44:37 +02:00
docker-bake.json ci: use bake file for container build 2023-02-26 20:37:27 +02:00
docker-compose.override.yml fix: remove obsolete docker compose version (#2982) 2024-04-13 14:37:04 +02:00
docker-compose.yml perf: optimize the rabbitmq health check (#3037) 2024-06-22 18:10:55 +02:00
install fix: pin pip version to <24.1 to allow installing pytz (celery) (#3043) 2024-06-22 17:35:30 +02:00
pyproject.toml chore: add isort pre-commit hook 2023-02-03 12:38:58 +01:00

README.md

LibreTime

Financial Contributors on Open Collective

LibreTime makes it easy to run your own online or terrestrial radio station. It is a community managed fork of the AirTime project.

It is managed by a friendly inclusive community of stations from around the globe that use, document and improve LibreTime. Join us in fixing bugs and in defining how we manage the codebase going forward.

Check out the documentation for more information and start broadcasting!

Please note that LibreTime is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

You can find details about our development process in the contributing guide.

Support

To get support for any questions or problems you might have using the software we have a forum at discourse.libretime.org. We are moving towards using the forum to provide community support and reserving the github issue queue for confirmed bugs and well-formed feature requests.

You can also contact us through Matrix (#libretime:matrix.org) where you can talk with other users and developers.

Contributors

Code Contributors

This project exists thanks to all the people who contribute.

Financial Contributors

Become a financial contributor and help us sustain our community on OpenCollective.

Individuals

Organizations

Support this project with your organization. Your logo will show up here with a link to your website.

License

LibreTime is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License.

Copyright (c) 2011-2017 Sourcefabric z.ú.

Copyright (c) 2017-2023 LibreTime Community

Please refer to the LEGACY file for more information.