# 従業員ごとの変数(0または1のバイナリ変数) employees = [LpVariable(f"Employee_{i}", cat='Binary') for i inrange(num_employees)]
# 目的関数(最大化する対象:全体のプロジェクト効率) problem += lpSum([employees[i] * skills[i][j] for i inrange(num_employees) for j inrange(num_tasks)]), "Total_Efficiency"
# 制約条件 for j inrange(num_tasks): problem += lpSum([employees[i] * skills[i][j] for i inrange(num_employees)]) >= 1, f"Task_{j + 1}_Requirement"
problem += lpSum([employees[i] for i inrange(num_employees)]) == 3, "Total_Employees" # 最適化の実行 problem.solve()
# 結果の表示 print("Status:", LpProblem.status[problem.status]) print("Optimal Resource Allocation:") for i, employee inenumerate(employees): if employee.varValue == 1: print(f"Employee {i + 1} is assigned to the project.") print(f"Total Project Efficiency: {problem.objective.value()}")
# 制約条件 for j inrange(num_tasks): problem += lpSum([employees[i] * skills[i][j] for i inrange(num_employees)]) >= 1, f"Task_{j + 1}_Requirement"
各タスクに対する制約条件を設定しています。
各タスクには少なくとも1人の従業員がアサインされる必要があります。
1
problem += lpSum([employees[i] for i inrange(num_employees)]) == 3, "Total_Employees"
従業員の総数に関する制約条件を設定しています。
この場合、総従業員数は3人となります。
1 2
# 最適化の実行 problem.solve()
PuLPを使用して最適化を実行しています。
1 2 3 4 5 6 7 8 9 10
# 結果の表示 print("Status:", LpProblem.status[problem.status]) print("Optimal Resource Allocation:") for i, employee inenumerate(employees): if employee.varValue == 1: print(f"Employee {i + 1} is assigned to the project.") print(f"Total Project Efficiency: {problem.objective.value()}")
# 最適化の実行 solve_resource_allocation_problem()
最適化の結果や最適解を表示しています。
それぞれの従業員がプロジェクトにアサインされ、総合プロジェクト効率が表示されます。
結果解説
[実行結果]
Optimal Resource Allocation:
Employee 1 is assigned to the project.
Employee 3 is assigned to the project.
Employee 4 is assigned to the project.
Total Project Efficiency: 23.0
from ortools.constraint_solver import routing_enums_pb2 from ortools.constraint_solver import pywrapcp import matplotlib.pyplot as plt import networkx as nx
defplot_solution(manager, routing, solution): index = routing.Start(0) plan_output = 'Route for vehicle 0:\n' route_distance = 0 whilenot routing.IsEnd(index): plan_output += f'{manager.IndexToNode(index)} -> ' previous_index = index index = solution.Value(routing.NextVar(index)) route_distance += routing.GetArcCostForVehicle(previous_index, index, 0) plan_output += f'{manager.IndexToNode(index)}\n' route_distance += routing.GetArcCostForVehicle(previous_index, index, 0) print(plan_output) print(f'Distance of the route: {route_distance} units')
# グラフの描画 G = nx.Graph() for i inrange(len(locations)): G.add_node(i, pos=locations[i]) for i inrange(manager.GetNumberOfVehicles()): index = routing.Start(i) whilenot routing.IsEnd(index): next_index = solution.Value(routing.NextVar(index)) G.add_edge(manager.IndexToNode(index), manager.IndexToNode(next_index)) index = next_index
このコードは、Google OR-Toolsを使用してVehicle Routing Problem (VRP) を解くサンプルです。
以下に、コードの各部分の詳細な説明を提供します。
1. モジュールのインポート:
1 2 3 4
from ortools.constraint_solver import routing_enums_pb2 from ortools.constraint_solver import pywrapcp import matplotlib.pyplot as plt import networkx as nx