クラウドコンピューティング最適化問題 PuLP

クラウドコンピューティング最適化問題

クラウドコンピューティングにおけるサーバー配置問題を例にして、PuLPを用いて解いていきます。

サーバー配置問題とは、複数のクラウドサービスを提供するために必要なサーバーを、最小限のコストで配置する問題です。

ここでは、各サーバーのスペックと利用料金が既知であると仮定します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from pulp import *

# 問題設定
servers = ["Server1", "Server2", "Server3"]
spec = {"Server1": {"CPU": 4, "Memory": 16, "Storage": 500},
"Server2": {"CPU": 2, "Memory": 8, "Storage": 250},
"Server3": {"CPU": 8, "Memory": 32, "Storage": 1000}}
costs = {"Server1": 100, "Server2": 50, "Server3": 200}
demands = {"CPU": 10, "Memory": 32, "Storage": 800}

# モデル定義
prob = LpProblem("Server Allocation Problem", LpMinimize)

# 変数定義
servers_vars = LpVariable.dicts("Server", servers, lowBound=0, upBound=None, cat="Integer")

# 目的関数
prob += lpSum([costs[s] * servers_vars[s] for s in servers])

# 制約条件
for r in spec["Server1"].keys():
prob += lpSum([spec[s][r] * servers_vars[s] for s in servers]) >= demands[r]

# 解法
prob.solve()

# 結果出力
print("Total cost: {}".format(value(prob.objective)))
for s in servers:
print("{}: {}".format(s, value(servers_vars[s])))

このコードでは、各サーバーのスペックをspec、利用料金をcosts、要求スペックをdemandsとして定義し、PuLPを用いてモデルを定義しています。

変数として各サーバーの割り当てをservers_varsと定義し、目的関数と制約条件を設定した後にprob.solve()を実行することで最適解を求め、結果を出力しています。

[実行結果]

Total cost: 250.0

Server1: 0.0

Server2: 1.0

Server3: 1.0

この結果から、サーバー2サーバー3それぞれ1台使用することで、最小のコストで要求スペックを満たすことができることがわかります。

また、この最適解においてかかるコストは250となります。