クラウドコンピューティング最適化問題
クラウドコンピューティングにおけるサーバー配置問題を例にして、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となります。