using System; using Optimizer; namespace XPRSExamples { class LoadLP { public static void Main(string[] args) { LoadLP example = new LoadLP(); example.Run(); } private void Run() { // Store the problem // Row data int nRow = 4; char[] sRowType = {'L', 'L', 'L', 'L'}; double[] dRHS = { 24.0, 5.0, 20.0, 9 }; string[] sRowName = { "c1", "c2", "c3", "c4" }; // Column data int nCol = 2; double[] dObj = { 2.0, 1 }; double[] dLowerBd = { 0,0}; double[] dUpperBd = { XPRS.PLUSINFINITY, XPRS.PLUSINFINITY }; string[] sColName = { "x", "y" }; // Matrix data int[] nColStart = { 0,3,7 }; int[] nRowInd = {0,2,3,0,1,2,3 }; double[] dMatElem = { 1,3,1,4,1,1,1 }; // Store extra constraint int nNewRow = 1; int nNewElem = 2; char[] sNewRowType = {'L'}; string[] sNewRowName = {"c5"}; double[] dNewRHS = {20}; double[] dNewRowElem = { 6,1 }; int[] nNewRowStart = { 0,2 }; int[] nNewColInd = { 0,1 }; double dObjValue; string sLogFile = "loadlp.log"; string sProblem1 = "lp"; string sProblem2 = "revised"; try { XPRS.Init(""); prob = new XPRSprob(); prob.SetLogFile(sLogFile); // Tell Optimizer to call OptimizerMsg whenever a message is output prob.MessageCallbacks += new MessageCallback (this.OptimizerMsg); prob.LoadLP(sProblem1, nCol, nRow, sRowType, dRHS, null, dObj, nColStart, null, nRowInd, dMatElem, dLowerBd, dUpperBd); prob.ChgObjSense(ObjSense.Maximize); // Add row names prob.AddNames(1, sRowName, 0, nRow -1 ); // Add column names prob.AddNames(2, sColName, 0, nCol -1 ); // Output the matrix prob.WriteProb(sProblem1, ""); // Solve the LP problem prob.LpOptimize(); // Get and display the value of the objective function dObjValue = prob.LPObjVal; Console.WriteLine("The optimal objective value is {0}", dObjValue); // ** Add the extra constraint and solve again ** // Add new row prob.AddRows(nNewRow, nNewElem, sNewRowType, dNewRHS, null, nNewRowStart, nNewColInd, dNewRowElem); // Add new row name prob.AddNames(1, sNewRowName, nRow, nRow); // Output the revised matrix prob.WriteProb(sProblem2, ""); Console.WriteLine("Matrix file {0}.mat has been created", sProblem2); // Solve with dual - since the revised problem inherits dual feasibility // from the original prob.LpOptimize("d"); // Get and display the value of the objective function dObjValue = prob.LPObjVal; Console.WriteLine("The revised optimal objective value is {0}",dObjValue); } catch (XPRSException e) { Console.WriteLine(e.ToString()); throw e; } finally { prob.Destroy(); XPRS.Free(); } } public void OptimizerMsg (XPRSprob prob, object data, string message, int len, int msglvl) { switch(msglvl) { case 3: case 4: Console.WriteLine ("{0}" + message, data); break; } } private XPRSprob prob; } }