Pythonでアルゴリズムを書く--------欲張りアルゴリズム

今日、大学院生から質問がありました。質問は次のとおりです。
スーパーマーケットにチェックアウトしたい顧客がm人いて、各顧客がチェックアウトする時間はTiです(iの値は1からmの範囲です)。 )。スーパーマーケットにはn個のチェックアウトアウトレットがありますが、すべての顧客はどのようにアウトレットを選択しますか?すべての顧客のチェックアウトは、最短で完了し、コードで実現できます。
実際、この問題を解決するために欲張りアルゴリズムが使用されていますが、欲張りアルゴリズムとは何ですか?この問題を解決するために欲張りアルゴリズムを使用する方法は?一つずつやってみましょう。

1.欲張りアルゴリズムの概要

欲張りアルゴリズムは、いくつかの最適解問題のためのより単純で高速な設計手法です。欲張りアルゴリズムは、多くの場合、現在の状況に基づいて段階的に特徴付けられ、考えられるすべての全体的な状況を考慮せずに、最適化対策に基づいて最良の選択を行い、最適なソリューションを見つけるためにすべての可能性を尽くす必要をなくします。時間のかかる。欲張りアルゴリズムは、トップダウンの反復法を採用して、連続した欲張り選択を行います。欲張り選択が行われるたびに、問題はより小さなサブ問題に縮小されます。欲張り選択の各ステップを通じて、問題を取得できます。最適なソリューション。各ステップで局所最適解を確実に取得できるようにする必要がありますが、結果として得られる大域解が必ずしも最適であるとは限らないため、欲張りアルゴリズムは後戻りしないでください。

2つ、ソリューションのアイデア

1.クラスメートの家庭教師からのアイデア

最初のN人に支払いをさせてから、顧客は引き続き最短の支払い時間を見つけ、次に最初のN人の顧客に最長から最短を見つけます。

2.問題の内訳

レジは1つしかないので、すぐに対応できます。最適な順序は、時間の経過とともに小さいものから大きいものへと進むことです。
つまり、最適解はA = {t(1)、t(2)、...です。t(n)}(ここで、t(i)はi番目のユーザーが必要とするサービス時間です)。各ユーザーの待機時間は次のとおりです
。T(1)= t(1); T(2)= t(1 )+ t(2); ... T(n):t(1)+ t(2)+ t(3)+ ... t(n);
次に、合計待機時間、つまり最適値は:
TA = n * t(1)+(n-1)* t(2)+…+(n + 1-j)t(i)+… 2t(n-1)+ t(n);

3、アルゴリズムコードの実装

上記の分解により、アルゴリズムコードの実装は非常に簡単になります。`

def greedy(customer_list, n):
    # customer_time_list为第j个队列上的某一个顾客的等待时间
    # sum_customer_time_list是求和数组
    # sum_customer_time_list[j]的值为第j个队列上所有顾客的等待时间
    # min_sum_customer_time为结账最小时间
    # 初始化一个大小为n的0列表
    customer_time_list = []
    sum_customer_time_list = []
    num = 0
    while num < n:
        customer_time_list.append(0)
        sum_customer_time_list.append(0)
        num += 1
    min_sum_customer_time = 0
    # 顾客的数量
    m = len(customer_list)
    customer_list.sort()  #列表升序排序
    i = 0
    j = 0
    while i < m:
        customer_time_list[j] += customer_list[i]
        sum_customer_time_list[j] += customer_time_list[j]
        i += 1
        j += 1
        # 如果j到了最后一个结账出口,重新归零
        if j == n:
            j = 0
    # 汇总最小总时间
    k = 0
    while k < n:
        min_sum_customer_time += sum_customer_time_list[k]
        k += 1
    return min_sum_customer_time

4、アルゴリズムテストの結果

顧客のキューイングシーケンスを準備し、最小時間を取得するためにレジ係の数を指定します

customer_list = [6, 5, 3, 4, 2, 1]
print(greedy(customer_list, 2))

出力結果

5、アルゴリズムの複雑さの分析

このプログラムは主に、各顧客が必要とするサービス時間のソートと欲張りアルゴリズム、つまり平均サービス時間の計算に費やされます。その中で、欲張りアルゴリズムの部分には、時間計算量に影響を与える1つのサイクルしかなく、その時間計算量はO(n)です。一方、ソートアルゴリズムの時間計算量はO(nlogn)です。したがって、一般に、アルゴリズムの時間計算量はO(nlogn)です。

おすすめ

転載: blog.csdn.net/zjlwdqca/article/details/107130193