A Python library for Random-Key Optimization (RKO).
Project description
RKO - Random-Key Optimizer (Python Parallel Framework)
The Random-Key Optimizer (RKO) is a high-performance, parallel metaheuristic framework designed for combinatorial optimization problems. By mapping discrete, high-dimensional search spaces onto a continuous unit hypercube $[0, 1)^n$, RKO detaches optimization algorithms from problem-specific logic.
RKO orchestrates up to 8 parallel metaheuristic workers using Python's native multiprocessing. Workers cooperate in real time by feeding and pulling elite solutions from a thread-safe, shared Solution Pool, accelerating convergence and improving optimization robustness.
💎 Core Features
- 8 Concurrent Metaheuristics: Run BRKGA, Multi-Start, SA, VNS, ILS, LNS, PSO, and GA concurrently.
- Online hyperparameters tuning via Q-learning
- Collaborative Search: Thread-safe
SolutionPoolsharing elite solutions to pull workers out of local minima. - Automatic Result Structuring: Automatically groups execution runs, creating a dedicated timestamped folder (
results_{instance}_{timestamp}/) containing:results.txt: Scientific summary containing aggregated averages, standard deviations, lists of costs, and computational times for academic reporting.logs.txt: Chronological trace of improvements (NEW BEST), optimized and clean for parser engines.run_x.png: Convergence trajectory plot generated automatically for each trial.
📦 Installation
pip install rko
⚙️ Solver Configuration
RKO Class Initializer
from rko import RKO
rko_solver = RKO(
env=my_environment,
best_possible=None, # early-stop threshold
logger="dual", # logger strategy or custom LogStrategy instance
log_filepath="./results/results.txt" # Base directory for structured outputs
)
Solve Method Parameters
final_cost, final_solution, time_to_best = rko_solver.solve(
time_total=30, # Total time limit in seconds
brkga=1, # Number of parallel BRKGA instances
ms=1, # Number of parallel Multi-Start instances
sa=1, # Number of parallel SA instances
vns=1, # Number of parallel VNS instances
ils=1, # Number of parallel ILS instances
lns=1, # Number of parallel LNS instances
pso=1, # Number of parallel PSO instances
ga=1, # Number of parallel GA instances
restart=1.0, # Fraction of total time for each restart cycle
runs=10, # Number of independent trials
plot=True # Enable automatic convergence plotting (generates .png charts)
)
📊 Extensible Logging Engine
The RKO logging subsystem is built on the Strategy Pattern, allowing developers to customize logging behavior by passing a subclass of LogStrategy directly to the logger parameter in the RKO constructor.
Built-in Logger Strategies
"dual"(TerminalLogger with filepath): Prints logs to stdout and saves structured records to the dynamic results directory."terminal"(TerminalLogger): Outputs logs exclusively to stdout."file"(FileLogger): Saves logs exclusively to the specified disk path.
Custom Logging Strategy Example
You can inherit from LogStrategy to route logs to databases, dashboards, or external analytical tools:
from rko.LogStrategy import LogStrategy
class DatabaseLogger(LogStrategy):
def __init__(self, db_connection):
self.db = db_connection
def log(self, *args, **kwargs):
msg = " ".join(str(arg) for arg in args)
# Custom logic to write to database
self.db.insert_log(msg)
🛠️ Environment Interface & Validation
To adapt RKO to your problem, subclass RKOEnvAbstract and implement decoder and cost.
,
import numpy as np
class RKOEnv():
def __init__(self):
# Required attributes
self.tam_solution: int = 50 # Dimension of the random key vector
self.LS_type: str = 'Best' # Local Search strategy ('Best' or 'First')
self.dict_best: dict = {} # Shared best dictionary
self.instance_name: str = "kp50.txt" # Name of your problem instance
# Configurations for Metaheuristics
self.BRKGA_parameters = {'p': [1000, 2000], 'pe': [0.2, 0.15], 'pm': [0.05], 'rhoe': [0.7]}
self.SA_parameters = {'SAmax': [100], 'alphaSA': [0.99, 0.9], 'betaMin': [0.01], 'betaMax': [0.05], 'T0': [10000]}
self.ILS_parameters = {'betaMin': [0.1], 'betaMax': [0.2]}
self.VNS_parameters = {'kMax': [8,7,6,5], 'betaMin': [0.05]}
self.LNS_parameters = {'betaMin': [0.1], 'betaMax': [0.3], 'TO': [1000], 'alphaLNS': [0.99, 0.95, 0.9]}
self.PSO_parameters = {'PSize': [1000], 'c1': [2.05], 'c2': [2.05], 'w': [0.73]}
self.GA_parameters = {'sizePop': [1000], 'probCros': [0.98], 'probMut': [0.005]}
def decoder(self, keys: np.ndarray):
"""Maps random keys [0, 1) into a problem-specific discrete representation."""
pass
def cost(self, solution, final_solution: bool = False) -> float:
"""Returns objective cost (RKO minimizes this; return negated value for maximization)."""
pass
Static and Functional Verification via check_env
RKO provides a built-in diagnostic utility check_env to validate custom environments before runtime. It performs the following verification passes:
- Attribute & Type Verification: Verifies the presence and types of all core variables (
tam_solution,LS_type,dict_best,instance_name) and metaheuristic parameter dictionaries. - Functional Dry-Run: Invokes the custom
decoderandcostmethods using mock random keys to verify execution safety. - Mathematical Compliance: Checks that the returned cost is a scalar float and that the decoder successfully processes vectors of dimensions defined by
tam_solution. - Actionable Diagnostics: If a check fails, the utility prints detailed stack traces and configuration hints to assist the developer in resolving interface mismatches or bugs.
from rko.Environment import check_env
my_env = MyProblemEnv()
if check_env(my_env):
print("Environment successfully validated.")
👥 Maintainers
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rko-0.2.0.tar.gz.
File metadata
- Download URL: rko-0.2.0.tar.gz
- Upload date:
- Size: 30.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9bf849f13751cb75859c2a58f96a5355e0f595ea0038ae7fdfd491ad1398a2fb
|
|
| MD5 |
89caa7eb70770677d9baaca806ce41f9
|
|
| BLAKE2b-256 |
a8bbae780b6dabaad7c8bc52b92a5f54012ed23bf68f35d416e67735a01b9107
|
Provenance
The following attestation bundles were made for rko-0.2.0.tar.gz:
Publisher:
deploy.yml on RKO-solver/RKO_Python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rko-0.2.0.tar.gz -
Subject digest:
9bf849f13751cb75859c2a58f96a5355e0f595ea0038ae7fdfd491ad1398a2fb - Sigstore transparency entry: 1568292625
- Sigstore integration time:
-
Permalink:
RKO-solver/RKO_Python@50606ec2e64197139ec5de810a67e9d91ccc4cae -
Branch / Tag:
refs/heads/main - Owner: https://github.com/RKO-solver
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
deploy.yml@50606ec2e64197139ec5de810a67e9d91ccc4cae -
Trigger Event:
push
-
Statement type:
File details
Details for the file rko-0.2.0-py3-none-any.whl.
File metadata
- Download URL: rko-0.2.0-py3-none-any.whl
- Upload date:
- Size: 29.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f2c5ad58af19663d0e0d65839b5b7f3feac9282cce3ab279f0090ebc0e34b88a
|
|
| MD5 |
823a1e81df737685a0b6495a29240dfe
|
|
| BLAKE2b-256 |
f06c1f29fd367019eeb1dbe98f7564c526d8047237562fd5d5f8d8a3077e064e
|
Provenance
The following attestation bundles were made for rko-0.2.0-py3-none-any.whl:
Publisher:
deploy.yml on RKO-solver/RKO_Python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rko-0.2.0-py3-none-any.whl -
Subject digest:
f2c5ad58af19663d0e0d65839b5b7f3feac9282cce3ab279f0090ebc0e34b88a - Sigstore transparency entry: 1568292727
- Sigstore integration time:
-
Permalink:
RKO-solver/RKO_Python@50606ec2e64197139ec5de810a67e9d91ccc4cae -
Branch / Tag:
refs/heads/main - Owner: https://github.com/RKO-solver
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
deploy.yml@50606ec2e64197139ec5de810a67e9d91ccc4cae -
Trigger Event:
push
-
Statement type: