IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 银行家算法的Python实现 -> 正文阅读

[数据结构与算法]银行家算法的Python实现

'''银行家算法
    Dijkstra在1965年提出的银行家算法是著名的死锁避免算法
    博客地址:https://www.cnblogs.com/wkfvawl/p/11929508.html
'''
import pandas as pd


class Bank:

    def __init__(self, **resources: int):
        '''
        @param: resources
            资源的数量
        '''
        self.resources = pd.DataFrame(resources, index=["total"])
        self.allocation = pd.DataFrame(
            [], index=self.resources.keys(), dtype=int)
        self.maxs = pd.DataFrame([], index=self.resources.keys(), dtype=int)

    def _avaliable(self, allocation):
        aval = self.resources - allocation.sum(axis=1)
        aval.index = ["avaliable"]
        return aval

    def _safe_check(self, allocation):
        if allocation.empty:
            return True

        aval = self._avaliable(allocation)
        need = self._need(allocation)

        for custom in allocation.columns:
            t = need[custom] <= aval
            if (t.all(axis=None)):
                temp = allocation.copy().drop(columns=[custom])
                if self._safe_check(temp):
                    return True

        return False

    def is_safe(self):
        '''是否安全
        '''
        return self._safe_check(self.allocation)

    def lend(self, custom, **need_resources: int):
        allocation = self.allocation.copy()

        for resource, number in need_resources.items():
            allocation[custom][resource] += number

        if self._safe_check(allocation):
            self.allocation = allocation
            print(custom, need_resources, "已分配")
        else:
            print(custom, need_resources, "不安全,拒绝分配")

    def _need(self, allocation):
        return self.maxs - allocation

    def add_custom(self, name, **max_resources: int):
        '''
        @param: name
            客户名称
        @param: max_resources
            申请资源的最大额度
        '''
        self.maxs = pd.concat([self.maxs, pd.DataFrame(
            {name: max_resources})], axis=1).fillna(0).astype(int)
        self.allocation[name] = 0

    def table(self):
        '''列出资源和进程表格信息'''
        print(pd.concat([self.maxs.T, self.allocation.T, self._need(self.allocation).T], axis=1, keys=[
              "max", "allocation", "need"]))
        print(pd.concat([self._avaliable(self.allocation), self.resources]))



def main():
    bank = Bank(R1=9, R2=3, R3=6)

    bank.add_custom("p1",  R1=3, R2=2, R3=2)
    bank.add_custom("p2",  R1=6, R2=1, R3=3)
    bank.add_custom("p3",  R1=3, R2=1, R3=4)
    bank.add_custom("p4",  R1=4, R2=2, R3=2)

    bank.lend("p1", R1=1)
    bank.lend("p2", R1=5, R2=1, R3=1)
    bank.lend("p3", R1=2, R2=1, R3=1)
    bank.lend("p4", R1=0, R2=0, R3=2)


    # 1. 此刻是否安全
    print(bank.is_safe())

    # 2. p2发出请求(1,0,1),是否安全
    bank.lend("p2", R1=1, R2=0, R3=1)

    # 3. p1发出请求(1,0,1),是否安全
    bank.lend("p1", R1=1, R2=0, R3=1)

    # 4. p3发出请求(0,0,1),是否安全
    bank.lend("p3", R1=0, R2=0, R3=1)



if __name__ == "__main__":
    main()


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:26:29  更:2022-03-11 22:30:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:33:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码