📄 lp_solve.c
字号:
#include <string.h>
#include <time.h>
#include "lpkit.h"
#include "lpglob.h"
#include "patchlevel.h"
void print_help(char *argv[])
{
printf("Usage of %s version %s:\n", argv[0], PATCHLEVEL);
printf("%s [options] [[<]input_file]\n", argv[0]);
printf("list of options:\n");
printf("-h\t\tprints this message\n");
printf("-v\t\tverbose mode, gives flow through the program\n");
printf("-d\t\tdebug mode, all intermediate results are printed,\n\t\tand the branch-and-bound decisions\n");
printf("-p\t\tprint the values of the dual variables\n");
printf("-b <bound>\tspecify a lower bound for the objective function\n\t\tto the program. If close enough, may speed up the\n\t\tcalculations.\n");
printf("-i\t\tprint all intermediate valid solutions.\n\t\tCan give you useful solutions even if the total run time\n\t\tis too long\n");
printf("-e <number>\tspecifies the epsilon which is used to determine whether a\n\t\tfloating point number is in fact an integer.\n\t\tShould be < 0.5\n");
printf("-c\t\tduring branch-and-bound, take the ceiling branch first\n");
printf("-s\t\tuse automatic problem scaling.\n");
printf("-I\t\tprint info after reinverting\n");
printf("-t\t\ttrace pivot selection\n");
printf("-mps\t\tread from MPS file instead of lp file\n");
printf("-degen\t\tuse perturbations to reduce degeneracy,\n\t\tcan increase numerical instability\n");
printf("-trej <Trej>\tset minimum pivot value\n");
printf("-parse_only\tparse input file but do not calculate (ie check)\n");
printf("-time\t\tPrint CPU time to parse input and to calculate result\n");
printf("-min\t\tMinimize the lp problem (overrules setting in file)\n");
printf("-max\t\tMaximize the lp problem (overrules setting in file)\n");
}
void print_cpu_times(const char *info)
{
static clock_t last_time = 0;
clock_t new_time;
new_time = clock();
fprintf(stderr, "CPU Time for %s: %gs (%gs total since program start)\n",
info, (new_time - last_time) / (double) CLOCKS_PER_SEC,
new_time / (double) CLOCKS_PER_SEC);
last_time = new_time;
}
int main(int argc, char *argv[])
{
lprec *lp;
int i;
short verbose = FALSE;
short debug = FALSE;
short print_sol = FALSE;
short print_duals = FALSE;
short floor_first = TRUE;
short scaling = FALSE;
short print_at_invert = FALSE;
short tracing = FALSE;
short mps = FALSE;
short anti_degen = FALSE;
short print_timing = FALSE;
short parse_only = FALSE;
short do_presolve = FALSE;
short objective = 0;
int result;
REAL obj_bound = (REAL)DEF_INFINITE;
REAL epsilon = (REAL)DEF_EPSILON;
FILE *fpin = stdin;
Trej = 1e-4; /* default, MB */
/* read command line arguments */
for(i = 1; i < argc; i++) {
if(strcmp(argv[i], "-v") == 0)
verbose = TRUE;
else if(strcmp(argv[i], "-d") == 0)
debug = TRUE;
else if(strcmp(argv[i], "-i") == 0)
print_sol = TRUE;
else if(strcmp(argv[i], "-c") == 0)
floor_first = FALSE;
else if(strcmp(argv[i], "-b") == 0)
obj_bound = atof(argv[++i]);
else if(strcmp(argv[i], "-e") == 0) {
epsilon = atof(argv[++i]);
if((epsilon <= 0.0) || (epsilon >= 0.5)) {
fprintf(stderr, "Invalid epsilon %g; 0 < epsilon < 0.5\n",
(double)epsilon);
exit(EXIT_FAILURE);
}
}
else if(strcmp(argv[i], "-p") == 0)
print_duals = TRUE;
else if(strcmp(argv[i], "-h") == 0) {
print_help(argv);
exit(EXIT_SUCCESS);
}
else if(strcmp(argv[i], "-s") == 0)
scaling = TRUE;
else if(strcmp(argv[i], "-I") == 0)
print_at_invert = TRUE;
else if(strcmp(argv[i], "-t") == 0)
tracing = TRUE;
else if(strcmp(argv[i],"-mps") == 0)
mps = TRUE;
else if(strcmp(argv[i],"-degen") == 0)
anti_degen = TRUE;
else if(strcmp(argv[i],"-time") == 0) {
if(clock() == -1)
fprintf(stderr, "CPU times not available on this machine\n");
else
print_timing = TRUE;
}
else if(strcmp(argv[i],"-trej") == 0)
Trej = atof(argv[++i]);
else if(strcmp(argv[i],"-parse_only") == 0)
/* only useful for parser software development */
parse_only = TRUE;
else if(strcmp(argv[i],"-presolve") == 0)
do_presolve = TRUE;
else if(strcmp(argv[i],"-min") == 0)
objective = -1;
else if(strcmp(argv[i],"-max") == 0)
objective = 1;
else if(fpin == stdin) {
if((fpin = fopen(argv[i],"r")) == NULL) {
fprintf(stderr,"Error, Unable to open input file '%s'\n",
argv[i]);
print_help(argv);
exit(EXIT_FAILURE);
}
}
else {
fprintf(stderr, "Error, Unrecognized command line argument '%s'\n",
argv[i]);
print_help(argv);
exit(EXIT_FAILURE);
}
}
if(mps)
lp = read_mps(fpin, verbose);
else /* standard lp_solve syntax expected */
lp = read_lp_file(stdin, verbose, "lp" );
if(fpin != stdin)
fclose(fpin);
if(print_timing)
print_cpu_times("parsing input");
if(parse_only)
exit(0);
if(verbose)
print_lp(lp);
if(scaling) {
auto_scale(lp);
if(verbose) {
printf("Scaled matrix:\n");
print_lp(lp);
}
}
lp->print_sol = print_sol;
lp->epsilon = epsilon;
lp->print_duals = print_duals;
lp->debug = debug;
lp->floor_first = floor_first;
lp->print_at_invert = print_at_invert;
lp->trace = tracing;
if(obj_bound != DEF_INFINITE)
lp->obj_bound = obj_bound;
lp->anti_degen = anti_degen;
lp->do_presolve = do_presolve;
if(verbose) {
printf("Solving\n");
lp->verbose = TRUE;
}
result = solve(lp);
if(print_timing)
print_cpu_times("solving");
if(result == OPTIMAL) {
print_solution(lp);
if(verbose)
fprintf(stderr,
"Branch & Bound depth: %d\nNodes processed: %d\nSimplex pivots: %d\n",
lp->max_level, lp->total_nodes, lp->total_iter);
}
else if(result == INFEASIBLE)
printf("This problem is infeasible\n");
else if(result == UNBOUNDED)
printf("This problem is unbounded\n");
else if(result == FAILURE)
printf("lp_solve failed\n");
return(result);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -