云计算任务调度仿真02

前面已经分享过一个仿真项目,但是基于policy gradient方法实现的,考虑到许多人从零到一实现DQN方法有点难度,所以这次分享一个基于DQN实现的仿真项目,非常简单。
在这里插入图片描述
这里之所以简单主要得益于它是用pytorch实现的,而pytorch各个版本之间差异不是非常大,可以互用。

这里没有之前那么复杂的建模,首先是任务类

class Task(object):
    # 任务类
    def __init__(self, jobID, index, CPU, RAM, disk, runtime, status):
        import time
        self.parent = []
        self.child = []
        self.jobID = jobID
        self.index = index
        self.CPU = CPU
        self.RAM = RAM
        self.disk = disk
        self.status = status  # -1: rejected, 0: finished, 1: ready, 2: running
        self.runtime = runtime
        self.ddl = time.time() + self.runtime * 5
        self.endtime = 0

然后构建DAG,因为云计算中的任务大多是具有关联性的,是有向无环图

class DAG(object):
    def __init__(self, fname, num_task):

        self.fname = fname
        # 任务数量
        self.num_task = num_task
        self.job = []
        self.task = []

    def readfile(self):
        # 读取任务数据
        num_task = 0
        with open(self.fname, 'r') as f:
            task = []
            for line in f:
                if line[0] == 'J':
                    if len(task) != 0:
                        self.job.append(task)
                        task = []
                else:
                    info = list(line.split(','))
                    # 任务的信息,jobid,index就是任务的标识,cpu,内存,硬盘,
                    # 外加一个状态jobID, index, CPU, RAM, disk, runtime, status)
                    task.append \
                        (Task(info[5], info[6], float(info[3]), float(info[4]), float(info[8]), float(info[2]), 1))
                    num_task += 1
                if num_task == self.num_task:
                    break
            if len(task) != 0:
                self.job.append(task)

    def checkRing(self, parent, child):
        # 检查无环
        if parent.index == child.index:
            return True
        if len(child.child) == 0:
            return False
        for c in child.child:
            if self.checkRing(parent, c):
                return True
        return False

    def buildDAG(self):
        # 构建有向无环图
        import random
        for job in self.job:
            for task in job:
                i = random.randint(-len(job), len(job) - 1)
                if i < 0:
                    continue
                parent = job[i]
                if self.checkRing(parent, task) == False:
                    task.parent.append(parent)
                    parent.child.append(task)
……
……

环境类,定义云计算资源,以及调度过程中状态的转移,训练过程等等

class environment(object):

    def __init__(self, scale, fname, num_task, num_server):

        self.scale = scale
        self.fname = fname
        self.task = []
        self.dag = DAG(self.fname, num_task)  # 根据task数量构建dag
        # 设置每个服务器上虚拟机的数量
        self.VMNum = 5
        self.rej = 0
        # 任务数量和服务器数量是通过参数传递的
        self.num_task = num_task
        self.severNum = num_server
        # 而集群数量是通过计算出来的
        if num_server <= 50:
            self.farmNum = 1
        else:
            if int(self.severNum / 50) * 50 < num_server:
                self.farmNum = int(self.severNum / 50) + 1
            else:
                self.farmNum = int(self.severNum / 50)

        self.remainFarm = []
        self.FarmResources = []
        self.severs = [[1, 1] for _ in range(self.severNum)]
        self.VMtask = []
        self.totalcost = 0
        #self.init_severs(num_server)

        self.losses_stage1 = []
        self.losses_stage2 = []

        print("Total Number of tasks: {0}".format(num_task))

    def init_severs(self, severNum):
        # 服务器,host,每个host上又可以虚拟出一定的虚拟机,然后虚拟机处理任务
        VM = [[[1.0 / self.VMNum, 1.0 / self.VMNum] for _ in range(self.VMNum)] for _ in range(severNum)]
        self.VMtask.append([[[] for _ in range(self.VMNum)] for _ in range(severNum)])
        return VM
……
……

构建DQN的智能体,有Q值的计算和更新,才是基于值的强化学习方法

class Agent():
    def __init__(self, input_dims, n_actions, lr, gamma=0.99,
                 epsilon=1.0, eps_dec=1e-5, eps_min=0.01):
        self.lr = lr
        self.input_dims = input_dims
        self.n_actions = n_actions
        self.gamma = gamma
        self.epsilon = epsilon
        self.eps_dec = eps_dec
        self.eps_min = eps_min
        self.action_space = [i for i in range(self.n_actions)]

        self.Q = LinearDeepQNetwork(self.lr, self.n_actions, self.input_dims)
        self.losses = []

    def choose_action(self, state):
        if np.random.random() > self.epsilon:
            state1 = T.tensor(state, dtype=T.float).to(self.Q.device)
            actions = self.Q.forward(state1)
            #选最大的动作执行
            action = T.argmax(actions).item()
        else:
            action = np.random.choice(self.action_space)

        return action

    def decrement_epsilon(self):
        #贪心的变化
        self.epsilon = self.epsilon - self.eps_dec \
                        if self.epsilon > self.eps_min else self.eps_min

    def learn(self, state, action, reward, state_):
        self.Q.optimizer.zero_grad()
        states = T.tensor(state, dtype=T.float).to(self.Q.device)
        actions = T.tensor(action).to(self.Q.device)
        rewards = T.tensor(reward).to(self.Q.device)
        states_ = T.tensor(state_, dtype=T.float).to(self.Q.device)

        q_pred = self.Q.forward(states)[actions]

        q_next = self.Q.forward(states_).max()

        q_target = reward + self.gamma*q_next

        loss = self.Q.loss(q_target, q_pred).to(self.Q.device)
        loss.backward()
        self.Q.optimizer.step()
        self.decrement_epsilon()
        self.losses.append(loss.item())

在此基础上,可以继续实现fixed-q-target和experience replay以及double QDN等优化
我添加了打印损失函数值的代码
在这里插入图片描述
所以为了方便程序的运行和跨时间段使用,修改等,建议用pytorch进行实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/307600.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus监控遇上报错invalid is not a valid start token

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 使用prometheus采集java应用的metric指标数据&#xff0c;在prometheus界面pod状态为down&#xff0c;报…

clickhouse常规的优化方法

一、建表优化 1.1日期字段避免使用String存储 建表时能用数值型或日期时间型表示的字段就不要用字符串&#xff0c;全String 类型在以Hive 为中心的数仓建设中常见&#xff0c;但ClickHouse 环境不应受此影响。 虽然ClickHouse 底层将DateTime 存储为时间戳Long 类型&#xf…

063:vue中一维数组与三维数组联动,类似购物车增减

第063个 查看专栏目录: VUE ------ element UI javascript 一维数组与三维数组联动,一维数组转换为三为数组,源文件下载 .zip 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安…

熟悉HDFS常用操作

1. 利用Hadoop提供的Shell命令完成下列任务 (1)向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件。 #检查文件是否存在./bin/hdfs dfs -test -e text.txt echo $? #结果是1 代表已存在 #根据结果判断出文件已存…

[ 机器学习 ] 关于Jupyter Notebook中pytorch模块import失败的问题

0x01、问题描述 在使用WSL搭建Jupyter进行代码测试的时候 发现Miniconda&#xff08;虚拟环境均适用&#xff09;中安装的pytorch在Jupyter里面import失败 但在python解释器的命令模式里可以测试import成功 并且torch.cuda_available()打印True 以前用的是IDEA没怎么用Jup…

Python学习笔记-使用Anaconda+VSCode配置开发环境

文章目录 概述一、安装Anaconda1.1 下载软件1.2 安装anaconda1.3 配置环境 二、配置虚拟环境2.1 使用conda创建一个新的虚拟环境2.1.1 使用search指令查看支持的python的版本&#xff1a;2.1.2 使用create创建指定版本的虚拟环境&#xff1a;2.1.3 使用env list查看虚拟环境列表…

文件夹重命名技巧:如何通过重命名解决文件夹名混乱不规律的问题

在日常生活和工作中&#xff0c;我们经常需要管理大量的文件夹&#xff0c;整理文档、图片等其他类型的文件。随着时间的推移&#xff0c;文件夹名可能会变得混乱和不规律&#xff0c;导致查找和管理变得困难。现在一起来看云炫文件管理器如何让文件名变简洁的操作方法吧。 下…

【2024最新-python3小白零基础入门】No1.python简介以及环境搭建

文章目录 一 python3 简介二 python语言的特点三 python安装四 安装开发工具-pycharm五 新建一个python项目1.新建项目2 配置虚拟环境3 运行项目 一 python3 简介 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&a…

Js-基础语法(二)

运算符 赋值运算符 赋值运算符&#xff1a;对变量进行赋值的运算符 已经学过的赋值运算符&#xff1a; 将等号右边的值赋予给左边, 要求左边必须是一个容器 其他赋值运算符&#xff1a; - */% 使用这些运算符可以在对变量赋值时进行快速操作 一元运算符 众多的 JavaScrip…

使用Linux防火墙管理HTTP流量

在Linux系统中&#xff0c;防火墙是用于控制网络流量的重要工具。通过防火墙&#xff0c;你可以根据需要限制、过滤或允许特定的网络流量&#xff0c;从而提高系统的安全性。在处理HTTP流量时&#xff0c;防火墙可以帮助你实施访问控制、流量监控和其他安全策略。 iptables i…

CSS3新增边框样式

边框样式 概念:在CSS3中&#xff0c;针对元素边框增加了丰富的修饰属性。 常见的边框样式属性有以下 属性说明border-radius圆角效果box-shadow边框阴影border-image边框背景 border-radius属性 概念&#xff1a;border-radius属性可以为元素添加圆角效果 语法&#xff1…

新书速览|循序渐进Vue.js 3.x前端开发实战

Vue.js初学者和前端开发人员使用&#xff0c;网课、培训机构与大中专院校的教学用书 作者简介 张益珲 美国亚利桑那州立大学计算机工程技术硕士&#xff0c;架构师&#xff0c;从业近10年&#xff0c;多年大前端开发经验&#xff0c;曾就职于知名上市公司&#xff0c;主导开发…

Java项目:115SSM宿舍管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 宿舍管理系统基于SpringSpringMVCMybatis开发&#xff0c;系统主要功能如下&#xff1a; 学生管理班级管理宿舍管理卫生管理维修登记访客管理 二、技术框…

MyBatis:自定义 typeHandler 处理枚举类型

MyBatis 枚举类型typeHandler 枚举类型 枚举类型&#xff0c;在 Java 中属于基本数据类型&#xff0c;而不是构造数据类型&#xff0c;用于声明一组命名的常数。枚举可以根据 Integer 、Long 、Short 或 Byte 中的任意一种数据类型来创建一种新型变量。这种变量可以设置为已经…

C++ std::move std::forward

std::move 统统转换为&& 右值引用。 std::foreward 有条件的转换。 左值转换为左值引用&#xff0c;右值转换为右值引用。

超市商品管理系统设计 C++实现

超市商品管理系统设计—C实现 文章目录 超市商品管理系统设计---C实现一、内容要求大纲图 二、源代码&#xff08;包含大量注释&#xff09;1、main.cpp文件2、supermarket.h文件3、supermarket.cpp文件4、administrator.h文件5、administrator.cpp文件6、user.h文件7、user.cp…

spring boot + mybatis + websocket + js实战

项目技术&#xff1a;spring boot mybatis websocket js 需求背景&#xff1a;当添加一个女孩时&#xff0c;页面的socket收到消息&#xff0c;打印最新的所有女生list&#xff0c;这样可以进一步在react/vue前端框架下&#xff0c;实现当A用户新增了某业务数据后&#xff…

Linux--防火墙,实验案例:基于区域、服务、端口的访问控制

实验环境 某公司的Web服务器&#xff0c;网关服务器均采用Linux CentOS 7.3操作系统&#xff0c;如图2.13所示。为了 加强网络访问的安全性&#xff0c;要求管理员熟悉firewalld防火墙规则的编写&#xff0c;以便制定有效、可行的主机防护策略。 需求描述 > 网关服务器ens3…

视频智能剪辑方案,企业视频制作新时代

视频已经成为了人们获取信息、娱乐和学习的重要方式。然而&#xff0c;传统的视频制作过程繁琐且耗时&#xff0c;这对于许多企业来说无疑是一个巨大的挑战。为了解决这个问题&#xff0c;美摄科技凭借其在机器学习、深度学习等AI算法方面的深厚积累&#xff0c;自主研发了一套…

小白也能懂!人物百度百科怎么创建?手把手教会你创建人物百科

在互联网时代&#xff0c;百度百科已经成为了人们获取信息的重要途径之一。对于名人、企业家、艺术家、专家学者等人物来说&#xff0c;拥有一个完善的百度百科词条不仅能够提升个人形象&#xff0c;还能够为他们的事业发展带来更多的机会&#xff0c;所以很多人都会去选择创建…