调整线性规划获取属性的接口

This commit is contained in:
2025-05-16 17:39:10 +08:00
parent 6d3594c9ba
commit 0ae1785e6c
3 changed files with 311 additions and 47 deletions

View File

@ -5,6 +5,9 @@ using std::vector;
class Expr;
class Var;
#define MDL_MINIMIZE 1
#define MDL_MAXIMIZE -1
Expr operator+(const Expr& x, const Expr& y);
Expr operator-(const Expr& x, const Expr& y);
Expr operator+(const Expr& x);
@ -25,7 +28,6 @@ Expr operator/(const Expr& x, double a);
typedef vector<vector<double>> Matrix;
enum class Rtn {
LOADED,
OPTIMAL,
@ -47,10 +49,212 @@ enum class Rtn {
PIVOT,
};
enum class IntAttr {
NumConstrs,
NumVars,
NumSOS,
NumQConstrs,
NumGenConstrs,
NumNZs,
NumQNZs,
NumQCNZs,
NumIntVars,
NumBinVars,
NumPWLObjVars,
ModelSense,
IsMIP,
IsQP,
IsQCP,
IsMultiObj,
Status,
ConcurrentWinMethod,
SolCount,
BarIterCount,
VBasis,
CBasis,
PWLObjCvx,
BranchPriority,
VarPreStat,
BoundVioIndex,
BoundSVioIndex,
ConstrVioIndex,
ConstrSVioIndex,
ConstrResidualIndex,
ConstrSResidualIndex,
DualVioIndex,
DualSVioIndex,
DualResidualIndex,
DualSResidualIndex,
ComplVioIndex,
IntVioIndex,
IISMinimal,
IISLB,
IISUB,
IISConstr,
IISSOS,
IISQConstr,
IISGenConstr,
IISLBForce,
IISUBForce,
IISConstrForce,
IISSOSForce,
IISQConstrForce,
IISGenConstrForce,
TuneResultCount,
Lazy,
VarHintPri,
ObjNPriority,
NumObj,
GenConstrType,
NumStart,
Partition,
LicenseExpiration,
NumScenarios,
FuncPieces,
BatchErrorCode,
BatchStatus,
Fingerprint,
PoolIgnore,
FuncNonlinear,
ModelColumn
};
enum class DoubleAttr{
Runtime,
Work,
ObjCon,
LB,
UB,
Obj,
Start,
PreFixVal,
RHS,
QCRHS,
Coeff,
MaxCoeff,
MinCoeff,
MaxBound,
MinBound,
MaxObjCoeff,
MinObjCoeff,
MaxRHS,
MinRHS,
MaxQCRHS,
MinQCRHS,
MaxQCCoeff,
MinQCCoeff,
MaxQCLCoeff,
MinQCLCoeff,
MaxQObjCoeff,
MinQObjCoeff,
ObjVal,
ObjBound,
ObjBoundC,
MIPGap,
IterCount,
NodeCount,
X,
RC,
Pi,
QCPi,
Slack,
QCSlack,
MaxVio,
BoundVio,
BoundSVio,
BoundVioSum,
BoundSVioSum,
ConstrVio,
ConstrSVio,
ConstrVioSum,
ConstrSVioSum,
ConstrResidual,
ConstrSResidual,
ConstrResidualSum,
ConstrSResidualSum,
DualVio,
DualSVio,
DualVioSum,
DualSVioSum,
DualResidual,
DualSResidual,
DualResidualSum,
DualSResidualSum,
ComplVio,
ComplVioSum,
IntVio,
IntVioSum,
Kappa,
KappaExact,
SAObjLow,
SAObjUp,
SALBLow,
SALBUp,
SARHSLow,
SAUBLow,
SAUBUp,
SARHSUp,
Xn,
FarkasProof,
FarkasDual,
UnbdRay,
PStart,
DStart,
BarX,
VarHintVal,
ObjN,
ObjNCon,
ObjNWeight,
ObjNRelTol,
ObjNAbsTol,
ObjNVal,
OpenNodeCount,
PoolObjBound,
PoolObjVal,
ScenNLB,
ScenNUB,
ScenNObj,
ScenNRHS,
ScenNX,
ScenNObjBound,
ScenNObjVal,
FuncPieceError,
FuncPieceLength,
FuncPieceRatio,
DNumNZs
};
enum class StringAttr {
ModelName,
VarName,
ConstrName,
QCName,
GenConstrName,
ObjNName,
ScenNName,
BatchID,
VTag,
CTag,
QCTag,
BatchErrorMessage
};
enum class ConstrOper {
LESS_EQUAL,
GREATER_EQUAL,
EQUAL
};
class Var {
public:
Var(double coef = 1) :col(0), coeffs(coef) {};
Var(double coef = 1) :col(0), val(0), coeffs(coef) {};
double get(DoubleAttr attr);
int get(IntAttr attr);
friend class Model;
friend class Expr;
private:
double coeffs;
double val;
int col;
};
@ -101,18 +305,17 @@ class Model
public:
Model();
Var* addVars(int col);
void addConstr(const Expr& expr, char sense, double rhs);
void setObjective(Expr obje, int sense = 0);
void addConstr(const Expr& expr, ConstrOper sense, double rhs);
void setObjective(Expr obje, int sense = MDL_MAXIMIZE);
void print();
Rtn optimize(bool isMax = true);
double get();
Rtn optimize();
double get(DoubleAttr attr);
int get(IntAttr attr);
private:
double _simplex();
Rtn _pivot(std::pair<size_t, size_t>& p);
void _gaussian(std::pair<size_t, size_t> p);
Var* vars;
Matrix matrix;
@ -120,4 +323,5 @@ private:
vector<int> basic;
Rtn rtn;
double res;
int sense;
};