SCIP求解整数规划实例
- 使用开源的求解器scip
- 以python接口求解整数规划问题demo
-
整数规划问题:
m i n Z = 5 x 1 + 6 x 2 + 23 x 3 + 5 x 4 + 24 x 5 + 6 x 6 + 23 x 7 + 5 x 8 { 2 ∗ x 1 + x 2 + x 3 + x 4 > = 100 2 ∗ x 2 + x 3 + 3 ∗ x 5 + 2 ∗ x 6 + x 7 > = 150 x 1 + x 3 + 3 ∗ x 4 + 2 ∗ x 6 + 3 ∗ x 7 + 5 ∗ x 8 > = 100 x j > = 0 且 为 整 数 ; j = 1 , 2 , . . . , 8 minZ = 5x_1 +6x_2+23x_3+5x_4+24x_5+6x_6+23x_7+5x_8\\ \begin{cases} 2*x_1 + x_2 + x_3 + x_4 >= 100\\ 2*x_2+ x_3 + 3*x_5 + 2*x_6 + x_7 >= 150\\ x_1 + x_3 + 3*x_4 + 2*x_6 + 3*x_7 + 5*x_8 >= 100\\ x_j>=0且为整数;j=1,2,...,8 \end{cases} minZ=5x1+6x2+23x3+5x4+24x5+6x6+23x7+5x8⎩⎪⎪⎪⎨⎪⎪⎪⎧2∗x1+x2+x3+x4>=1002∗x2+x3+3∗x5+2∗x6+x7>=150x1+x3+3∗x4+2∗x6+3∗x7+5∗x8>=100xj>=0且为整数;j=1,2,...,8 -
demo.py
import pyscipopt as opt
def test_opt():
model = opt.Model()
# 定义变量
x1 = model.addVar(vtype='I', name='x1')
x2 = model.addVar(vtype='I', name='x2')
x3 = model.addVar(vtype='I', name='x3')
x4 = model.addVar(vtype='I', name='x4')
x5 = model.addVar(vtype='I', name='x5')
x6 = model.addVar(vtype='I', name='x6')
x7 = model.addVar(vtype='I', name='x7')
x8 = model.addVar(vtype='I', name='x8')
# 定义约束
model.addCons(2*x1 + x2 + x3 + x4 >= 100)
model.addCons(2*x2+ x3 + 3*x5 + 2*x6 + x7 >= 150)
model.addCons(x1 + x3 + 3*x4 + 2*x6 + 3*x7 + 5*x8 >= 100)
# 设置目标函数
model.setObjective(5*x1 + 6*x2 + 23*x3 + 5*x4 + 24*x5 + 6*x6 + 23*x7 + 5*x8)
model.setMinimize()
model.hideOutput()
# 优化求解
model.optimize()
# 求解状态
m_gap = model.getGap()
m_status = model.getStatus()
print('m_status = ', m_status)
print('m_gap =', m_gap)
# 求解值
print('目标函数值: ', model.getObjVal())
print('x1 = ', model.getVal(x1))
print('x2 = ', model.getVal(x2))
print('x3 = ', model.getVal(x3))
print('x4 = ', model.getVal(x4))
print('x5 = ', model.getVal(x5))
print('x6 = ', model.getVal(x6))
print('x7 = ', model.getVal(x7))
print('x8 = ', model.getVal(x8))
if __name__ == '__main__':
# 求解简单整数规划问题
test_opt()
- 输出结果