Or-tools学习

举报
Abracadabra 发表于 2020/05/19 15:31:41 2020/05/19
【摘要】 Ortools简介lortools是google的开源优化算法包,支持线性规划、整数规划,可以方便的求解Routing、Bin packing、Network flows、Assignment、Scheduling等问题。l官网地址为:https://developers.google.com/optimization l开源代码地址为 https://github.com/google/o...

Ortools简介

lortoolsgoogle的开源优化算法包,支持线性规划、整数规划,可以方便的求解RoutingBin packingNetwork flowsAssignmentScheduling等问题

l网地址为:https://developers.google.com/optimization 

l源代码地址为 https://github.com/google/or-tools 

l算法包支持javac++c#python 

lPython安装算法包方式: 

ppip install ortools 

ppip install ortools-7.5.7466-cp37-cp37m-win_amd64.whl(要先从pypi官网下载到本地,用于无法直接pip安装的备用安装方式)

Ortools基本求解器

1.约束优化求解器(Constraint ProgrammingCP-SAToriginal-CP 2.线性规划和混合整数规划求解器(接口)(Linear and Mixed-Integer Programming),包括 CBCCLPGLOPGLPKGurobiCPLEX SCIP 

3.算法(Graph Algorithms(最短路径、最小成本、最大流量、线性求和分配) 

4.经典旅行推销员问题和车辆路径问题(Vehicle Routing)。

5.排产问题和指派问题。 

6.经典装箱和背包算法

Ortools使用

1.定义要使用的求解器 ­

使用线性规划求解器: ­

from ortools.linear_solver import pywraplp  

­solver = pywraplp.Solver('LinearExample',pywraplp.Solver.GLOP_LINEAR_PROGRAMMING) ­使用混合整数规划求解器: ­

from ortools.linear_solver import pywraplp  

­solver = pywraplp.Solver('SolveIntegerProblem',pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING) 

2.定义要使用的变量 ­x = solver.NumVar(-solver.infinity(), solver.infinity(), ‘x’)   (定义实数类型变量) 

­x = solver.IntVar(0.0, solver.infinity(), ‘x’) (定义整数类型变量) 

3.定义约束 ­

# x + 7 * y <= 17.5 

­constraint1 = solver.Constraint(-solver.infinity(), 17.5) ­constraint1.SetCoefficient(x, 1) 

­constraint1.SetCoefficient(y, 7)

4.定义目标函数 ­

# Maximize x + 10 * y. 

­objective = solver.Objective()objective.SetCoefficient(x, 1) ­objective.SetCoefficient(y, 10) ­objective.SetMaximization() 

5.求解 ­

solver.Solve() 

6.获得求解器的得到的变量值和目标函数解

­print('x = ', x.solution_value()) 

­print('y = ', y.solution_value()) 

­print('Optimal objective value = %d' % solver.Objective().Value())

Ortools路径问题

image.png

一.定义数据集 data = create_data_model()


二.定义节点索引管理 

负责算法内部对城市地点索引的管理和计算

manager = pywrapcp.RoutingIndexManager(len(data['locations']),

                                                                    data['num_vehicles'],

                                                                    data['depot'])

三.创建路径模型 

routing = pywrapcp.RoutingModel(manager)

四.routing对象指定获取距离值的回调方法 

transit_callback_index = routing.RegisterTransitCallback(distance_callback)

.设定算法搜索参数

search_parameters = pywrapcp.DefaultRoutingSearchParameters() 

search_parameters.first_solution_strategy = (routing_enums_pb2.FirstSolutionStrategy.PATH_CHEAPEST_ARC) 

. 调用元启发式策略

search_parameters.local_search_metaheuristic = (routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH) search_parameters.time_limit.seconds = 20 search_parameters.log_search = True GREEDY_DESCENTGUIDED_LOCAL_SEARCHSIMULATED_ANNEALINGTABU_SEARCH

.调用计算方法得到结果

assignment = routing.SolveWithParameters(search_parameters)

Ortools车间作业调度问题

问题介绍:

image.png

job 0 = [(0, 3), (1, 2), (2, 2)]

job 1 = [(0, 2), (2, 1), (1, 4)] 

job 2 = [(1, 4), (2, 3)]


task(i, j)表示作业i序列中的第j任务 

t_i,j表示task(i, j)的开始时间

问题建模:

优先约束:对于同一作业中的任意两个连续任务,必须在启动第二个任务之前完成第一个任务


没有重叠的约束:机器不能同时处理两个任务


目标函数最小化从作业的最早开始时间到最近结束时间的时间长度。

1.定义要使用的模型 

­使用Constraint programming(约束优化)模型: ­

from ortools.sat.python import cp_model ­model = cp_model.CpModel()

2.定义数据 ­ 

jobs_data = [[(0, 3), (1, 2), (2, 2)],  # Job0 ­        

[(0, 2), (2, 1), (1, 4)],  # Job1 ­       

[(1, 4), (2, 3)] # Job2 ­] 

3.定义约束  ­ 

# Create and add disjunctive constraints. ­    

for machine in all_machines: ­        

model.AddNoOverlap(machine_to_intervals[machine]) ­ 

# Precedences inside a job. ­   

for job_id, job in enumerate(jobs_data): ­        

    for task_id in range(len(job) - 1): ­            

        model.Add(all_tasks[job_id, task_id +1].start >= all_tasks[job_id, task_id].end)

4.定义目标函数 ­

# Makespan objective. ­    

model.Minimize(obj_var) 

5.使用求解器求解 ­

# Solve model. ­    

solver = cp_model.CpSolver() ­    

status = solver.Solve(model) 

6.打印结果 ­ 

# Finally print the solution found. ­        

print('Optimal Schedule Length: %i' % solver.ObjectiveValue()) ­        

print(output)

【版权声明】本文为华为云社区用户翻译文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容, 举报邮箱:cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。