前言
什么是AI?
The theory and development of computer systems able to perform tasks normally requiring human intelligence.(–Oxford Dictionary)
Using data to solve problems.(–cy)
规划问题简介
看到线性规划问题,有没有让你想起峥嵘的高中岁月?高考数学大题第4题,一般就是卷子背面的第一题(湖北考生)。不过高中阶段的线性规划一般是二维的,即变量只有两个x和y,然后求Z的最值,如下图:
不过实际问题可能变量不止2个(x和y),但是求解的思想是一样的。变量很多的时候,手动计算比较麻烦,可以用计算机帮忙跑一下,下面举的简单例子变量只有2个,但是求解N多个也是没有问题的,只需要添加变量和约束就好。
ortools求解简单线性规划问题举例
问题
求解程序
from ortools.linear_solver import pywraplp
# 设置MIP问题解析引擎 SCIP
solver = pywraplp.Solver.CreateSolver('SCIP')
# 变量X Y均为非负 就是设置 x>=0 y>=0
infinity = solver.infinity()
x = solver.IntVar(0.0, infinity, 'x')
y = solver.IntVar(0.0, infinity, 'y')
print('变量数量:', solver.NumVariables())
变量数量: 2
# 设置约束条件
solver.Add(x + 7 * y <= 17.5)#上面已经规定了 x和y是大于0的 这里再补充约束条件
solver.Add(x <= 3.5)
print('约束的数量:', solver.NumConstraints())
约束的数量: 2
# 设置约束条件
solver.Add(x + 7 * y <= 17.5)#上面已经规定了 x和y是大于0的 这里再补充约束条件
solver.Add(x <= 3.5)
print('约束的数量:', solver.NumConstraints())
# 求解最大值问题
solver.Maximize(x + 10 * y) #就是那个目标函数 z=x+10y
status = solver.Solve()
if status == pywraplp.Solver.OPTIMAL:
print('目标值 =', solver.Objective().Value())
print('x =', x.solution_value())
print('y =', y.solution_value())
else:
print('问题没有最优解')
# 显示solve额外信息
print('执行时间(毫秒)',solver.wall_time())
print('Iteration: ',solver.iterations())
print('branch-and-bound nodes: ', solver.nodes())
约束的数量: 4
目标值 = 23.0
x = 3.0
y = 2.0
执行时间(毫秒) 884220
Iteration: 0
branch-and-bound nodes: 1
总结
(如果您发现我写的有错误,欢迎在评论区批评指正)