# 結果の表示 for i inrange(N): print(f"Optimal value for x[{i}]:", model.x[i]()) print("Optimal objective value:", model.objective())
[実行結果]
Optimal value for x[0]: 0.0
Optimal value for x[1]: 0.0
Optimal value for x[2]: 0.0
Optimal value for x[3]: 0.0
Optimal value for x[4]: 10.0
Optimal objective value: 50.0
# 目的関数の定義 model.objective = Objective(expr=sum(coefficients[i] * model.x[i] for i inrange(N)), sense=maximize)
# 制約条件の定義 model.constraints = ConstraintList() for con in constraints: model.constraints.add(sum(con[i] * model.x[i] for i inrange(N)) <= con[-1])
# CBCソルバーを使用する場合 solver = SolverFactory('cbc', executable='/usr/bin/cbc') result = solver.solve(model)
# 結果の表示 print("CBC solver results:") for i inrange(N): print(f"Optimal value for x[{i}]:", model.x[i]()) print("Optimal objective value:", model.objective())
[実行結果]
CBC solver results:
Optimal value for x[0]: 0.0
Optimal value for x[1]: 0.0
Optimal value for x[2]: 0.0
Optimal value for x[3]: 0.0
Optimal value for x[4]: 10.0
Optimal objective value: 50.0
# 変数の定義 vars = pulp.LpVariable.dicts("Route", (warehouses, stores), lowBound=0, cat='Continuous')
# 目的関数の定義 model += pulp.lpSum([vars[w][s] * costs[w][s] for w in warehouses for s in stores]), "Total Cost"
# 制約条件の定義 for w in warehouses: model += pulp.lpSum([vars[w][s] for s in stores]) <= supply[w], f"Supply_{w}"
for s in stores: model += pulp.lpSum([vars[w][s] for w in warehouses]) >= demand[s], f"Demand_{s}"
# 問題を解く model.solve()
# 結果の表示 print(f"Status: {pulp.LpStatus[model.status]}") for w in warehouses: for s in stores: print(f"Route {w} to {s}: {pulp.value(vars[w][s])} units") print(f"Total Cost: {pulp.value(model.objective)}")
[実行結果]
Status: Optimal
Route A to X: 250.0 units
Route A to Y: 0.0 units
Route A to Z: 50.0 units
Route B to X: 0.0 units
Route B to Y: 350.0 units
Route B to Z: 50.0 units
Total Cost: 1250.0
# 各セルに1から9の値を割り当てる for row in rows: for col in cols: problem.addVariable((row, col), range(1, 10))
# 各行に対して全ての数が異なるように制約 for row in rows: problem.addConstraint(AllDifferentConstraint(), [(row, col) for col in cols])
# 各列に対して全ての数が異なるように制約 for col in cols: problem.addConstraint(AllDifferentConstraint(), [(row, col) for row in rows])
# 各3x3のボックスに対して全ての数が異なるように制約 for box_row inrange(3): for box_col inrange(3): cells = [(row, col) for row inrange(box_row*3+1, box_row*3+4) for col inrange(box_col*3+1, box_col*3+4)] problem.addConstraint(AllDifferentConstraint(), cells)
# 解を取得 solutions = problem.getSolutions()
# 解の表示(最初の解のみ) if solutions: solution = solutions[0] for row in rows: print([solution[(row, col)] for col in cols]) else: print("No solution found.")
machines_count = 3 all_tasks = {} machine_to_intervals = [[] for _ inrange(machines_count)] horizon = sum(task[1] for job in jobs_data for task in job)
machines_count = 3 all_tasks = {} machine_to_intervals = [[] for _ inrange(machines_count)] horizon = sum(task[1] for job in jobs_data for task in job)
Optimal Schedule Length: 11
Job 0:
Task 0 starts at 2 and ends at 5
Task 1 starts at 5 and ends at 7
Task 2 starts at 7 and ends at 9
Job 1:
Task 0 starts at 0 and ends at 2
Task 1 starts at 2 and ends at 3
Task 2 starts at 7 and ends at 11
Job 2:
Task 0 starts at 0 and ends at 4
Task 1 starts at 4 and ends at 7
# 変数の作成 x = solver.IntVar(0, 10, 'x') y = solver.IntVar(0, 10, 'y')
# 制約条件の追加 solver.Add(2 * x + 3 * y <= 12)
# 目的関数の設定 solver.Maximize(3 * x + 4 * y)
# 解を求める status = solver.Solve()
# 結果を表示 if status == pywraplp.Solver.OPTIMAL: print('Objective value =', solver.Objective().Value()) print('x =', x.solution_value()) print('y =', y.solution_value()) else: print('The problem does not have an optimal solution.')
if status == pywraplp.Solver.OPTIMAL: print('Objective value =', solver.Objective().Value()) print('x =', x.solution_value()) print('y =', y.solution_value()) else: print('The problem does not have an optimal solution.')
status が pywraplp.Solver.OPTIMAL であれば、最適解が見つかっています。
# 変数の作成 x = solver.NumVar(0, 1, 'x') y = solver.NumVar(0, 2, 'y')
# 制約条件の追加 solver.Add(x + y <= 2)
# 目的関数の設定 solver.Maximize(x + y)
# 解を求める status = solver.Solve()
# 結果を表示 if status == pywraplp.Solver.OPTIMAL: print('Objective value =', solver.Objective().Value()) print('x =', x.solution_value()) print('y =', y.solution_value()) else: print('The problem does not have an optimal solution.')
ここでは、GLOP(Google Linear Optimization Package)という線形最適化ソルバーを作成します。
CreateSolver('GLOP')は新しいソルバーオブジェクトを作成します。
ソルバーが作成できなかった場合、関数を終了します。
4. 変数の作成
1 2
x = solver.NumVar(0, 1, 'x') y = solver.NumVar(0, 2, 'y')
線形最適化問題の変数を作成します。ここでは、変数xとyを定義します。
xは$0$から$1$までの値を取ります。
yは$0$から$2$までの値を取ります。
5. 制約条件の追加
1
solver.Add(x + y <= 2)
変数に対する制約を追加します。ここでは、x + y <= 2という制約条件を設定しています。
これは、変数xとyの和が2以下でなければならないことを意味します。
6. 目的関数の設定
1
solver.Maximize(x + y)
最適化の目的を設定します。ここでは、x + yを最大化するように設定しています。
7. 解を求める
1
status = solver.Solve()
設定した制約条件と目的関数に基づいて、最適解を求めます。
このメソッドは、解が見つかったかどうかを示すステータスコードを返します。
8. 結果の表示
1 2 3 4 5 6
if status == pywraplp.Solver.OPTIMAL: print('Objective value =', solver.Objective().Value()) print('x =', x.solution_value()) print('y =', y.solution_value()) else: print('The problem does not have an optimal solution.')
最適解が見つかった場合、目的関数の値と変数xおよびyの値を表示します。
解が見つからなかった場合は、最適解が存在しないことを表示します。
9. 関数の呼び出し
1
linear_optimization_example()
定義した関数を呼び出し、線形最適化問題を実行します。
まとめ
このコードは、OR-Toolsを使用して簡単な線形最適化問題を解決する方法を示しています。
具体的には、2つの変数xとyを定義し、制約条件x + y <= 2のもとでx + yを最大化する問題を解いています。