Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで指定されたサーバーコアですべてのタスクを実行できるか判定する方法

2つのリスト corestasks があるとします。cores[i] は i 番目のサーバーで利用可能なコア数を表し、tasks[i] はそのタスクの実行に必要なコア数を表します。各タスクは必ず1台のサーバーでのみ実行されなければならず、1台のサーバーが複数のタスクを担当することも許容されます。ここでの目的は、与えられたコア数ですべてのタスクを実行できるかどうかを判定することです。

たとえば、入力が cores = [10, 7]tasks = [7, 3, 2, 2, 1] の場合、出力は True になります。これは、tasks[0](7)と tasks[1](3)をコア数10の最初のサーバーに割り当て、残りのタスク(2、2、1)をコア数7の2番目のサーバーに割り当てることができるためです。

解決アプローチ:バックトラッキング

この問題は「バックトラッキング(探索の巻き戻し)」によって効率的に解けます。基本的な考え方は、各タスクを順番に取り出し、割り当て可能なすべてのサーバーを順に試すというものです。ある割り当てで先に進めなくなった場合は、直前の割り当てを取り消して別のサーバーを試します。

具体的な手順は以下の通りです。

  1. 関数 solve() を定義します。引数として corestasks を受け取ります。
  2. tasks が空になった場合は True を返します(すべてのタスクの割り当てに成功したことを意味します)。
  3. i を 0 から cores のサイズ - 1 まで繰り返します。
    • cores[i] >= tasks[0] であれば、cores[i] から tasks[0] を差し引きます。
    • solve(cores, 残りのタスクリスト)True を返せば、そのまま True を返します。
    • 失敗した場合は cores[i]tasks[0] を戻し(バックトラック)、次のサーバーを試します。
  4. どのサーバーにも割り当てられなかった場合は False を返します。

実装例

以下のPythonコードで実際の動作を確認できます。

def solve(cores, tasks):
    if not tasks:
        return True

    for i in range(len(cores)):
        if cores[i] >= tasks[0]:
            cores[i] -= tasks[0]
            if solve(cores, tasks[1:]):
                return True
            cores[i] += tasks[0]
    return False

cores = [10, 7]
tasks = [7, 3, 2, 2, 1]
print(solve(cores, tasks))

入力

[10, 7], [7, 3, 2, 2, 1]

出力

True

計算量について

このアルゴリズムの最悪計算量は、タスク数を n、サーバー数を m とすると O(m^n) になります。各タスクに対して最大 m 通りのサーバー選択肢があるためです。ただし、コア数の制約によって多くの分岐が早期に枝刈りされるため、実際の入力では高速に動作することが多いです。タスクを降順にソートしてから探索を開始すると、大きなタスクが先に処理されて枝刈りが早まり、さらに効率が向上します。

  1. Pythonで与えられたグラフが2部グラフかどうかを判定するプログラム

    2部グラフとは無向グラフが与えられたとき、そのグラフが2部グラフ(バイパータイトグラフ)であるかどうかを判定する方法を解説します。2部グラフとは、グラフのすべての頂点を2つの集合 A と B に分割でき、グラフ内のすべての辺 {u, v} が必ず一方の端点 u が集合 A、もう一方の端点 v が集合 B に属するようなグラフのことです。つまり、同じ集合内の頂点同士を結ぶ辺(A-A や B-B)が一切存在しないグラフです。例として、次のようなグラフを考えてみましょう。この場合、頂点 [0, 4] を集合 A に、[1, 2, 3] を集合 B に分類できます。すべての辺は A から B、または

  2. 指定された文字列がキーワードであるかどうかを確認するPythonプログラム

    この記事では、指定された文字列がPythonのキーワード(予約語)であるかどうかを判定する方法について解説します。問題の概要与えられた文字列が、Pythonにおけるキーワードであるかどうかを確認する必要があります。キーワードとは、言語によって特別な用途のために予約されている単語であり、変数名や関数名などの識別子として使用することはできません。例えば「if」「for」「while」「def」などはすべてキーワードです。これらの名前を変数に使おうとすると、構文エラーが発生します。解決策:keywordモジュールの活用Pythonには標準ライブラリとしてkeywordモジュールが用意されており、これ