이 문제는 선형 프로그래밍을 사용하여 공식화 할 수 있습니다. Gnu 선형 프로그래밍 키트 (GLPK)와 루비 래퍼 'rglpk'를 사용하여이를 해결할 수 있습니다.
운영 체제에 따라 http://www.gnu.org/software/glpk/에서 GLPK 4.44를 다운로드하십시오. 패키지의 압축을 풀고 다음 명령을 사용하여 응용 프로그램을 설치하십시오.
./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
감사합니다. Diego. RGLPK를 살펴 보았습니다. 더 나은 해결책으로이 특정 문제에 접근 할 수있는 방법에 대한 지침이 있습니까? 그래서 누군가는 그것을 해결하기 위해 브랜드 아웃과 백 방법을 제안했습니다. 당신 의견은 뭐니? – gauravsaraf
* 브랜치 아웃과 다시 *를 의미합니까? 나무 같은 공간을 탐험하는 것 같아요. 짐작할 수 있을지 모르겠군요. – Diego
예. 궁극적으로 무차별 한 힘. 모든 조합을 찾은 다음 선택하는 것보다 낫습니다. 재귀 적 접근을 고려하고 있습니다 :-) – gauravsaraf