python 关于银行家算法(banker)

请根据提供的python代码完善银行家算法,本代码现在能够根据提供MAX举证和allocation矩阵计算得到need矩阵,现在需要的功能如果系统处于安全状态,则打印安全序列,不行的话则打印该系统是不安全的状态。请不要直接从网上粘贴源代码来使用,会进行代码查重,请使用自己的方法去完成。希望能够添加注释。不使用numpy

img


p指的是进程的数量,r指的是资源的数量,ar指的是每个资源的可用资源数量
使用我图片上数列
安全序列的答案应该是1,3,4,0,2 或者1,3,4,2,0

基于Monster 组和GPT的调写:
以下是基于提供的银行家算法代码的完整实现,包括计算安全状态和打印安全序列等功能:

p = 5  # 进程数量
r = 3  # 资源种类数量
ar = [10, 5, 7]  # 各资源总数

# 最大需求矩阵
max_matrix = [
    [7, 5, 3],
    [3, 2, 2],
    [9, 0, 2],
    [2, 2, 2],
    [4, 3, 3]
]

# 分配矩阵
alloc_matrix = [
    [0, 1, 0],
    [2, 0, 0],
    [3, 0, 2],
    [2, 1, 1],
    [0, 0, 2]
]

# 需求矩阵
need_matrix = []
for i in range(p):
    need_matrix.append([0] * r)
    for j in range(r):
        need_matrix[i][j] = max_matrix[i][j] - alloc_matrix[i][j]

# 可用资源向量
avail_vector = []
for j in range(r):
    avail_vector.append(ar[j] - sum(alloc_matrix[i][j] for i in range(p)))

# 安全检查函数
def is_safe(need_matrix, alloc_matrix, avail_vector, safe_seq):
    # 初始化工作
    work = avail_vector.copy()
    finish = [False] * p

    # 找到一个安全序列
    while True:
        # 找到可以满足当前需求的进程
        found = False
        for i in range(p):
            if not finish[i] and all(need_matrix[i][j] <= work[j] for j in range(r)):
                found = True
                break

        # 如果找不到这样的进程,则退出循环
        if not found:
            break

        # 满足进程需求并释放资源
        for j in range(r):
            work[j] += alloc_matrix[i][j]
        finish[i] = True
        safe_seq.append(i)

    # 如果所有进程都在安全序列中,则系统安全
    if all(finish):
        return True
    else:
        return False

# 执行安全检查并输出结果
safe_seq = []
if is_safe(need_matrix, alloc_matrix, avail_vector, safe_seq):
    print("安全序列:", end="")
    for i in safe_seq:
        print(i, end=" ")
else:
    print("不安全的状态")

代码计算出了需要矩阵 need_matrix,然后使用银行家算法的流程来检查系统是否处于安全状态。在银行家算法中,首先将可用资源向量 work 初始化为可用资源的数量,所有进程的完成状态 finish 初始化为 False,安全序列 safe_sequence 初始化为空列表。然后不断循环,直到找不到满足条件的进程为止。在每次循环中,遍历所有未完成的进程,如果进程 i 的需求小于等于可用资源,则将其加入安全序列,并将其所需的资源释放出来。如果找不到满足条件的进程,则退出循环。最后检查所有进程是否都能够完成,如果是,则打印安全序列;否则,打印系统处于不安全状态。

https://blog.csdn.net/IYXUAN/article/details/125067942

引用自chatgpt. 你可以自行修改,以满足您的要求。


# 银行家算法
def Banker_algorithm(available, max, allocation):
    # available 可用资源数组
    # max 每个进程最大需求资源数组
    # allocation 已分配资源数组
    # 返回:True:安全序列  False:不安全
    Need = []  # 每个进程还需要资源
    Work = available  # 工作数组
    Finish = [False] * len(allocation)  # 完成情况
    Safe_sequence = []  # 安全序列
    # 计算每个进程还需要的资源
    for i in range(len(allocation)):
        Need.append([max[i][j] - allocation[i][j] for j in range(len(allocation[0]))])
    # 找到一个安全序列
    count = 0
    while count < len(allocation):
        # 找到一个进程,其Need<=Work
        find = False
        for i in range(len(allocation)):
            if not Finish[i] and all([Need[i][j] <= Work[j] for j in range(len(Work))]):
                # 将进程加入安全序列
                Safe_sequence.append(i)
                Finish[i] = True
                # 更新工作数组
                Work = [Work[j] + allocation[i][j] for j in range(len(Work))]
                find = True
                break
        # 无法找到,返回False
        if not find:
            return False
        count += 1
    # 找到了安全序列,返回True
    return True


# 实例
available = [3, 3, 2]  # 可用资源
max = [[7, 5, 3], [3, 2, 2], [9, 0, 2], [2, 2, 2], [4, 3, 3]]  # 每个进程最大需求资源
allocation = [[0, 1, 0], [2, 0, 0], [3, 0, 2], [2, 1, 1], [0, 0, 2]]  # 已分配资源

if Banker_algorithm(available, max, allocation):
    print("安全")
else:
    print("不安全")

https://www.baidu.com/link?url=JbtvKGrtc7mE44VQXVYdn92gYJEgGo0bepCcISRwXl8MHvKYbhzF9HRVZJCGQ7F8gWj42UjQ8uVC4nRTUjOX5_&wd=&eqid=c6e4ab76003713930000000263edd48d


p = 5  # 进程数
r = 3  # 资源种类数
ar = [10, 5, 7]  # 每个资源的可用资源数量

# 最大需求矩阵,需要根据实际情况修改
max_matrix = [
    [7, 5, 3],
    [2, 2, 3],
    [9, 0, 2],
    [2, 2, 0],
    [4, 3, 3]
]

# 分配矩阵,需要根据实际情况修改
alloc_matrix = [
    [0, 1, 0],
    [2, 0, 0],
    [3, 0, 2],
    [2, 1, 1],
    [0, 0, 2]
]

# 计算出需求矩阵
need_matrix = []
for i in range(p):
    need_matrix.append([0] * r)
    for j in range(r):
        need_matrix[i][j] = max_matrix[i][j] - alloc_matrix[i][j]

# 初始时所有进程都没有执行
finish = [False] * p

# 复制可用资源数量列表
work = ar[:]

# 安全序列列表
safe_sequence = []

while True:
    # 遍历所有进程,找到能够执行的进程
    found = False
    for i in range(p):
        if not finish[i] and all(need_matrix[i][j] <= work[j] for j in range(r)):
            # 进程 i 可以执行,释放其占用的资源
            for j in range(r):
                work[j] += alloc_matrix[i][j]
            # 将进程 i 加入安全序列,并标记为已执行
            safe_sequence.append(i)
            finish[i] = True
            found = True
            break
    # 如果找不到任何进程能够执行,则退出循环
    if not found:
        break

# 如果所有进程都已执行,则打印安全序列
if all(finish):
    print("Safe sequence:", safe_sequence)
else:
    print("The system is in an unsafe state.")

代码中首先根据提供的MAX矩阵和Allocation矩阵计算出Need矩阵,然后按照银行家算法的流程,遍历所有进程,找到能够执行的进程,并释放其占用的资源。如果所有进程都已执行,则打印安全序列;否则打印该系统是不安全的状态。注释已经添加在代码中,可以帮助理解。

根据提供的Python代码,可以使用银行家算法来判断系统是否处于安全状态并打印出安全序列,代码如下:

# 定义银行家算法函数
def banker_algorithm(p, r, allocation, max_claim, available):
    # 计算需要的矩阵
    need = []
    for i in range(p):
        need.append([max_claim[i][j] - allocation[i][j] for j in range(r)])

    # 初始化完成和安全标志
    finish = [0] * p
    safe_sequence = []

    # 复制可用资源
    work = available[:]

    # 找到一个可分配的进程
    while 0 in finish:
        found = False
        for i in range(p):
            if not finish[i] and all([need[i][j] <= work[j] for j in range(r)]):
                # 如果进程可以被满足,则将它的资源释放
                for j in range(r):
                    work[j] += allocation[i][j]
                # 标记进程已完成
                finish[i] = 1
                # 将该进程添加到安全序列中
                safe_sequence.append(i)
                found = True

        # 如果没有找到一个可分配的进程,则退出循环
        if not found:
            break

    # 如果所有进程都已完成,则表示系统是安全的,返回安全序列
    if all(finish):
        print("系统处于安全状态,安全序列为:", safe_sequence)
    # 否则,表示系统不安全
    else:
        print("系统处于不安全状态")

在上述代码中,p代表进程数量,r代表资源数量,allocation代表分配矩阵,max_claim代表最大需求矩阵,available代表可用资源数量列表。

首先,根据提供的allocation和max_claim计算得到need矩阵,然后初始化完成标志和安全序列为空。接着,复制可用资源到work列表中,然后找到一个可分配的进程,如果找到,则将它的资源释放,标记该进程已完成,并将其添加到安全序列中。如果所有进程都已完成,则表示系统是安全的,返回安全序列;否则,表示系统不安全,输出相关提示信息。

最后,可以调用banker_algorithm函数来测试该算法是否可以正确地输出安全序列。对于给定的数据,算法的输出是1,3,4,0,2或1,3,4,2,0,因为有多个安全序列。

银行家算法是一种用于避免死锁的算法。它通过动态地分配资源,避免系统陷入死锁状态。安全状态是指系统中有足够的资源可以满足所有进程的最大需求,而不会进入死锁状态。如果系统处于安全状态,那么就可以分配资源并允许进程执行。否则,分配资源就会导致死锁。

下面是代码实现:

# 定义银行家算法的主函数
def banker_algorithm(p, r, ar, max_matrix, alloc_matrix, need_matrix):
    work = ar.copy()
    finish = [False] * p
    result = []

    while False in finish:
        is_safe = False
        for i in range(p):
            if not finish[i] and all(j >= 0 for j in [x - y for x, y in zip(need_matrix[i], work)]):
                finish[i] = True
                work = [sum(x) for x in zip(work, alloc_matrix[i])]
                result.append(i)
                is_safe = True
        if not is_safe:
            return False

    return result

# 计算需要矩阵
def calculate_need_matrix(max_matrix, alloc_matrix):
    need_matrix = []
    for i in range(len(max_matrix)):
        need_matrix.append([0] * len(max_matrix[0]))
        for j in range(len(max_matrix[0])):
            need_matrix[i][j] = max_matrix[i][j] - alloc_matrix[i][j]
    return need_matrix

# 使用提供的数据进行测试
p = 5  # 进程数量
r = 3  # 资源种类数量
ar = [10, 5, 7]  # 各资源总数

# 最大需求矩阵
max_matrix = [
    [7, 5, 3],
    [3, 2, 2],
    [9, 0, 2],
    [2, 2, 2],
    [4, 3, 3]
]

# 分配矩阵
alloc_matrix = [
    [0, 1, 0],
    [2, 0, 0],
    [3, 0, 2],
    [2, 1, 1],
    [0, 0, 2]
]

# 计算需要矩阵
need_matrix = calculate_need_matrix(max_matrix, alloc_matrix)

# 调用银行家算法进行计算
result = banker_algorithm(p, r, ar, max_matrix, alloc_matrix, need_matrix)

# 根据结果输出安全序列或者不安全状态
if result:
    print("系统处于安全状态,安全序列为:", result)
else:
    print("系统处于不安全状态")

在这段代码中,我们首先定义了一个banker_algorithm()函数,它接受银行家算法所需的输入,即进程数量、资源种类数量、各资源总数、最大需求矩阵、分配矩阵和需要矩阵。然后,我们定义了calculate_need_matrix()函数,用于计算需要矩。
如果对您有帮助,请给与采纳,谢谢。


def banker_algorithm(available, allocation, need, p, r):
    # 初始值
    finish = [0] * p
    work = available.copy()
    safe_sequence = []

    # 检查每个进程是否满足条件
    for i in range(p):
        if finish[i] == 0:
            # 判断该进程是否可以执行
            if all(j >= 0 for j in need[i]):
                if all(j <= work[idx] for idx, j in enumerate(need[i])):
                    work = [work[idx] + allocation[i][idx] for idx in range(r)]
                    finish[i] = 1
                    safe_sequence.append(i)

    # 判断是否存在安全序列
    if all(finish):
        print("System is in safe state")
        print("Safe sequence: ", end='')
        for i in safe_sequence:
            print(i, end=',')
        print()
    else:
        print("System is in unsafe state")

该回答引用ChatGPT
可以使用贪心算法来实现银行家算法,具体步骤如下:

  1. 首先,根据MAX矩阵和allocation矩阵计算need矩阵;
  2. 然后,检查系统是否处于安全状态,即检查是否存在安全序列;
  3. 如果存在安全序列,则打印出安全序列;
  4. 如果不存在安全序列,则打印出系统是不安全的状态。

加油吧。。看不太懂。。