Google Optimization Tools实现加工车间任务规划【Python版】

上一篇介绍了《使用.NET Core与Google Optimization Tools实现加工车间任务规划》,这次将Google官方文档python实现的版本的完整源码献出来,以满足喜爱python的朋友。

from __future__ import print_function

# Import Python wrapper for or-tools constraint solver.
from ortools.constraint_solver import pywrapcp

def main():
  # Create the solver.
  solver = pywrapcp.Solver('jobshop')

  machines_count = 3
  jobs_count = 3
  all_machines = range(0, machines_count)
  all_jobs = range(0, jobs_count)
  # Define data.
  machines = [[0, 1, 2],
              [0, 2, 1],
              [1, 2]]

  processing_times = [[3, 2, 2],
                      [2, 1, 4],
                      [4, 3]]
  # Computes horizon.
  horizon = 0
  for i in all_jobs:
    horizon += sum(processing_times[i])
  # Creates jobs.
  all_tasks = {}
  for i in all_jobs:
    for j in range(0, len(machines[i])):
      all_tasks[(i, j)] = solver.FixedDurationIntervalVar(0,
                                                          horizon,
                                                          processing_times[i][j],
                                                          False,
                                                          'Job_%i_%i' % (i, j))

  # Creates sequence variables and add disjunctive constraints.
  all_sequences = []
  all_machines_jobs = []
  for i in all_machines:

    machines_jobs = []
    for j in all_jobs:
      for k in range(0, len(machines[j])):
        if machines[j][k] == i:
          machines_jobs.append(all_tasks[(j, k)])
    disj = solver.DisjunctiveConstraint(machines_jobs, 'machine %i' % i)
    all_sequences.append(disj.SequenceVar())
    solver.Add(disj)

  # Add conjunctive contraints.
  for i in all_jobs:
    for j in range(0, len(machines[i]) - 1):
      solver.Add(all_tasks[(i, j + 1)].StartsAfterEnd(all_tasks[(i, j)]))

  # Set the objective.
  obj_var = solver.Max([all_tasks[(i, len(machines[i])-1)].EndExpr()
                        for i in all_jobs])
  objective_monitor = solver.Minimize(obj_var, 1)
  # Create search phases.
  sequence_phase = solver.Phase([all_sequences[i] for i in all_machines],
                                solver.SEQUENCE_DEFAULT)
  vars_phase = solver.Phase([obj_var],
                            solver.CHOOSE_FIRST_UNBOUND,
                            solver.ASSIGN_MIN_VALUE)
  main_phase = solver.Compose([sequence_phase, vars_phase])
  # Create the solution collector.
  collector = solver.LastSolutionCollector()

  # Add the interesting variables to the SolutionCollector.
  collector.Add(all_sequences)
  collector.AddObjective(obj_var)

  for i in all_machines:
    sequence = all_sequences[i];
    sequence_count = sequence.Size();
    for j in range(0, sequence_count):
      t = sequence.Interval(j)
      collector.Add(t.StartExpr().Var())
      collector.Add(t.EndExpr().Var())
  # Solve the problem.
  disp_col_width = 10
  if solver.Solve(main_phase, [objective_monitor, collector]):
    print("\nOptimal Schedule Length:", collector.ObjectiveValue(0), "\n")
    sol_line = ""
    sol_line_tasks = ""
    print("Optimal Schedule", "\n")

    for i in all_machines:
      seq = all_sequences[i]
      sol_line += "Machine " + str(i) + ": "
      sol_line_tasks += "Machine " + str(i) + ": "
      sequence = collector.ForwardSequence(0, seq)
      seq_size = len(sequence)

      for j in range(0, seq_size):
        t = seq.Interval(sequence[j]);
         # Add spaces to output to align columns.
        sol_line_tasks +=  t.Name() + " " * (disp_col_width - len(t.Name()))

      for j in range(0, seq_size):
        t = seq.Interval(sequence[j]);
        sol_tmp = "[" + str(collector.Value(0, t.StartExpr().Var())) + ","
        sol_tmp += str(collector.Value(0, t.EndExpr().Var())) + "] "
        # Add spaces to output to align columns.
        sol_line += sol_tmp + " " * (disp_col_width - len(sol_tmp))

      sol_line += "\n"
      sol_line_tasks += "\n"

    print(sol_line_tasks)
    print("Time Intervals for Tasks\n")
    print(sol_line)

if __name__ == '__main__':
  main()

 

转载于:https://www.cnblogs.com/BeanHsiang/p/9038796.html

import data LOT = data.LOT Daily_monitor_lot = data.Daily_monitor_lot Operation = data.Operation Machine_of_operation = data.Machine_of_operation Last_Operation_Machine_inhibit_due_time = data.Last_Operation_Machine_inhibit_due_time Operation_Machine_K = data.Operation_Machine_K Lot_wafer_QTY = data.Lot_wafer_QTY Operation_Machine_Capability = data.Operation_Machine_Capability Lot_release_time = data.Lot_release_time Machine_release_time = data.Machine_release_time Operation_Machine_Lot_transfer_time = data.Operation_Machine_Lot_transfer_time Lot_release_Remain_QT = data.Lot_release_Remain_QT Lot_release_RQT_w = data.Lot_release_RQT_w Loop_QTime = data.Loop_QTime Loop_qt = data.Loop_qt Last_Operation_Machine_SD_PM_Start_time = data.Last_Operation_Machine_SD_PM_Start_time Last_Operation_Machine_SD_PM_End_time = data.Last_Operation_Machine_SD_PM_End_time N = 1e6 # 无限大正数 # lot的最后一道工序映射表 last_Operation = {l: Operation[l][-1] for l in LOT} print('last_Operation=', last_Operation) # 最后一道工序对应机台映射表(最后一步工序包含的machineList) last_Operation_Machine = {op: list(Machine_of_operation[op].keys())for op in set(last_Operation.values())} print('last_Operation_Machine=', last_Operation_Machine) # ================== 模型构建 ================== solver = pywraplp.Solver.CreateSolver('SCIP') # 决策变量(1): Lot l 的第o道工序是否在machine m上加工,0-1变量 from collections import defaultdict x_lom = defaultdict(dict) # x_lom: 1如果lot l的工序o在机器m上加工 for l in LOT: if l not in Operation: continue for o in Operation[l]: machines = Machine_of_operation.get(o, []) for m in machines: if Operation_Machine_K.get((o, m), 0) == 1 : key = (l, o, m) if key not in x_lom: x_lom[key] = solver.BoolVar(f'x_{l}_{o}_{m}') #print(f'x_{l}_{o}_{m}=', x_lom.values()) # 决策变量(2): Lot l 在第o step的start time s_lom = defaultdict(dict) # x_lom: 1如果lot l的工序o在机器m上加工 for l in LOT: if l not in Operation: continue for o in Operation[l]: machines = Machine_of_operation.get(o, []) for m in machines: key = (l, o, m) if key not in s_lom: s_lom[key] = solver.NumVar(0, solver.infinity(), f's_{l}_{o}_{m}') 建立一个简单的ortools求解器求解的柔性车间调度问题
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值