Problem pages
The problems page lists every problem released so far. Each problem has a page at /problems/<slug> with:
- the description: the problem statement, with its math;
- the instance schema: what an instance file contains;
- the solution schema: what a solution file must contain;
- the checker, when it is published.
The same content is in GET /problems/{slug}, which also gives the objective's direction: minimize or maximize. A round's problems stay hidden until the round opens.
Reading the schemas
The schemas are annotated examples, not JSON Schema. Each value describes the real one: its type in angle brackets, then its meaning. A list shows one element, standing for all of them.
{
"objective_value": "<float> Total cost of rejected commodities across the entire routing plan.",
"commodities": [
{
"commodity_id": "<int> Identifier of the commodity whose routing outcome is described in this entry.",
"rejected": "<bool> Whether this commodity is rejected and sent on its artificial arc instead of being routed through the network.",
"path_arcs": [ … ]
}
]
}
A solution in that shape:
{
"objective_value": 111,
"commodities": [
{ "commodity_id": 0, "rejected": true, "path_arcs": [] }
]
}
Every solution has a numeric objective_value. The checker recomputes it from your decisions and rejects a solution whose value does not match.
Public instances
Each problem has public instances for development. They don't count towards the score, though Main-track submissions run on them first as a check. Download them from the problem's page once signed in, with GET /problems/{slug}/instances, or with the starter's uv run frontieror init, which saves them to data/problems/<slug>/instances/.
Private instances
Scoring uses private instances, one set per track, which are never published. Main-track solvers run on the Main set in our sandbox; Self-hosted teams download the Self-hosted set during a submission. Both have the same format as the public instances.
Time limits
Each problem is in one of three time classes, by its difficulty and domain: 10 s, 60 s or 5 min per instance. Testing-stage problems all have 60 s. The limit is on the problem's page and listed with the public instances as time_limit_s.
- Main: the solver gets this long; a solver still running at the limit is stopped and scores 0.
- Self-hosted: the solution must be uploaded within this long after the download, plus 60 seconds of grace for the upload.
Checkers
The problems of the testing stage and Stage 1 publish their checker: the code our evaluation runs on every solution. It comes from the FrontierOR benchmark (CC BY 4.0), with the reported and recomputed objective added to its result. Download it from the problem's page once signed in, read it as checker in GET /problems/{slug}, or let the starter's uv run frontieror init save it to data/problems/<slug>/feasibility_check.py.
python feasibility_check.py --instance_path instance.json --solution_path solution.json --result_path result.json
The evaluation runs it in our python-3.12 image. result.json has feasible, violations, reported_objective_value and computed_objective_value; the score uses the computed one.
What stays private
The problems' formal formulations, and the checkers of Stage 2. The description and the schemas are all you need to build a solver.