云计算任务调度仿真02

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

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

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

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

class DAG(object):def __init__(self, fname, num_task):self.fname = fname# 任务数量self.num_task = num_taskself.job = []self.task = []def readfile(self):# 读取任务数据num_task = 0with 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 += 1if num_task == self.num_task:breakif len(task) != 0:self.job.append(task)def checkRing(self, parent, child):# 检查无环if parent.index == child.index:return Trueif len(child.child) == 0:return Falsefor c in child.child:if self.checkRing(parent, c):return Truereturn Falsedef buildDAG(self):# 构建有向无环图import randomfor job in self.job:for task in job:i = random.randint(-len(job), len(job) - 1)if i < 0:continueparent = 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 = scaleself.fname = fnameself.task = []self.dag = DAG(self.fname, num_task)  # 根据task数量构建dag# 设置每个服务器上虚拟机的数量self.VMNum = 5self.rej = 0# 任务数量和服务器数量是通过参数传递的self.num_task = num_taskself.severNum = num_server# 而集群数量是通过计算出来的if num_server <= 50:self.farmNum = 1else:if int(self.severNum / 50) * 50 < num_server:self.farmNum = int(self.severNum / 50) + 1else: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 = lrself.input_dims = input_dimsself.n_actions = n_actionsself.gamma = gammaself.epsilon = epsilonself.eps_dec = eps_decself.eps_min = eps_minself.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 actiondef decrement_epsilon(self):#贪心的变化self.epsilon = self.epsilon - self.eps_dec \if self.epsilon > self.eps_min else self.eps_mindef 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_nextloss = 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进行实现

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

京东(天猫淘宝)数据分析工具-鲸参谋系统全功能解析——行业大盘、红蓝海市场、品牌分析、店铺分析、商品分析、竞品监控(区分自营和POP)

作为第三方电商数据平台&#xff0c;鲸参谋电商大数据系统能够为品牌方和商家提供包括行业趋势、热门品牌、店铺分析、单品分析在内的多个层面数据分析&#xff0c;帮助商家做出更加准确的经营决策&#xff0c;提升经营效率&#xff0c;实现精准营销。 下面&#xff0c;我们针…

“编程语言大比拼:Python、JavaScript、Java与C#的优劣与选择“。

以下是一篇关于不同编程语言特性的比较和选择的文章。 在当今的编程世界中&#xff0c;有许多种不同的编程语言可供选择。每种语言都有其独特的特性和优点&#xff0c;这使得选择最适合特定项目的语言变得复杂。本文将比较几种流行的编程语言&#xff0c;以帮助您了解它们的特…

gem5学习(11):将缓存添加到配置脚本中——Adding cache to the configuration script

目录 一、Creating cache objects 1、Classic caches and Ruby 二、Cache 1、导入SimObject(s) 2、创建L1Cache 3、创建L1Cache子类 4、创建L2Cache 5、L1Cache添加连接函数 6、为L1ICache和L1DCache添加连接函数 7、为L2Cache添加内存侧和CPU侧的连接函数 完整代码…

机器学习---流形学习

1. 流形学习 作为机器学习研究的热点问题之一&#xff0c;流形学习是要从高维数据集中发现内在的低维流形&#xff0c;并基于低 维流形来实现随后的各种机器学习任务&#xff0c;如模式识别&#xff0c;聚类分析。与欧氏空间不同&#xff0c;流形学习主要 处理的是非欧空间里…

4、指针与数组

数组与指针 指针与地址指针与函数参数指针与数组地址算数运算字符指针与函数指针数组以及指向指针的指针多维数组命令行参数指向函数的指针复杂声明 指针是一种保存变量地址的变量。C语言中&#xff0c;指针的使用非常广泛&#xff0c;原因之一是&#xff0c;指针常常是表达某个…

金融帝国实验室(Capitalism Lab)V10版本游戏平衡性优化与改进

即将推出的V10版本中的各种游戏平衡性优化与改进&#xff1a; ————————————— 一、当玩家被提议收购一家即将破产的公司时&#xff0c;显示商业秘密。 当一家公司濒临破产&#xff0c;玩家被提议收购该公司时&#xff0c;如果玩家有兴趣评估该公司&#xff0c;则无…

element plus el-form双列布局及拓展任意布局

1 场景 一般表单我们直接默认布局&#xff0c;也就是单列布局&#xff0c;突然有个人员信息表单&#xff0c;需要双列布局的需求&#xff0c;简单实现并拓展下 2 思路 直接无脑divflex布局实现 3 代码 <template><el-form ref"formRef" :model"fo…

【DNS】

服务程序 1.如果有默认配置&#xff0c;请先备份在进行修改 2.修改完配置文件&#xff0c;请重启服务或重新加载配置文件&#xff0c;否则不生效 dhcp 动态主机配置协议&#xff08;自动分配ip地址&#xff09; 只要插上网线就可以获得ip地址 dhcp的分配方式&#xff1a;1…

概述:利用大模型 (LLMs) 解决信息抽取任务

论文标题&#xff1a;Large Language Models for Generative Information Extraction: A Survey 论文链接&#xff1a;https://arxiv.org/pdf/2312.17617.pdf 论文主要探讨了大型语言模型&#xff08;LLMs&#xff09;在生成式信息抽取&#xff08;IE&#xff09;任务中的应用…

PYTHON通过跳板机巡检CENTOS的简单实现

实现的细节和引用的文件和以前博客记录的基本一致 https://shaka.blog.csdn.net/article/details/106927633 差别在于,这次是通过跳板机登陆获取的主机信息,只记录差异的部份 1.需要在跳板机相应的路径放置PYTHON的脚本resc.py resc.py这个脚本中有引用的文件(pm.sh,diskpn…

东方通中间件使用IDEA进行远程打debug

修改startserver.sh JAVA_OPTS"${JAVA_OPTS} -Xdebug -Xrunjdwp:transportdt_socket,servery,suspendn,address5005"idea配置请参考我的其他篇博客&#xff08;idea 对远程服务器打debug&#xff09;

CSS3背景样式详解(图像大小,图像位置等)

背景样式 在CSS3中&#xff0c;新增了3个背景属性 属性说明background-size背景大小background-origin背景位置background-clip背景剪切 background-size属性 概念&#xff1a;在CSS3之前&#xff0c;我们是不能用CSS来控制背景图片大小的&#xff0c;背景图片的大小都是由…