 |
/* p is an initialized QSprob, a handle to an existing LP problem */
/* Assume that p was solved with QSopt_dual() or QSopt_primal, and */
/* that the status code indicates that an optimal solution was */
/* obtained. We will grab and print all solution components. */
int rval, ncols, nrows, i, j;
double value;
double *x, *pi, *slack, *rc;
char **colnames, **rownames;
ncols = QSget_colcount (p);
nrows = QSget_rowcount (p);
/* Get the variable names and the constraint names, for printing */
colnames = (char **) malloc (ncols * sizeof (char *));
rownames = (char **) malloc (nrows * sizeof (char *));
rval = QSget_colnames (p, colnames);
if (rval) {
fprintf (stderr,
"Could not get column names, error code %d\n", rval);
/* free the memory for colnames and rownames */
/* return an error code */
}
rval = QSget_rownames (p, rownames);
if (rval) {
fprintf (stderr,
"Could not get row names, error code %d\n", rval);
/* free the memory for colnames and rownames */
/* return an error code */
}
/* Allocate memory for the solution components. */
x = (double *) malloc (ncols * sizeof (double));
rc = (double *) malloc (ncols * sizeof (double));
pi = (double *) malloc (nrows * sizeof (double));
slack = (double *) malloc (nrows * sizeof (double));
rval = QSget_solution (p, &value, x, pi, slack, rc);
if (rval) {
fprintf (stderr,
"Could not get solution, error code %d\n", rval);
/* free the memory for x, rc, pi, slack, colnames, rownames */
/* return an error code */
}
printf ("Objective Value = %.6f\n", value);
for (j = 0; j < ncols; j++) {
printf ("%s = %.6f, reduced cost = %.6f\n",
colnames[j], x[j], rc[j]);
}
for (i = 0; i < nrows; i++) {
printf ("dual %s = %.6f, slack = %.6f\n",
rownames[i], pi[i], slack[i]);
}
/* Free the memory, including the individual names of cols and rows */
free (x); free (rc); free (pi); free (slack);
for (j = 0; j < ncols; j++) {
/* Use QSfree for memory from QSopt functs */
QSfree (colnames[j]);
}
free (colnames);
for (i = 0; i < nrows; i++) {
/* Use QSfree for memory from QSopt functs */
QSfree (rownames[i]);
}
free (rownames);
|