coinclp: solutorul de programare liniară COIN-OR Clp este din nou pe CRAN

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

Două pachete R mici ale mele au ajuns la CRAN. coinclp leagă solutorul de programare liniară COIN-OR Clp și a fost acceptat la 15 septembrie 2026; ROI.plugin.coinclp îl înregistrează în Infrastructura de optimizare R și se află în coada de trimitere în spatele acestuia. Între ei, au pus înapoi ceva R pierdut la sfârșitul anului 2021, iar această postare este o scurtă descriere a ceea ce a fost, ce fac noile pachete și – pentru că ar fi necinstit să o lași deoparte – când ar trebui să apelezi la un alt solutor cu totul.

De unde vine asta

Clp este unul dintre codurile originale COIN-OR. COIN-OR a început în cadrul IBM Research în 2000 ca o casă open-source pentru software-ul de cercetare operațională, iar Clp – codul simplex al lui John Forrest, cu o metodă de barieră alături – a fost de atunci calul său de lucru al programării liniare. Este matur, gratuit sub Licența Publică Eclipse și bun la ceea ce sunt codurile simplex pentru: rezolvarea unui model, schimbarea lui puțin și rezolvarea lui din nou pe baza pe care o aveți deja.

R a avut o legătură cu el timp de un deceniu. clpAPI lui Gabriel Gelius-Dietrich, scris la Universitatea Heinrich Heine Düsseldorf pentru sibil set de instrumente de modelare metabolică, a fost pe CRAN din 2011. În 2017, Benoit Thieurmel a construit ROI.plugin.clp deasupra, astfel încât oricine care folosește ROI să poată alege Clp cu un singur argument. Apoi, verificările CRAN ale clpAPI au început să eșueze, nimeni nu le-a reparat și a fost arhivată pe 30 noiembrie 2021. ROI.plugin.clp nu a făcut nimic rău, dar depindea de un pachet arhivat, așa că a urmat șase săptămâni mai târziu.

Folosisem clpAPI în propriile mele modele din 2018 și am observat cum o face toată lumea: o instalare R proaspătă, un script care nu s-ar încărca. Enervarea particulară este că pe Windows biblioteca Clp este deja pe mașină — Rtools l-a livrat începând cu versiunea 4.3 — așa că singurul lucru care lipsea erau câteva sute de linii de C++ pentru a ajunge la el.

Ce face coinclp

Legăturile sunt scrise de la zero pe baza actualei biblioteci apelabile Clp, cu puncte de intrare înregistrate și pointeri externi care se curăță după sine și se bazează pe R 4.5 și 4.6. Există trei moduri de intrare.

Primul este un apel. Dați-i un obiectiv, o matrice de constrângeri, direcții și o parte din dreapta și obțineți înapoi soluția, obiectivul, prețurile umbră și costurile reduse împreună:

library(coinclp)

A <- rbind(material = c(120, 210),
           labour   = c(110,  30),
           capacity = c(  1,   1))

fit <- clp_solve(c(143, 60), A, "<=", c(15000, 4000, 75), max = TRUE)

fit$objval    # 6315.625
fit$solution  # 21.875 53.125
fit$duals     # 0.0000 1.0375 28.8750

Matricea de constrângeri poate fi o matrice densă obișnuită, a Matrix matrice rară, a slam matrice tripletă sau simplă i/j/v tripleti. O matrice dispersă merge la Clp ca fiind rară: pachetul trece doar intrările diferite de zero și nu extinde niciodată matricea într-o grilă completă de majoritatea zerouri, ceea ce pentru un model mare este diferența dintre încadrarea în memorie și nu.

A doua este întreaga bibliotecă apelabilă: construiți un model, păstrați-l, schimbați limitele sau coeficienții, predați baza și rezolvați. Pentru asta este Clp și este locul în care interfețele cu un singur apel ale majorității pachetelor de soluționare R te dezamăgesc – un studiu parametric sau o buclă de generare a coloanei care reconstruiește modelul la fiecare iterație aruncă exact informațiile care fac simplexul rapid. În vignetă, o rezoluție strânsă de la o bază salvată necesită zero iterații.

Al treilea este pentru codul vechi. Fiecare funcție clpAPI exportată — initProbCLP(), loadProblemCLP(), solveInitialCLP() iar restul — este reprodus cu aceleași nume și argumente, așa că un script scris împotriva clpAPI are nevoie doar de un nou library() linia. Niciunul dintre codurile clpAPI nu este reutilizat; stratul este o implementare independentă a interfeței sale.

ROI.plugin.coinclp este partea ROI. Rezolvatorul este numit "coinclp" Mai degrabă decât "clp"deoarece ROI preia numele din pachet și, spre deosebire de pluginul din 2017, returnează duble, costuri reduse și activități de rând împreună cu soluția principală:

library(ROI)
library(ROI.plugin.coinclp)

res <- ROI_solve(op, solver = "coinclp")
solution(res, "dual")

Când să nu-l folosești

Clp nu mai este cel mai rapid solutor LP cu sursă deschisă și aș prefera să spun așa decât să afli tu. Comparația evidentă este HiGHS, de la grupul lui Julian Hall din Edinburgh, care este acum soluția implicită LP în SciPy și în MATLAB. Pe benchmark-ul LPopt al lui Hans Mittelmann din septembrie 2026, HiGHS rezolvă 54 din cele 65 de probleme de testare în limita de timp, iar Clp rezolvă 40, iar HiGHS este de aproximativ de două ori mai rapid pe media geometrică scalată. Codurile comerciale sunt din nou mai înainte: COPT rezolvă toate cele 65 și este de aproximativ 27 de ori mai rapid decât Clp pe aceeași măsură.

Benchmark-ul arată, de asemenea, de ce răspunsul sincer este „depinde de model”. În câteva cazuri, Clp este cel mai rapid dintre cele două – Linf_520c durează Clp 36 de secunde și HiGHS 872, iar Clp rezolvă datt256 unde HiGHS expiră, dar la mai multe dintre ele este valabil inversul, uneori cu o marjă largă. Dacă aveți un LP mare de rezolvat o dată, încercați mai întâi highs sau ROI.plugin.highs; cu ROI, comutatorul este un argument, așa că încercarea pe ambele nu costă nimic.

Și Clp rezolvă numai programe liniare. Dacă variabilele tale sunt întregi, ai nevoie de un solutor MIP: HiGHS din nou, sau Rglpk, lpSolve sau Rsymphony proprie a COIN-OR. Pluginul ROI va refuza o problemă cu numere întregi, mai degrabă decât să o relaxeze în liniște și clp_solve() nu are deloc noțiune de variabile întregi.

Acolo unde Clp își câștigă încă locul este genul de muncă pentru care a fost construit: modele care sunt rezolvate de multe ori cu mici modificări, unde un start cald de la baza anterioară contează mai mult decât viteza brută pe o soluție rece; orice vorbește deja despre API-ul Clp, care este mai mult cod decât ai putea crede; și mașinile Windows, unde este singurul solutor LP pe care îl obțineți gratuit cu Rtools și fără instalare ulterioară.

Instalarea acestuia

install.packages("coinclp")
remotes::install_github("SamLovick/ROI.plugin.coinclp")

Sursa, problemele și vigneta sunt la github.com/SamLovick/coinclp și github.com/SamLovick/ROI.plugin.coinclp. Ambele pachete sunt sub Licența Publică Eclipse, care se potrivesc cu COIN-OR. Dacă ați fost un utilizator clpAPI și ceva din stratul de compatibilitate nu se comportă ca înainte, o problemă cu scriptul care s-a rupt ar fi foarte binevenită.

Postul coinclp: solutorul de programare liniară COIN-OR Clp este din nou pe CRAN a apărut mai întâi pe Sam Lovick Consulting.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.