simplex 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +7 -6
- data/lib/simplex.rb +14 -5
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c7dddbf0b80831adfd609722385b79e61c3e541
|
4
|
+
data.tar.gz: 5a21258e6ab16af709a34c45848f9e5c68ced58c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 769f0edd69b3770e369f6dbb5cbf10c8d1f1dda626392dcf01397fa8874fd38b32251fb76ac104a96171841e8e48dd6ef6c876626b39520f974228f27f7c9e6b
|
7
|
+
data.tar.gz: 5e7010f1267a55da2a2219508fb896e3a547c66d4605d8a0f349eccd2126d4c3d6ca7d696bdb3c4f1f25c2b6f307fe1fe1c9ef700b35e3271460d6736a43a4f3
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@ simplex
|
|
4
4
|
|
5
5
|
A naive pure-Ruby implementation of the Simplex algorithm for solving linear programming problems. Solves maximizations in standard form.
|
6
6
|
|
7
|
-
|
7
|
+
### Why?
|
8
8
|
|
9
9
|
I wrote this because I needed to solve some small allocation problems for a web game I'm writing,
|
10
10
|
and there didn't seem to be any Ruby 2.0 bindings for the "pro" solver libraries,
|
@@ -14,16 +14,16 @@ and anyway they are hard to install on Heroku.
|
|
14
14
|
and when you can accept not that great performance.
|
15
15
|
* *Don't use it for*: large LP problems, when you have access to native solvers, when you need very fast solving time.
|
16
16
|
|
17
|
-
|
17
|
+
### Usage
|
18
18
|
|
19
19
|
To solve the linear programming problem:
|
20
20
|
|
21
|
-
|
21
|
+
max x + y
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
2x + y <= 4
|
24
|
+
x + 2y <= 3
|
25
25
|
|
26
|
-
|
26
|
+
x, y >= 0
|
27
27
|
|
28
28
|
Like this:
|
29
29
|
|
@@ -35,4 +35,5 @@ Like this:
|
|
35
35
|
],
|
36
36
|
[4, 3] # .. and the rhs of the inequalities
|
37
37
|
).solution
|
38
|
+
# => [(5/3), (2/3)]
|
38
39
|
|
data/lib/simplex.rb
CHANGED
@@ -11,7 +11,8 @@ class Vector
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class Simplex
|
14
|
-
DEFAULT_MAX_ITERATIONS =
|
14
|
+
DEFAULT_MAX_ITERATIONS = 10_000
|
15
|
+
|
15
16
|
attr_accessor :max_iterations
|
16
17
|
|
17
18
|
def initialize(c, a, b)
|
@@ -38,8 +39,10 @@ class Simplex
|
|
38
39
|
def solve
|
39
40
|
return if @solved
|
40
41
|
i = 0
|
41
|
-
while can_improve?
|
42
|
+
while can_improve?
|
42
43
|
i += 1
|
44
|
+
raise "Too many iterations" if i > max_iterations
|
45
|
+
|
43
46
|
pivot_column = entering_variable_ix
|
44
47
|
pivot_row = minimum_coefficient_ratio_row_ix(pivot_column)
|
45
48
|
leaving_var = leaving_variable(pivot_row)
|
@@ -103,7 +106,7 @@ class Simplex
|
|
103
106
|
current_min_index = nil
|
104
107
|
@c.each_with_index do |v, i|
|
105
108
|
if v < 0
|
106
|
-
if current_min_value == nil || v
|
109
|
+
if current_min_value == nil || v < current_min_value
|
107
110
|
current_min_value = v
|
108
111
|
current_min_index = i
|
109
112
|
end
|
@@ -125,8 +128,11 @@ class Simplex
|
|
125
128
|
current_min_index = nil
|
126
129
|
0.upto(@a.row_count - 1) do |row_ix|
|
127
130
|
next if @a[row_ix, column_ix] == 0
|
128
|
-
|
129
|
-
|
131
|
+
b_val = @b[row_ix]
|
132
|
+
a_val = @a[row_ix, column_ix]
|
133
|
+
ratio = Rational(b_val, a_val)
|
134
|
+
is_negative = (@b[row_ix] < 0 || @a[row_ix, column_ix] < 0) && !(@b[row_ix] < 0 && @a[row_ix, column_ix] < 0)
|
135
|
+
if !is_negative && (!current_min_value || ratio <= current_min_value)
|
130
136
|
current_min_value = ratio
|
131
137
|
current_min_index = row_ix
|
132
138
|
end
|
@@ -135,3 +141,6 @@ class Simplex
|
|
135
141
|
end
|
136
142
|
|
137
143
|
end
|
144
|
+
|
145
|
+
|
146
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simplex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Lucraft
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Naive implementation of the simplex linear programming algorithm in pure
|
14
14
|
Ruby.
|
@@ -38,7 +38,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
38
38
|
version: '0'
|
39
39
|
requirements: []
|
40
40
|
rubyforge_project:
|
41
|
-
rubygems_version: 2.0.
|
41
|
+
rubygems_version: 2.0.3
|
42
42
|
signing_key:
|
43
43
|
specification_version: 4
|
44
44
|
summary: Simplex linear programming solver
|