Эта проблема может быть сформулирована с использованием линейного программирования. Вы можете использовать Gnu Linear Programming Kit (GLPK) и его оболочку Ruby 'rglpk', чтобы решить его.
Загрузите GLPK 4.44 с http://www.gnu.org/software/glpk/ для вашей операционной системы. Разархивируйте пакет и установите приложение, используя следующую команду.
./configure && sudo make clean && sudo make && sudo make install
Откройте командную строку и установите 'rglpk' с помощью команды ниже.
gem install rglpk
Запустите этот код.
require 'rglpk'
#min/max 2a+b
#1. 2a+b=4
#2. a=1
#3. a+b=2
p = Rglpk::Problem.new
p.name = "sample"
p.obj.dir = Rglpk::GLP_MAX
rows = p.add_rows(3)
rows[0].name = "2a+b=4"
rows[0].set_bounds(Rglpk::GLP_UP, 0, 4)
rows[1].name = "a=1"
rows[1].set_bounds(Rglpk::GLP_UP, 0, 1)
rows[2].name = "a+b=2"
rows[2].set_bounds(Rglpk::GLP_UP, 0, 2)
cols = p.add_cols(2)
cols[0].name = "a"
cols[0].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
cols[1].name = "b"
cols[1].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
p.obj.coefs = [2, 1]
p.set_matrix([
2, 1,
1, 0,
1, 1
])
p.simplex
z = p.obj.get
x1 = cols[0].get_prim
x2 = cols[1].get_prim
printf("z = %g; x1 = %g; x2 = %g\n", z, x1, x2)
#=> z = 3; x1 = 1; x2 = 1