负载平衡算法-特殊示例

如何解决负载平衡算法-特殊示例

| 假设我有两座建筑物,可以在其中建造不同的单元。 一栋建筑物只能同时建造一个单位,但是最多有5个单位的FIFO队列,这些队列将按顺序建造。 每个单元都有一个构建时间。 我需要知道,考虑到我的建筑物的构建队列中已存在的单元,最快的解决方案是使我的单元尽快运行的最快方法。 我认为,像RoundRobin这样的“著名”算法在这里不起作用。 有没有什么算法可以解决这个问题?     

解决方法

        这让我想起了一些星际争霸:D 我只是将一个整数添加到建筑队列中,以表示繁忙时间。 当然,您必须每个时间单位更新一次此变量。 (时间单位在此处为“ s”,持续几秒钟) 假设我们有一栋大楼,正在提交3个单元,每个单元需要5秒钟才能完成。总计15秒。我们在时间= 0。 然后,我们在另一座建筑物中提交2个单元,每个单元需要6个时间单元来完成。 所以我们可以有一个这样的表:
Time 0 
Building 1,3 units,15s to complete.
Building 2,2 units,12s to complete.

Time 1
Building 1,14s to complete.
Building 2,12s to complete.
我们想添加另一个耗时2秒的单元,我们可以简单地循环遍历所选建筑物,并选择耗时最短的建筑物。 在这种情况下,它将建立2。这将导致Time2 ...
Time 2
Building 1,13s to complete
Building 2,11s+2s=13s to complete
...
Time 5
Building 1,10s to complete (5s are over,the first unit pops out)
Building 2,10s to complete
等等。 当然,您必须注意生产设备的上限。就像建筑物有5个元素一样,不要分配任何东西,而是选择时间最短的下一栋建筑物。 我不知道您是否可以使用引擎轻松实现此功能,或者它是否支持某种时间单位。 这只会导致每个时间单位O(n)更新一次所有生产设施,其中n是可以生产某种东西的建筑物的数量。如果您要提交单元,则假设您将所选建筑物保持在已排序的顺序中,则将采用O(1)的顺序,即最低的优先顺序-因此仅进行第一个元素查找。在这种情况下,您必须在处理诸如取消或添加之类的单位之后重新使用列表。 否则,阿米特的答案似乎也是可能的。     ,        这是NPC问题(答案的末尾有证明),因此,找到理想解决方案的最大希望就是尝试所有可能性(这将是2 ^ n个可能性,其中n是任务数)。 注释中建议了可能的启发式方法(AShelly在注释中进行了改进):将任务从最大到最小排序,并将它们放在一个队列中,每个任务完成后现在都可以从队列中获取元素。 当然这并不总是最佳的,但是我认为在大多数情况下都会取得良好的效果。 证明问题出在NPC上: 令S = {u | u是需要生产的单位}。 (S是包含所有\'tasks \'的集合) 主张:如果存在可能的知情分裂(两个队列同时完成),则是最佳选择。让这个时间成为HalfTime 这是正确的,因为如果存在不同的最佳值,则至少一个队列必须在t> HalfTime处完成,因此它不是最佳值。 证明: 假设我们有一个算法
A
在多项式时间产生最佳解,那么我们可以通过以下算法解决多项式时间的分区问题:
1. run A on input
2. if the 2 queues finish exactly at HalfTIme - return True.
3. else: return False
此解决方案解决了以下问题,因为存在以下主张:如果存在分区,则A将返回它,因为它是最佳的。所有步骤1,2,3在多项式时间运行(假设1,2和3是微不足道的)。因此我们建议的算法可解决多项式时间的分区问题。因此,我们的问题是NPC Q.E.D.     ,这是一个简单的方案: 令U为要构建的单元的列表,使F为可以构建它们的工厂的集合。对于每个工厂,跟踪总的时间直到完成;即,直到队列完全空了多长时间。 通过减少构建时间对U进行排序。插入新项目时保持排序顺序 在工厂完成后的开始或任何时间的最后一滴答声中,设备将无法工作: 列出所有有队列的工厂的就绪清单 通过增加时间到完成来对就绪列表进行排序 获得最快将要完成的工厂 从U取第一项,并将其添加到工厂 重复直到U为空或所有队列已满。 谷歌搜索“最小makepan”可能会给您带来其他解决方案的线索。这个CMU讲座有一个很好的概述。 事实证明,如果您提前知道工作集,那么这个问题就是Multiprocessor_scheduling,即NP-Complete。显然,我建议的算法称为“最长处理时间”,并且其结果始终不超过最佳时间的4/3。 如果您不提前知道工作,则可以使用在线Job-Shop计划 论文“在线最小Makespan计划的重新排序能力”说   针对许多问题,包括最低要求   makepan调度,这是合理的   不仅为   一定数量的未来工作,但是   另外允许算法   选择以下工作之一   接下来处理,因此   重新排序输入序列。 因为每个工厂都有一个FIFO,所以您实际上可以缓冲传入的作业,因为您可以将它们保持到工厂完全空闲为止,而不是试图始终保持所有FIFO都满。 如果我对论文的理解正确,该方案的结果是 保持固定大小的传入缓冲区 工作。一般来说,越大 缓冲,更接近理想 安排你得到。 为每个工厂分配权重w 给定的公式,取决于 缓冲区大小。在这种情况下 缓冲区大小=工厂数量+1,对2个工厂使用权重(2 / 3,1 / 3); (5 / 11,4 / 11,2 / 11)for 3。 一旦缓冲区已满,则每当有新作业到达时,您都将以最少的构建时间删除该作业,并将其分配给工厂的完成时间

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-