void SolveModelInterface(void) { USES_CONVERSION; IOptiMax* pMpl = NULL; ISolvers* pSolvers = NULL; ISolver* pSolver = NULL; IModels* pModels = NULL; IModel* pModel = NULL; IMatrix* pMatrix = NULL; IVariables* pVars = NULL; IConstraints* pCons = NULL; ISolution* pSol = NULL; IVariableVectors* pVarVectors = NULL; IVariableVector* pVarVect = NULL; IVariable* pVar = NULL; CComBSTR bStr; CComVariant vtModelName; CComVariant vtVarName; long result; long varCount; long conCount; long nzCount; long intCount; char resultStr[128]; double objectValue; long iterCount; long nodeCount; BOOL posValid; double varValue; HRESULT hr; int i = 0; char *ModelFilename = "c:\\mplwin4\\plan.mpl"; CoInitialize(NULL); hr = CoCreateInstance(CLSID_OptiMax, NULL, CLSCTX_ALL, IID_IOptiMax, ( void **)&pMpl); if (!SUCCEEDED(hr)) { printf("Initialize OptiMax failed (hr=%d)\n\n", hr); return; } bStr = "c:\\mplwin4\\CPLEX65.dll"; pMpl->get_Solvers(&pSolvers); // Set pSolvers = MPL.Solvers pSolvers->Add(bStr, &pSolver); // Set pSolver = pSolvers.Add "CPLEX" if (!pSolver) { printf("Solvers.Add(\"%ls\") failed, solver not found!\n\n",bStr); goto SOLVER_ADD_FAILED; } vtModelName = "Model1"; pMpl->get_Models(&pModels); // Set pModels = MPL.Models pModels->Add(vtModelName, &pModel); // Set pModel = pModels.Add("Model1") printf("READ: '%s'\n", ModelFilename); bStr = ModelFilename; pModel->ReadModel(bStr, &result); // Set result = pModel.ReadModel("plan.mpl") if (result) { printf("ReadModel(%s) failed (result=%d)\n\n", ModelFilename, result); goto MODEL_READMODEL_FAILED; } pModel->get_Matrix(&pMatrix); // Set pMatrix = pModel.Matrix pMatrix->get_Variables(&pVars); // Set pVars = pMatrix.Variables pMatrix->get_Constraints(&pCons); // Set pCons = pMatrix.Constraints pVars->get_Count(&varCount); // Set varCount = pVars.Count pCons->get_Count(&conCount); // Set conCount = pCons.Count pMatrix->get_NonZeroCount(&nzCount); // Set nzCount = pMatrix.NonZeroCount pVars->get_IntegerCount(&intCount); // Set intCount = pVars.IntegerCount printf("MODEL: vars=%d, cons=%d, nz=%d, int=%d\n", varCount, conCount, nzCount, intCount); pModel->Solve(pSolver, &result); // Set result = pModel.Solve(pSolver) if (result) { printf("Solve() failed (result=%d)\n\n", result); goto MODEL_SOLVE_FAILED; } pModel->get_Solution(&pSol); // Set pSol = pModel.Solution pSol->get_ObjectValue(&objectValue); // Set objectValue = pSol.ObjectValue pSol->get_IterationCount(&iterCount); // set iterCount = pSol.IterationCount pSol->get_NodeCount(&nodeCount); // Set nodeCount = pSol.NodeCount pSol->get_ResultString(&bStr); // Set ResultStr = pSol.ResultString strcpy(resultStr, W2CA(bStr)); printf("SOLVE: obj=%.10lg, iter=%d, nodes=%d, result='%s'\n", objectValue, iterCount, nodeCount, resultStr); vtVarName = "Prod"; pModel->get_VariableVectors(&pVarVectors); pVarVectors->get_Item(vtVarName, &pVarVect); if (!pVarVect) { printf("Could not find variable named '%s' in '%s'\n\n", "Prod", ModelFilename); goto MODEL_GETVARVECTOR_FAILED; } printf("PROD: "); pVarVect->MoveFirstPos(&pVar); pVarVect->get_PosValid(&posValid); while (posValid) { i++; pVar->get_Activity(&varValue); pVar->Release(); printf(" [%d]=%.10lg,", i, varValue); pVarVect->MoveNextPos(&pVar); pVarVect->get_PosValid(&posValid); } printf("\n\n"); pVarVect->Release(); MODEL_GETVARVECTOR_FAILED: pVarVectors->Release(); pSol->Release(); MODEL_SOLVE_FAILED: pVars->Release(); pCons->Release(); pMatrix->Release(); MODEL_READMODEL_FAILED: pModel->Release(); pModels->Release(); pSolver->Release(); SOLVER_ADD_FAILED: pSolvers->Release(); pMpl->Release(); CoUninitialize(); }