lpsolve 5.5.10.i
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +78 -0
- data/VERSION +1 -0
- data/doc/Doxyfile +1127 -0
- data/doc/run_doxygen +107 -0
- data/doc/typos.txt +29 -0
- data/example/boilerplate.rb +8 -0
- data/example/demo.rb +223 -0
- data/example/lp.lp +9 -0
- data/example/lp.mps +25 -0
- data/example/model.lp +8 -0
- data/example/model.mps +16 -0
- data/example/rubydemo.rb +215 -0
- data/ext/Makefile +187 -0
- data/ext/extconf.rb +11 -0
- data/ext/lpconsts.c +174 -0
- data/ext/lpsolve.c +2915 -0
- data/test/Rakefile +8 -0
- data/test/lp_model.right +24 -0
- data/test/lpsolve.right +60 -0
- data/test/mps_model.right +24 -0
- data/test/test_lpsolve.rb +530 -0
- metadata +96 -0
data/doc/run_doxygen
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# $Id: run_doxygen,v 1.1 2003/11/09 14:11:02 rocky Exp $
|
3
|
+
|
4
|
+
# Runs doxygen and massages the output files.
|
5
|
+
# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
|
6
|
+
#
|
7
|
+
# Synopsis: run_doxygen --mode=[user|maint|man] v3srcdir v3builddir
|
8
|
+
#
|
9
|
+
# Originally hacked together by Phil Edwards <pme@gcc.gnu.org>
|
10
|
+
|
11
|
+
|
12
|
+
# We can check now that the version of doxygen is >= this variable.
|
13
|
+
DOXYVER=1.2.15
|
14
|
+
doxygen=
|
15
|
+
|
16
|
+
find_doxygen() {
|
17
|
+
v_required=`echo $DOXYVER | \
|
18
|
+
awk -F. '{if(NF<3)$3=0;print ($1*100+$2)*100+$3}'`
|
19
|
+
testing_version=
|
20
|
+
# thank you goat book
|
21
|
+
set `IFS=:; X="$PATH:/usr/local/bin:/bin:/usr/bin"; echo $X`
|
22
|
+
for dir
|
23
|
+
do
|
24
|
+
# AC_EXEEXT could come in useful here
|
25
|
+
maybedoxy="$dir/doxygen"
|
26
|
+
test -f "$maybedoxy" && testing_version=`$maybedoxy --version`
|
27
|
+
if test -n "$testing_version"; then
|
28
|
+
v_found=`echo $testing_version | \
|
29
|
+
awk -F. '{if(NF<3)$3=0;print ($1*100+$2)*100+$3}'`
|
30
|
+
if test $v_found -ge $v_required; then
|
31
|
+
doxygen="$maybedoxy"
|
32
|
+
break
|
33
|
+
fi
|
34
|
+
fi
|
35
|
+
done
|
36
|
+
if test -z "$doxygen"; then
|
37
|
+
echo run_doxygen error: Could not find Doxygen $DOXYVER in path. 1>&2
|
38
|
+
print_usage
|
39
|
+
fi
|
40
|
+
}
|
41
|
+
|
42
|
+
print_usage() {
|
43
|
+
cat 1>&2 <<EOF
|
44
|
+
Usage: run_doxygen --mode=MODE [<options>] <v3-src-dir> <v3-build-dir>
|
45
|
+
MODE is one of:
|
46
|
+
user Generate user-level HTML library documentation.
|
47
|
+
maint Generate maintainers' HTML documentation (lots more;
|
48
|
+
exposes non-public members, etc).
|
49
|
+
man Generate user-level man pages.
|
50
|
+
|
51
|
+
more options when i think of them
|
52
|
+
|
53
|
+
Note: Requires Doxygen ${DOXYVER} or later; get it at
|
54
|
+
ftp://ftp.stack.nl/pub/users/dimitri/doxygen-${DOXYVER}.src.tar.gz
|
55
|
+
|
56
|
+
EOF
|
57
|
+
exit 1
|
58
|
+
}
|
59
|
+
|
60
|
+
parse_options() {
|
61
|
+
for o
|
62
|
+
do
|
63
|
+
# Blatantly ripped from autoconf, er, I mean, "gratefully standing
|
64
|
+
# on the shoulders of those giants who have gone before us."
|
65
|
+
case "$o" in
|
66
|
+
-*=*) arg=`echo "$o" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
67
|
+
*) arg= ;;
|
68
|
+
esac
|
69
|
+
|
70
|
+
case "$o" in
|
71
|
+
--mode=*)
|
72
|
+
mode=$arg ;;
|
73
|
+
--mode | --help | -h)
|
74
|
+
print_usage ;;
|
75
|
+
*)
|
76
|
+
# this turned out to be a mess, maybe change to --srcdir=, etc
|
77
|
+
if test $srcdir = unset; then
|
78
|
+
srcdir=$o
|
79
|
+
elif test $outdir = unset; then
|
80
|
+
builddir=${o}
|
81
|
+
outdir=${o}/doc/doxygen
|
82
|
+
else
|
83
|
+
echo run_doxygen error: Too many arguments 1>&2
|
84
|
+
exit 1
|
85
|
+
fi
|
86
|
+
;;
|
87
|
+
esac
|
88
|
+
done
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
# script begins here
|
93
|
+
mode=unset
|
94
|
+
srcdir=unset
|
95
|
+
outdir=unset
|
96
|
+
do_html=no
|
97
|
+
do_man=no
|
98
|
+
enabled_sections=
|
99
|
+
DATEtext=`date '+%Y-%m-%d'`
|
100
|
+
|
101
|
+
parse_options $*
|
102
|
+
find_doxygen
|
103
|
+
$doxygen ./Doxyfile
|
104
|
+
|
105
|
+
exit 0
|
106
|
+
|
107
|
+
# vim:ts=4:et:
|
data/doc/typos.txt
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
print routine: don't show 0's in as coefficients. Show SOS sets
|
2
|
+
Don't show anything if no columns.
|
3
|
+
|
4
|
+
Automatically adjust width of 1st column, row names, based on the
|
5
|
+
width of the longest row name.
|
6
|
+
|
7
|
+
is_debug:
|
8
|
+
---------
|
9
|
+
mend -> meant.
|
10
|
+
|
11
|
+
get_solutioncount
|
12
|
+
algoritm -> algorithm
|
13
|
+
|
14
|
+
SOS.html:
|
15
|
+
---------
|
16
|
+
|
17
|
+
In SOS example
|
18
|
+
|
19
|
+
sos
|
20
|
+
SOS: x1,x2,x3,x4,x5 <= 2;
|
21
|
+
|
22
|
+
Can't deal with <=2. Use instead:
|
23
|
+
|
24
|
+
sos2
|
25
|
+
sos: x1,x2,x3,x4,x5;
|
26
|
+
|
27
|
+
is_SOS_var:
|
28
|
+
----------
|
29
|
+
Small wording things. should for must.
|
data/example/demo.rb
ADDED
@@ -0,0 +1,223 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# $Id: demo.rb,v 1.7 2007/03/28 02:11:59 rocky Exp $
|
3
|
+
require "rubygems"
|
4
|
+
require 'highline/import'
|
5
|
+
|
6
|
+
Mypath = File.expand_path(File.dirname(__FILE__))
|
7
|
+
old_dir = File.expand_path(Dir.pwd)
|
8
|
+
if old_dir != Mypath
|
9
|
+
Dir.chdir(Mypath)
|
10
|
+
end
|
11
|
+
$: << Mypath + '/../ext'
|
12
|
+
require "lpsolve"
|
13
|
+
|
14
|
+
def press_ret
|
15
|
+
ask("[return]") { |q| q.echo = true }
|
16
|
+
end
|
17
|
+
|
18
|
+
def error()
|
19
|
+
STDERR.print "Error\n"
|
20
|
+
exit 1
|
21
|
+
end
|
22
|
+
|
23
|
+
lp = LPSolve.new(0, 4)
|
24
|
+
|
25
|
+
Vers=lp.version
|
26
|
+
Vers_str = "%d.%d.%d.%d" % Vers
|
27
|
+
puts "lp_solve %s demo\n\n" % Vers_str
|
28
|
+
|
29
|
+
if not lp
|
30
|
+
error
|
31
|
+
end
|
32
|
+
|
33
|
+
puts "This demo will show most of the features of lp_solve %s" % Vers_str
|
34
|
+
press_ret
|
35
|
+
puts "We start by creating a new problem with 4 variables and 0 constraints"
|
36
|
+
puts "We use: lp=make_lp(0,4);"
|
37
|
+
press_ret
|
38
|
+
|
39
|
+
puts "We can show the current problem with print_lp(lp)"
|
40
|
+
lp.print_lp
|
41
|
+
press_ret
|
42
|
+
|
43
|
+
puts "Now we add some constraints"
|
44
|
+
puts "str_add_constraint(lp, \"3 2 2 1\" ,LE,4)"
|
45
|
+
puts "This is the string version of add_constraint. For the normal version"
|
46
|
+
puts "of add_constraint see the help file"
|
47
|
+
|
48
|
+
if not lp.str_add_constraint("3 2 2 1", LPSolve::LE, 4)
|
49
|
+
puts "Error in adding constraint"
|
50
|
+
error
|
51
|
+
end
|
52
|
+
|
53
|
+
lp.print_lp()
|
54
|
+
press_ret
|
55
|
+
|
56
|
+
puts "str_add_constraint(lp, \"0 4 3 1\" ,GE,3)"
|
57
|
+
if not lp.str_add_constraint("0 4 3 1", LPSolve::GE, 3)
|
58
|
+
puts "Error in adding constraint"
|
59
|
+
error
|
60
|
+
end
|
61
|
+
lp.print_lp()
|
62
|
+
press_ret
|
63
|
+
|
64
|
+
puts "Set the objective function"
|
65
|
+
puts "str_set_obj_fn(lp, \"2 3 -2 3\")"
|
66
|
+
if not lp.str_set_obj_fn("2 3 -2 3")
|
67
|
+
puts "Error in setting objective function"
|
68
|
+
error
|
69
|
+
end
|
70
|
+
lp.print_lp()
|
71
|
+
press_ret
|
72
|
+
|
73
|
+
puts "Now solve the problem with printf(solve(lp));"
|
74
|
+
solution = lp.solve
|
75
|
+
puts "%d" % solution
|
76
|
+
press_ret
|
77
|
+
|
78
|
+
puts "The value is 0, this means we found an optimal solution"
|
79
|
+
puts "We can display this solution with print_objective(lp) and print_solution(lp)"
|
80
|
+
|
81
|
+
lp.print_objective
|
82
|
+
lp.print_solution(1)
|
83
|
+
lp.print_constraints(1)
|
84
|
+
press_ret
|
85
|
+
|
86
|
+
puts "The dual variables of the solution are printed with"
|
87
|
+
puts "print_duals(lp);"
|
88
|
+
lp.print_duals()
|
89
|
+
press_ret
|
90
|
+
|
91
|
+
puts "We can change a single element in the matrix with"
|
92
|
+
puts "set_mat(lp,2,1,0.5)"
|
93
|
+
|
94
|
+
if (!lp.set_mat(2,1,0.5))
|
95
|
+
error
|
96
|
+
end
|
97
|
+
|
98
|
+
lp.print_lp
|
99
|
+
press_ret
|
100
|
+
puts "If we want to maximize the objective function use set_maxim(lp);"
|
101
|
+
lp.set_maxim
|
102
|
+
lp.print_lp
|
103
|
+
press_ret
|
104
|
+
puts "after solving this gives us:\n"
|
105
|
+
lp.solve
|
106
|
+
lp.print_objective
|
107
|
+
lp.print_solution(1)
|
108
|
+
lp.print_constraints(1)
|
109
|
+
lp.print_duals
|
110
|
+
press_ret
|
111
|
+
puts "Change the value of a rhs element with set_rh(lp,1,7.45)"
|
112
|
+
lp.set_rh(1,7.45)
|
113
|
+
lp.print_lp
|
114
|
+
lp.solve
|
115
|
+
lp.print_objective
|
116
|
+
lp.print_solution(1)
|
117
|
+
lp.print_constraints(1)
|
118
|
+
press_ret
|
119
|
+
puts "We change %s to the integer type with" % lp.get_col_name(4)
|
120
|
+
puts "set_int(lp, 4, TRUE)"
|
121
|
+
lp.set_int(4, true)
|
122
|
+
lp.print_lp
|
123
|
+
puts "We set branch & bound debugging on with set_debug(lp, TRUE)"
|
124
|
+
lp.set_debug(true)
|
125
|
+
puts "and solve..."
|
126
|
+
press_ret()
|
127
|
+
lp.solve
|
128
|
+
lp.print_objective
|
129
|
+
lp.print_solution(1)
|
130
|
+
lp.print_constraints(1)
|
131
|
+
press_ret()
|
132
|
+
puts "We can set bounds on the variables with"
|
133
|
+
puts "set_lowbo(lp,2,2); & set_upbo(lp,4,5.3)"
|
134
|
+
lp.set_lowbo(2,2)
|
135
|
+
lp.set_upbo(4,5.3)
|
136
|
+
lp.print_lp
|
137
|
+
press_ret
|
138
|
+
lp.solve
|
139
|
+
lp.print_objective
|
140
|
+
lp.print_solution(1)
|
141
|
+
lp.print_constraints(1)
|
142
|
+
press_ret
|
143
|
+
puts "Now remove a constraint with del_constraint(lp, 1)"
|
144
|
+
lp.del_constraint(1)
|
145
|
+
lp.print_lp
|
146
|
+
puts ("Add an equality constraint")
|
147
|
+
if not lp.str_add_constraint("1 2 1 4", LPSolve::EQ, 8)
|
148
|
+
error()
|
149
|
+
end
|
150
|
+
lp.print_lp
|
151
|
+
press_ret
|
152
|
+
printf("A column can be added with:\n")
|
153
|
+
printf("str_add_column(lp,\"3 2 2\");\n")
|
154
|
+
if (not lp.str_add_column("3 2 2"))
|
155
|
+
error
|
156
|
+
end
|
157
|
+
lp.print_lp
|
158
|
+
press_ret
|
159
|
+
printf("A column can be removed with:\n");
|
160
|
+
printf("del_column(lp,3);\n");
|
161
|
+
lp.del_column(3)
|
162
|
+
lp.print_lp
|
163
|
+
press_ret
|
164
|
+
printf("We can use automatic scaling with:\n")
|
165
|
+
printf("set_scaling(lp, SCALE_MEAN);\n")
|
166
|
+
lp.set_scaling(LPSolve::SCALE_MEAN)
|
167
|
+
lp.print_lp
|
168
|
+
press_ret
|
169
|
+
|
170
|
+
printf("The function get_mat(lprec *lp, int row, int column) returns a single\n");
|
171
|
+
printf("matrix element\n");
|
172
|
+
printf("%s get_mat(lp,2,3), get_mat(lp,1,1); gives\n","printf(\"%f %f\\n\",");
|
173
|
+
printf("%f %f\n", lp.get_mat(2,3), lp.get_mat(1,1));
|
174
|
+
printf("Notice that get_mat returns the value of the original unscaled problem\n");
|
175
|
+
press_ret();
|
176
|
+
printf("If there are any integer type variables, then only the rows are scaled\n");
|
177
|
+
printf("set_int(lp,3,FALSE);\n");
|
178
|
+
printf("set_scaling(lp, SCALE_MEAN);\n");
|
179
|
+
lp.set_scaling(LPSolve::SCALE_MEAN);
|
180
|
+
lp.set_int(3,FALSE);
|
181
|
+
lp.print_lp
|
182
|
+
press_ret
|
183
|
+
lp.solve
|
184
|
+
printf("print_objective, print_solution gives the solution to the original problem\n");
|
185
|
+
lp.print_objective
|
186
|
+
lp.print_solution(1);
|
187
|
+
lp.print_constraints(1);
|
188
|
+
press_ret
|
189
|
+
|
190
|
+
printf("Scaling is turned off with unscale(lp);\n");
|
191
|
+
lp.unscale;
|
192
|
+
lp.print_lp
|
193
|
+
press_ret();
|
194
|
+
printf("Now turn B&B debugging off and simplex tracing on with\n");
|
195
|
+
printf("set_debug(lp, FALSE), set_trace(lp, TRUE) and solve(lp)\n");
|
196
|
+
lp.set_debug(FALSE);
|
197
|
+
lp.set_trace(TRUE);
|
198
|
+
press_ret();
|
199
|
+
lp.solve
|
200
|
+
|
201
|
+
printf("Where possible, lp_solve will start at the last found basis\n");
|
202
|
+
printf("We can reset the problem to the initial basis with\n");
|
203
|
+
printf("default_basis(lp). Now solve it again...\n");
|
204
|
+
press_ret();
|
205
|
+
lp.default_basis
|
206
|
+
lp.solve
|
207
|
+
|
208
|
+
printf("It is possible to give variables and constraints names\n");
|
209
|
+
printf("set_row_name(lp,1,\"speed\"); & set_col_name(lp,2,\"money\")\n");
|
210
|
+
if (not lp.set_row_name(1,"speed"))
|
211
|
+
error();
|
212
|
+
end
|
213
|
+
if (!lp.set_col_name(2,"money"))
|
214
|
+
error();
|
215
|
+
end
|
216
|
+
lp.print_lp
|
217
|
+
printf("As you can see, all column and rows are assigned default names\n");
|
218
|
+
printf("If a column or constraint is deleted, the names shift place also:\n");
|
219
|
+
press_ret();
|
220
|
+
printf("del_column(lp,1);\n");
|
221
|
+
lp.del_column(1);
|
222
|
+
lp.print_lp
|
223
|
+
press_ret();
|
data/example/lp.lp
ADDED
data/example/lp.mps
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
*<meta creator='lp_solve v5.5'>
|
2
|
+
*<meta rows=2>
|
3
|
+
*<meta columns=3>
|
4
|
+
*<meta equalities=1>
|
5
|
+
*<meta integers=0>
|
6
|
+
*<meta origsense='MAX'>
|
7
|
+
*
|
8
|
+
NAME
|
9
|
+
ROWS
|
10
|
+
N R0
|
11
|
+
G speed
|
12
|
+
E R2
|
13
|
+
COLUMNS
|
14
|
+
money R0 -3.000000000 speed 4.0000000000
|
15
|
+
money R2 2.0000000000
|
16
|
+
C3 R0 -3.000000000 speed 1.0000000000
|
17
|
+
C3 R2 4.0000000000
|
18
|
+
C4 R0 -3.000000000 speed 2.0000000000
|
19
|
+
C4 R2 2.0000000000
|
20
|
+
RHS
|
21
|
+
RHS speed 3.0000000000 R2 8.0000000000
|
22
|
+
BOUNDS
|
23
|
+
LO BND money 2.0000000000
|
24
|
+
UP BND C3 5.3000000000
|
25
|
+
ENDATA
|
data/example/model.lp
ADDED
data/example/model.mps
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
* model.mps
|
2
|
+
NAME
|
3
|
+
ROWS
|
4
|
+
N R0
|
5
|
+
L R1
|
6
|
+
L R2
|
7
|
+
L R3
|
8
|
+
COLUMNS
|
9
|
+
x R0 143.00000000 R1 120.00000000
|
10
|
+
x R2 110.00000000 R3 1.0000000000
|
11
|
+
y R0 60.00000000 R1 210.00000000
|
12
|
+
y R2 30.000000000 R3 1.0000000000
|
13
|
+
RHS
|
14
|
+
RHS R1 15000.000000 R2 4000.0000000
|
15
|
+
RHS R3 75.000000000
|
16
|
+
ENDATA
|
data/example/rubydemo.rb
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# $Id: demo.rb,v 1.7 2007/03/28 02:11:59 rocky Exp $
|
3
|
+
require "rubygems"
|
4
|
+
require 'highline/import'
|
5
|
+
|
6
|
+
Mypath = File.expand_path(File.dirname(__FILE__))
|
7
|
+
old_dir = File.expand_path(Dir.pwd)
|
8
|
+
if old_dir != Mypath
|
9
|
+
Dir.chdir(Mypath)
|
10
|
+
end
|
11
|
+
$: << Mypath + '/../ext'
|
12
|
+
require "lpsolve"
|
13
|
+
|
14
|
+
def press_ret
|
15
|
+
ask("[return]") { |q| q.echo = true }
|
16
|
+
end
|
17
|
+
|
18
|
+
def error()
|
19
|
+
STDERR.print "Error\n"
|
20
|
+
exit 1
|
21
|
+
end
|
22
|
+
|
23
|
+
Vers=LPsolve::version
|
24
|
+
Vers_str = "%d.%d.%d.%d" % Vers
|
25
|
+
puts "lp_solve %s demo\n" % Vers_str
|
26
|
+
|
27
|
+
puts "This demo will show most of the features of lp_solve %s" % Vers_str
|
28
|
+
press_ret
|
29
|
+
puts "We start by creating a new problem with 4 variables and 0 constraints"
|
30
|
+
puts "We use: lp = LPSolve.new(0,4)"
|
31
|
+
lp = LPSolve.new(0, 4)
|
32
|
+
error if not lp
|
33
|
+
press_ret
|
34
|
+
|
35
|
+
puts "We can show the current problem with lp.print_lp"
|
36
|
+
lp.print_lp
|
37
|
+
press_ret
|
38
|
+
|
39
|
+
puts "Now we add some constraints"
|
40
|
+
puts 'lp.str_add_constraint("3 2 2 1", LPSolve::LE, 4)'
|
41
|
+
puts "This is the string version of add_constraint. For the normal version"
|
42
|
+
puts "of add_constraint see the help file"
|
43
|
+
|
44
|
+
if not lp.str_add_constraint("3 2 2 1", LPSolve::LE, 4)
|
45
|
+
puts "Error in adding constraint"
|
46
|
+
error
|
47
|
+
end
|
48
|
+
|
49
|
+
lp.print_lp()
|
50
|
+
press_ret
|
51
|
+
|
52
|
+
puts 'lp.str_add_constraint("0 4 3 1\" ,GE,3)'
|
53
|
+
if not lp.str_add_constraint("0 4 3 1", LPSolve::GE, 3)
|
54
|
+
puts "Error in adding constraint"
|
55
|
+
error
|
56
|
+
end
|
57
|
+
lp.print_lp()
|
58
|
+
press_ret
|
59
|
+
|
60
|
+
puts "Set the objective function"
|
61
|
+
puts 'lp.str_set_obj_fn("2 3 -2 3")'
|
62
|
+
if not lp.str_set_obj_fn("2 3 -2 3")
|
63
|
+
puts "Error in setting objective function"
|
64
|
+
error
|
65
|
+
end
|
66
|
+
lp.print_lp()
|
67
|
+
press_ret
|
68
|
+
|
69
|
+
puts "Now solve the problem with lp.solve;"
|
70
|
+
solution = lp.solve
|
71
|
+
puts "%d" % solution
|
72
|
+
press_ret
|
73
|
+
|
74
|
+
puts "The value is 0, this means we found an optimal solution"
|
75
|
+
puts "We can display this solution with lp.print_objective and lp.print_solution"
|
76
|
+
|
77
|
+
lp.print_objective
|
78
|
+
lp.print_solution(1)
|
79
|
+
lp.print_constraints(1)
|
80
|
+
press_ret
|
81
|
+
|
82
|
+
puts "The dual variables of the solution are printed with"
|
83
|
+
puts "lp.print_duals"
|
84
|
+
lp.print_duals()
|
85
|
+
press_ret
|
86
|
+
|
87
|
+
puts "We can change a single element in the matrix with"
|
88
|
+
puts "lp.set_mat(2,1,0.5)"
|
89
|
+
|
90
|
+
error if not lp.set_mat(2,1,0.5)
|
91
|
+
|
92
|
+
lp.print_lp
|
93
|
+
press_ret
|
94
|
+
puts "If we want to maximize the objective function use lp.set_maxim"
|
95
|
+
lp.set_maxim
|
96
|
+
lp.print_lp
|
97
|
+
press_ret
|
98
|
+
puts "after solving this gives us:\n"
|
99
|
+
lp.solve
|
100
|
+
lp.print_objective
|
101
|
+
lp.print_solution(1)
|
102
|
+
lp.print_constraints(1)
|
103
|
+
lp.print_duals
|
104
|
+
press_ret
|
105
|
+
puts "Change the value of a rhs element with set_rh(lp,1,7.45)"
|
106
|
+
lp.set_rh(1,7.45)
|
107
|
+
lp.print_lp
|
108
|
+
lp.solve
|
109
|
+
lp.print_objective
|
110
|
+
lp.print_solution(1)
|
111
|
+
lp.print_constraints(1)
|
112
|
+
press_ret
|
113
|
+
puts "We change %s to the integer type with" % lp.get_col_name(4)
|
114
|
+
puts "lp.set_int(4, TRUE)"
|
115
|
+
lp.set_int(4, true)
|
116
|
+
lp.print_lp
|
117
|
+
puts "We set branch & bound debugging on with lp.set_debug(TRUE)"
|
118
|
+
lp.set_debug(true)
|
119
|
+
puts "and solve..."
|
120
|
+
press_ret()
|
121
|
+
lp.solve
|
122
|
+
lp.print_objective
|
123
|
+
lp.print_solution(1)
|
124
|
+
lp.print_constraints(1)
|
125
|
+
press_ret()
|
126
|
+
puts "We can set bounds on the variables with"
|
127
|
+
puts "lp.set_lowbo(2,2); & lp.set_upbo(4,5.3)"
|
128
|
+
lp.set_lowbo(2,2)
|
129
|
+
lp.set_upbo(4,5.3)
|
130
|
+
lp.print_lp
|
131
|
+
press_ret
|
132
|
+
lp.solve
|
133
|
+
lp.print_objective
|
134
|
+
lp.print_solution(1)
|
135
|
+
lp.print_constraints(1)
|
136
|
+
press_ret
|
137
|
+
puts "Now remove a constraint with lp.del_constraint(1)"
|
138
|
+
lp.del_constraint(1)
|
139
|
+
lp.print_lp
|
140
|
+
puts ("Add an equality constraint")
|
141
|
+
if not lp.str_add_constraint("1 2 1 4", LPSolve::EQ, 8)
|
142
|
+
error()
|
143
|
+
end
|
144
|
+
lp.print_lp
|
145
|
+
press_ret
|
146
|
+
puts "A column can be added with:"
|
147
|
+
puts 'lp.str_add_column("3 2 2")'
|
148
|
+
error if not lp.str_add_column("3 2 2")
|
149
|
+
lp.print_lp
|
150
|
+
press_ret
|
151
|
+
puts "A column can be removed with:"
|
152
|
+
puts "del_column(lp,3)"
|
153
|
+
lp.del_column(3)
|
154
|
+
lp.print_lp
|
155
|
+
press_ret
|
156
|
+
puts "We can use automatic scaling with:"
|
157
|
+
puts "lp.scaling = LPSolve::SCALE_MEAN"
|
158
|
+
lp.scaling = LPSolve::SCALE_MEAN
|
159
|
+
lp.print_lp
|
160
|
+
press_ret
|
161
|
+
|
162
|
+
puts "The function lp.get_mat(row, column) returns a single"
|
163
|
+
puts "matrix element"
|
164
|
+
printf("%s get_mat(lp,2,3), get_mat(lp,1,1); gives\n","printf(\"%f %f\\n\",");
|
165
|
+
printf("%f %f\n", lp.get_mat(2,3), lp.get_mat(1,1))
|
166
|
+
puts "Notice that get_mat returns the value of the original unscaled problem"
|
167
|
+
press_ret
|
168
|
+
puts "If there are any integer type variables, then only the rows are scaled"
|
169
|
+
puts "lp.set_int(3,FALSE)"
|
170
|
+
puts "lp.scaling = LPSolve::SCALE_MEAN"
|
171
|
+
lp.scaling = LPSolve::SCALE_MEAN
|
172
|
+
lp.set_int(3,FALSE)
|
173
|
+
lp.print_lp
|
174
|
+
press_ret
|
175
|
+
lp.solve
|
176
|
+
puts "print_objective, print_solution gives the solution to the original problem"
|
177
|
+
lp.print_objective
|
178
|
+
lp.print_solution(1)
|
179
|
+
lp.print_constraints(1)
|
180
|
+
press_ret
|
181
|
+
|
182
|
+
puts "Scaling is turned off with lp.unscale;"
|
183
|
+
lp.unscale;
|
184
|
+
lp.print_lp
|
185
|
+
press_ret
|
186
|
+
puts "Now turn B&B debugging off and simplex tracing on with"
|
187
|
+
puts "lp.debug = FALSE, lp.trace = TRUE) and lp.solve"
|
188
|
+
lp.set_debug(FALSE);
|
189
|
+
lp.set_trace(TRUE);
|
190
|
+
press_ret();
|
191
|
+
lp.solve
|
192
|
+
|
193
|
+
puts "Where possible, lp_solve will start at the last found basis"
|
194
|
+
puts "We can reset the problem to the initial basis with"
|
195
|
+
puts "default_basis(lp). Now solve it again..."
|
196
|
+
press_ret
|
197
|
+
lp.default_basis
|
198
|
+
lp.solve
|
199
|
+
|
200
|
+
puts "It is possible to give variables and constraints names"
|
201
|
+
puts 'lp.set_row_name(1, "speed"); & lp.set_col_name(2,"money")'
|
202
|
+
if (not lp.set_row_name(1,"speed"))
|
203
|
+
error();
|
204
|
+
end
|
205
|
+
if (!lp.set_col_name(2,"money"))
|
206
|
+
error();
|
207
|
+
end
|
208
|
+
lp.print_lp
|
209
|
+
puts "As you can see, all column and rows are assigned default names"
|
210
|
+
puts "If a column or constraint is deleted, the names shift place also:"
|
211
|
+
press_ret
|
212
|
+
puts "lp.del_column(1)"
|
213
|
+
lp.del_column(1)
|
214
|
+
lp.print_lp
|
215
|
+
press_ret
|