Envoyez n'importe quel problème d'optimisation. Recevez une seule réponse.
Tournées, ordonnancement, planning, conditionnement, allocation, et tout autre problème qui a des décisions, des contraintes et un coût. Décrivez le problème une fois, nommez un solveur ou un méta-solveur, et payez à la seconde de résolution avec un plafond de coût strict sur chaque exécution.
{
"api_version": "1",
"problem": {
"variables": [
{"name": "chairs", "lower": 0},
{"name": "tables", "lower": 0}
],
"constraints": [
{"expr": "4*chairs + 8*tables <= 160", "name": "machine_hours"},
{"expr": "2*chairs + 3*tables <= 75", "name": "material"}
],
"objective": {"sense": "max", "expr": "45*chairs + 80*tables"}
},
"solver": "highs",
"options": {"compute_preset": "cpu-standard", "time_limit_seconds": 5, "tags": ["quickstart"]}
}
"solver": "highs","compute_preset": "cpu-standard","time_limit_seconds": 5
Afficher toute l'enveloppe
{
"api_version": "1",
"problem": {
"variables": [
{"name": "chairs", "lower": 0},
{"name": "tables", "lower": 0}
],
"constraints": [
{"expr": "4*chairs + 8*tables <= 160", "name": "machine_hours"},
{"expr": "2*chairs + 3*tables <= 75", "name": "material"}
],
"objective": {"sense": "max", "expr": "45*chairs + 80*tables"}
},
"solver": "highs",
"options": {"compute_preset": "cpu-standard", "time_limit_seconds": 5, "tags": ["quickstart"]}
}
- objective
- 1750
- hold
- réglé
- wall_seconds
- 0.4
- solver_used
- highs
- outcome
- solved
- termination_status
- OPTIMAL
- chairs
- 30
- tables
- 5
L'optimisation est difficile à acheter
Les mathématiques ont quatre-vingts ans derrière elles. C'est leur mise en production qui bloque les équipes, parce que le paysage des solveurs est fragmenté.
Chaque solveur est différent
API, format de modèle et licences propres. L'expertise sur l'un se transfère mal au suivant.
API, format, licence
Les contraintes se reformulent
Natif pour un moteur, refait pour un autre. Les résultats reviennent sous autant de formes qu'il y a de solveurs.
n solveurs, n formats
Toutes les contraintes ne sont pas gérées
Une exigence peut tomber hors de ce que votre moteur accepte. Vous déplacez alors tout le modèle, ou vous l'approchez de loin, et le modèle cesse de coller au problème réel.
une contrainte, un nouveau moteur
Les moteurs demandent du matériel différent
Certains tournent sur CPU, d'autres réclament un GPU. Choisir un moteur, c'est désormais provisionner la machine qui le fait tourner, avant de savoir s'il l'emporte.
CPU ou GPU, selon le moteur
Le choix, c'est l'expertise
Savoir quel moteur convient à vos contraintes est en soi une question de recherche. Y répondre correctement demande un spécialiste d'un domaine qui n'est pas le vôtre.
le choix est le travail
Le meilleur moteur ne cesse de changer
Les solveurs publient des versions, et celui qui l'emportait sur vos instances l'an dernier ne l'emporte peut-être plus. Personne dans votre équipe n'est payé pour refaire ce banc d'essai.
chaque version rebat les cartes
Les modèles de données se soudent aux éditeurs
Engagez-vous sur un solveur et votre schéma s'engage aussi, en silence. En sortir, c'est défaire la soudure sous pression.
une seule enveloppe à la place
Écrivez le modèle. Nous faisons tourner tout ce qu'il y a dessous.
Rien dans cette liste ne concerne votre métier. Tout cela est de la mécanique, et la mécanique est à nous.
- Écrire le modèle : les décisions, les contraintes, l'objectif.
- Fixer une échéance et un plafond de coût pour l'exécution.
- Lire la réponse, toujours sous la même forme.
- Apprendre une nouvelle API, un nouveau format de modèle et une nouvelle licence pour chaque moteur.
- Reformuler les mêmes contraintes pour le moteur suivant.
- Abandonner une exigence parce que le moteur ne la prend pas.
- Provisionner une machine GPU pour une exécution d'une minute.
- Décider quel moteur convient au problème que vous avez devant vous.
- Refaire les bancs d'essai à chaque nouvelle version de solveur.
- Laisser le schéma d'un éditeur entrer dans votre base de données.
Ajoutez une contrainte le trimestre prochain : votre modèle change, rien d'autre.
Une enveloppe, versionnée
Quatre parties. Nous possédons et validons l'emballage. Le problème à l'intérieur est le vôtre.
{
"api_version": "1",
"problem": {
"variables": [
{"name": "chairs", "lower": 0},
{"name": "tables", "lower": 0}
],
"constraints": [
{"expr": "4*chairs + 8*tables <= 160",
"name": "machine_hours"},
{"expr": "2*chairs + 3*tables <= 75",
"name": "material"}
],
"objective": {
"sense": "max",
"expr": "45*chairs + 80*tables"
}
},
"solver": "highs",
"options": {
"compute_preset": "cpu-standard",
"time_limit_seconds": 5,
"tags": ["quickstart"]
}
}
- api_version
- La version du protocole. Toujours "1" aujourd'hui.
- problem
- Votre modèle : variables, contraintes, un objectif. Opaque pour nous, validé par le solveur.
- solver
- Un nom de solveur concret, ou un nom de méta-solveur : un ensemble nommé de moteurs membres, dont n'importe lequel peut prendre le travail.
- options
- time_limit_seconds, compute_preset, webhook, idempotency_key, tags. Tous facultatifs.
Nous traitons le corps de votre problème comme opaque. Le manager valide l'enveloppe et mesure le calcul, mais ne lit jamais votre modèle.
Soumettre, suivre, récupérer
La soumission renvoie aussitôt un identifiant et un statut queued. Enregistrez un webhook signé et la réponse vous parvient d'elle-même, ou gardez une requête ouverte sur l'appel wait jusqu'à la fin du problème. Récupérez la solution en un appel.
- solved
- une solution optimale ou dans la tolérance
- no_solution
- infaisable ou non borné, prouvé et facturé, parce que la preuve est le produit
- limit
- un budget a arrêté la résolution ; la solution courante est renvoyée s'il en existe une
- error
- le moteur a cassé sur ce modèle ; pas de réessai, choisissez un autre solveur ou reformulez
Conçu pour des solveurs qui plantent et des réseaux qui coupent
Une résolution plantée ou bloquée est détectée et remise en file, puis reprise. Vous êtes facturé une seule fois, pour la tentative réussie. Les webhooks terminaux sont réessayés avec temporisation croissante, puis versés dans un journal dead-letter que vous pouvez inspecter et rejouer.
Une enveloppe, deux tentatives, une facture
- Taille de l'enveloppe
- jusqu'à 20 Mo
- Limite de temps
- 300 s par défaut, 6 h au maximum
- Soumission par lot
- jusqu'à 100 enveloppes en un appel
- Relances des webhooks
- 1 min, 5 min, 25 min, 2 h, puis dead-letter
- Signature
- X-Solve-Signature, HMAC SHA-256 sur le corps brut
- Facturation après un plantage
- une seule fois, uniquement la tentative réussie
- Annulé en file
- gratuit, réserve libérée
- Limitation de débit
- 429 avec Retry-After
Chaque moteur que nous exécutons, et s'il répond en ce moment
Aucun moteur n'est publié sur ce site pour l'instant.
Les moteurs ouverts tournent chez nous. Les moteurs commerciaux tournent sous votre propre licence. Un méta-solveur est un ensemble nommé de moteurs membres, pas une boîte noire, et le moteur utilisé et son prix sont indiqués sur chaque résultat.
Mesuré comme du calcul, chiffré avant l'exécution
cost = base_fee + ceil(seconds × effective_rate)
Chaque moteur a des frais de base publiés et un tarif par seconde du calcul qu'il réserve, et chaque profil de calcul multiplie ce tarif. Le coût maximum découle du moteur, du profil et de la durée que vous fixez, et il est réservé sur votre solde avant le démarrage de la résolution. Vous payez les secondes utilisées. Annulez quand vous voulez et payez ces secondes, jamais plus. Crédits offerts à l'inscription, sans carte.
Une API REST qui se lit d'une traite
Des points de terminaison versionnés, des erreurs structurées qui nomment le champ fautif, des webhooks signés avec un journal de livraison visible, et un flux d'événements quand vous ne pouvez pas les recevoir. Chaque intégration fait les trois mêmes gestes : soumettre, suivre, récupérer.
Écrivez le modèle en Python et lisez la solution sous forme d'objets. La soumission, l'appel wait, la vérification des webhooks et les réessais idempotents sont déjà emballés. Le Studio l'exécute dans le navigateur, sans rien installer.
Clés cantonnées, secrets hachés, sortie réseau contrôlée
Clés
Les clés nommées ne fonctionnent que sur l'API d'optimisation et se révoquent une par une : vous en faites tourner une sans toucher aux autres.
Secrets
Stockés uniquement sous forme de hachages. Le secret brut est affiché une fois et jamais plus.
Sortie des webhooks
Les cibles sont vérifiées face aux plages privées et de métadonnées avant que nous nous connections : une URL détournée ne peut pas atteindre de services internes.
Conservation
Les charges utiles sont purgées selon un calendrier publié, 90 jours par défaut. Les métadonnées restent pour votre piste d'audit.
Les questions que les ingénieurs posent vraiment
Puis-je forcer un solveur précis ?
Oui. Nommez un solveur concret dans l'enveloppe et il est respecté à la lettre. Un méta-solveur, c'est pour quand vous préférez ne pas choisir.
Quelles classes de problème sont prises en charge ?
Tout ce que les moteurs connectés résolvent : LP, MIP, NLP, CP, ordonnancement et tournées. L'enveloppe est agnostique quant à la classe de problème, par conception.
Que se passe-t-il si une résolution plante en cours ?
Elle est détectée et remise en file automatiquement, puis reprise. Vous la voyez dans l'historique des tentatives, et vous êtes facturé une seule fois, pour la tentative réussie.
Combien de temps conservez-vous les données de mon problème ?
Les charges utiles sont purgées selon un calendrier publié, 90 jours par défaut. Les métadonnées restent pour votre piste d'audit. Après la purge, une récupération renvoie 410 purged.
Votre première résolution est à cinq minutes
Lancez un vrai modèle sur un vrai solveur, dans le navigateur. Sans compte, sans carte bancaire.