v1
Browse files
README.md
CHANGED
|
@@ -9,10 +9,25 @@ tags:
|
|
| 9 |
|
| 10 |
# TTP-D solver weights
|
| 11 |
|
| 12 |
-
Trained checkpoints for the
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
## Layout
|
| 18 |
|
|
@@ -20,37 +35,65 @@ https://github.com/Kcbir/ttpd.
|
|
| 20 |
<variant>/<model>/<family>/n<N>/best.pt
|
| 21 |
```
|
| 22 |
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
|
| 28 |
-
|
|
| 29 |
|---|---|---|
|
| 30 |
-
| `benchmark-tuned/` |
|
| 31 |
-
| `sampled/` |
|
| 32 |
-
| `specialists/` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
|
| 34 |
-
|
| 35 |
-
`
|
|
|
|
|
|
|
| 36 |
|
| 37 |
-
|
| 38 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
|
| 40 |
## Loading
|
| 41 |
|
| 42 |
-
Checkpoints are `torch.save` payloads
|
| 43 |
|
| 44 |
```python
|
| 45 |
import torch
|
| 46 |
from huggingface_hub import hf_hub_download
|
| 47 |
|
| 48 |
-
path = hf_hub_download("Murjani/ttpd-weights", "a280/gat/
|
| 49 |
payload = torch.load(path, map_location="cpu", weights_only=False)
|
| 50 |
policy.load_state_dict(payload["policy"])
|
| 51 |
```
|
| 52 |
|
| 53 |
-
The
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
-
|
| 56 |
-
|
|
|
|
| 9 |
|
| 10 |
# TTP-D solver weights
|
| 11 |
|
| 12 |
+
Trained policy checkpoints for the study *Fly, Pack, Drive: the Travelling Thief
|
| 13 |
+
Problem with Drone*.
|
| 14 |
+
|
| 15 |
+
A capacitated truck and a single-package drone operate from a common depot on a
|
| 16 |
+
collection route. The truck's velocity decreases affinely with its accumulated
|
| 17 |
+
load, so an early pickup penalises every subsequent arc. The drone launches from
|
| 18 |
+
a node at which the truck is present, retrieves one item at an outlying
|
| 19 |
+
customer, and rejoins the truck at a later rendezvous node; whichever vehicle
|
| 20 |
+
arrives first waits, while the rental clock continues to run. The objective is
|
| 21 |
+
to maximise collected profit net of a rental cost proportional to the makespan.
|
| 22 |
+
|
| 23 |
+
These checkpoints are the learned construction policies: an encoder–decoder
|
| 24 |
+
model that embeds the instance once and emits a composite action at each node
|
| 25 |
+
the truck reaches, trained offline with Proximal Policy Optimisation under a
|
| 26 |
+
POMO group baseline.
|
| 27 |
+
|
| 28 |
+
Code: <https://github.com/corbit-lab/ttpd>. Benchmark instances, result tables,
|
| 29 |
+
and behaviour-cloning datasets are in the companion dataset repository
|
| 30 |
+
[`Murjani/ttpd-benchmarks`](https://huggingface.co/datasets/Murjani/ttpd-benchmarks).
|
| 31 |
|
| 32 |
## Layout
|
| 33 |
|
|
|
|
| 35 |
<variant>/<model>/<family>/n<N>/best.pt
|
| 36 |
```
|
| 37 |
|
| 38 |
+
**Variant** is `a280` (fixed drone endurance) or `ttd300` (endurance-conditioned).
|
| 39 |
+
**Model** is `gat` (attention encoder), `mlp` (the encoder ablation), or `lisa`
|
| 40 |
+
(behaviour cloning). **Family** denotes the distribution the policy was trained
|
| 41 |
+
on, which determines its applicability:
|
| 42 |
|
| 43 |
+
| Family | Training distribution | Intended use |
|
| 44 |
|---|---|---|
|
| 45 |
+
| `benchmark-tuned/` | The five benchmark instances of that size | The reported headline results |
|
| 46 |
+
| `sampled/` | Randomly sampled a280 subsets | Generalisation; warm start for the above |
|
| 47 |
+
| `specialists/` | Early small-N runs | The N ≤ 20 rows, using dedicated small models |
|
| 48 |
+
|
| 49 |
+
The `benchmark-tuned` policies warm-start from `sampled/n20` of the same model
|
| 50 |
+
family, as training from scratch does not converge within the budget at the
|
| 51 |
+
larger sizes. Within a run, `best.pt` is the deliverable, selected by held-out
|
| 52 |
+
beam evaluation; `last.pt` supports resumption; and `best_milp.pt` is selected
|
| 53 |
+
by MILP gap rather than evaluation return.
|
| 54 |
|
| 55 |
+
Behaviour-cloned policies are stored at
|
| 56 |
+
`<variant>/lisa/behaviour_cloning/n<N>.pt`, with
|
| 57 |
+
`a280/lisa/behaviour_cloning_initial/` and `a280/lisa/gat-n50/` retained for
|
| 58 |
+
provenance.
|
| 59 |
|
| 60 |
+
## Deliverable checkpoint per model and size
|
| 61 |
+
|
| 62 |
+
| Model and size | Checkpoint |
|
| 63 |
+
|---|---|
|
| 64 |
+
| a280 GAT, N = 5, 10 | `a280/gat/specialists/n5.pt`, `n10.pt` |
|
| 65 |
+
| a280 GAT, N = 15, 20 | `a280/gat/sampled/n<N>/best.pt` |
|
| 66 |
+
| a280 GAT, N = 30–100 | `a280/gat/benchmark-tuned/n<N>/best.pt` |
|
| 67 |
+
| a280 MLP, N = 20 | `a280/mlp/sampled/n20/best.pt` |
|
| 68 |
+
| a280 MLP, remaining sizes | `a280/mlp/benchmark-tuned/n<N>/best.pt` |
|
| 69 |
+
| ttd300 GAT | `ttd300/gat/benchmark-tuned/n<N>/best.pt` |
|
| 70 |
+
| LISA | `<variant>/lisa/behaviour_cloning/n<N>.pt` |
|
| 71 |
+
|
| 72 |
+
The `benchmark-tuned` family also carries the smaller sizes so that a
|
| 73 |
+
directory-based checkpoint argument resolves uniformly.
|
| 74 |
|
| 75 |
## Loading
|
| 76 |
|
| 77 |
+
Checkpoints are `torch.save` payloads keyed under `"policy"`:
|
| 78 |
|
| 79 |
```python
|
| 80 |
import torch
|
| 81 |
from huggingface_hub import hf_hub_download
|
| 82 |
|
| 83 |
+
path = hf_hub_download("Murjani/ttpd-weights", "a280/gat/benchmark-tuned/n30/best.pt")
|
| 84 |
payload = torch.load(path, map_location="cpu", weights_only=False)
|
| 85 |
policy.load_state_dict(payload["policy"])
|
| 86 |
```
|
| 87 |
|
| 88 |
+
The repository code resolves these paths automatically through
|
| 89 |
+
`ttpd.hub.ensure_local`, which returns an existing local file unchanged and
|
| 90 |
+
downloads otherwise, so a machine that already holds the tree performs no
|
| 91 |
+
network access.
|
| 92 |
+
|
| 93 |
+
`manifest.json` records, for every file, the path from which it was published
|
| 94 |
+
together with its SHA-256 digest.
|
| 95 |
+
|
| 96 |
+
## Citation
|
| 97 |
|
| 98 |
+
Please cite the accompanying paper. Reported results, including the comparison
|
| 99 |
+
against the exact solver and the metaheuristics, are given there.
|