基于python的升级队列加速决策

news2025/3/13 9:08:54

a-f大等级是3级

a-c建筑每升1级分别需要8天

d-f建筑每升1级分别需要10天

目前以下建筑队列正在从0级升至1级

建筑A升级需要7天05:16:20

建筑b升级需要06:06:54

建筑c升级需要00:37:00

建筑d升级需要01:51:01

建筑e升级需要09:07:10

建筑f升级需要07:10:10

每30分钟会产生一个随机时间的升级加速包:15,30,45,60,120分钟

基于python计算,每一次随机产生的加速包,用于加速哪一个队列,做出决策优先加速哪一个建筑,最快完成建筑升级。

import random


class Building:
    def __init__(self, name, building_type, initial_remaining):
        self.name = name
        self.type = building_type
        self.level = 0  # 当前等级
        self.stage_remaining = initial_remaining  # 当前阶段剩余时间(秒)
        self.upgrading = initial_remaining > 0  # 是否正在升级

    def apply_accelerator(self, accelerator_seconds):
        if not self.upgrading or self.level >= 3:
            return
        # 应用加速
        self.stage_remaining -= accelerator_seconds
        if self.stage_remaining <= 0:
            self.level += 1
            if self.level >= 3:
                self.upgrading = False
                self.stage_remaining = 0
            else:
                # 开始下一阶段的升级
                if self.type == 'abc':
                    self.stage_remaining = 8 * 86400  # 8天
                else:
                    self.stage_remaining = 10 * 86400  # 10天
                self.upgrading = True
        else:
            self.upgrading = True

    def get_total_remaining_time(self):
        if self.level >= 3:
            return 0
        total = self.stage_remaining
        remaining_stages = 3 - (self.level + 1)
        if remaining_stages <= 0:
            return total
        if self.type == 'abc':
            total += remaining_stages * 8 * 86400
        else:
            total += remaining_stages * 10 * 86400
        return total


# 初始化建筑队列(时间转换为秒)
buildings = [
    Building('A', 'abc', 7 * 86400 + 5 * 3600 + 16 * 60 + 20),  # 7天05:16:20
    Building('B', 'abc', 6 * 86400 + 6 * 3600 + 6 * 60 + 54),  # 6天06:06:54
    Building('C', 'abc', 37 * 60),  # 00:37:00
    Building('D', 'def', 1 * 86400 + 51 * 60 + 1),  # 01:51:01
    Building('E', 'def', 9 * 86400 + 7 * 3600 + 10 * 60),  # 09:07:10
    Building('F', 'def', 7 * 86400 + 10 * 3600 + 10 * 60 + 10),  # 07:10:10
]


def select_best_target(accelerator_seconds, buildings):
    min_max_time = float('inf')
    best_building = None
    current_totals = [b.get_total_remaining_time() for b in buildings]
    current_max = max(current_totals)

    if current_max == 0:
        return None, 0

    for b in buildings:
        if not b.upgrading:
            continue
        # 保存当前状态
        original_level = b.level
        original_stage = b.stage_remaining
        original_upgrading = b.upgrading

        # 模拟应用加速
        temp_b = Building(b.name, b.type, original_stage)
        temp_b.level = original_level
        temp_b.upgrading = original_upgrading
        temp_b.apply_accelerator(accelerator_seconds)

        # 计算新总时间
        simulated_totals = []
        for bb in buildings:
            if bb.name == b.name:
                simulated_totals.append(temp_b.get_total_remaining_time())
            else:
                simulated_totals.append(bb.get_total_remaining_time())
        new_max = max(simulated_totals)

        # 比较最优
        if new_max < min_max_time or (new_max == min_max_time and best_building is None):
            min_max_time = new_max
            best_building = b
        elif new_max == min_max_time:
            if b.get_total_remaining_time() > best_building.get_total_remaining_time():
                best_building = b
    return best_building, min_max_time


# 模拟加速包生成和使用
while True:
    # 随机生成加速包(15/30/45/60/120分钟)
    accelerator = random.choice([15, 30, 45, 60, 120]) * 60  # 转换为秒
    best_building, new_max = select_best_target(accelerator, buildings)

    if not best_building:
        print("所有建筑已升级完成!")
        break

    # 应用加速包
    best_building.apply_accelerator(accelerator)
    print(
        f"使用 {accelerator // 60}分钟加速包到建筑 {best_building.name},当前最长剩余时间:{new_max // 86400}天 {new_max % 86400 // 3600}小时{(new_max % 3600) // 60}分")

    # 检查是否全部完成
    if all(b.get_total_remaining_time() == 0 for b in buildings):
        print("全部建筑升级完成!")
        break

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ragflow技术栈分析及二次开发指南

Ragflow是目前团队化部署大模型+RAG的优质方案,不过其仍不适合直接部署使用,本文将从实际使用的角度,对其进行二次开发。 1. Ragflow 存在问题 Ragflow 开源仓库地址:https://github.com/infiniflow/ragflow Ragflow 当前版本: v0.17.0 Ragflow 目前主要存在以下问题: …

1.7 双指针专题:三数之和(medium)

1.题目链接 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/3sum/submissions/609626561/ 2.题目描述 给你⼀个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满⾜ i ! j、i ! k 且 j ! k &#xff0c;同时…

【JavaEE】Spring Boot配置文件

目录 一、Spring Boot配置文件简介二、properties 配置⽂件说明2.1 properties 基本语法2.2 value("${}")读取配置⽂件 三、yml 配置文件说明3.1 yml 基本格式3.2 yml 配置数据类型 及 读取3.3 yml配置对象及读取ConfigurationProperties(prefix "")3.4 配…

行为模式---策略模式

概念 策略模式是一种行为设计摸是&#xff0c;它的核心思想是将一些列的算法封装成独立的对象&#xff0c;并使它们可以相互替换&#xff0c;通过上下文进行调用。 策略模式通过算法抽象为独立的策略类&#xff0c;客户端可以根据自身需求选择不同的策略类来完成任务、这种方…

Word 小黑第15套

对应大猫16 修改样式集 导航 -查找 第一章标题不显示 再选中文字 点击标题一 修改标题格式 格式 -段落 -换行和分页 勾选与下段同页 添加脚注 &#xff08;脚注默认位于底部 &#xff09;在脚注插入文档属性&#xff1a; -插入 -文档部件 -域 类别选择文档信息&#xff0c;域…

OSPF:虚链路

一、虚链路概念 在OSPF中&#xff0c;虚链路&#xff08;Virtual Link&#xff09; 是一种逻辑连接&#xff0c;用于解决因网络设计或扩展导致的区域无法直接连接到骨干区域&#xff08;Area 0&#xff09;的问题。它是通过中间区域&#xff08;Transit Area&#xff09;在两个…

网络安全事件响应--应急响应(windows)

应用系统日志 Windows主要有以下三类日志记录系统事件&#xff1a;应用程序日志、系统日志和安全日志。 系统和应用程序日志存储着故障排除信息&#xff0c;对于系统管理员更为有用。安全日志记录着事件审计信息&#xff0c;包括用户验证&#xff08;登录、远程访问等&#x…

DataEase:一款国产开源数据可视化分析工具

DataEase 是由飞致云开发的一款基于 Web 的数据可视化 BI 工具&#xff0c;支持丰富的数据源连接&#xff0c;能够通过拖拉拽方式快速制作图表&#xff0c;帮助用户快速分析业务数据并洞察其趋势&#xff0c;为企业的业务改进与优化提供支持。 DataEase 的优势在于&#xff1a;…

RTK与RTD基础原理

(文中的部分图片是摘自其他博主的文章&#xff0c;由于比较久&#xff0c;忘记原本链接了&#xff0c;侵删) GPS定位原理 卫星自身有自己的星历与原子钟&#xff0c;因此卫星知道自身准确的空间坐标与时间。因为每个卫星都有原子钟&#xff0c;因此每颗卫星的时间基本上都是相…

Python读取显示Latex的公式文档,Python加载显示markdown文件。

平时用LLM大语言模型去解释文献里面的公式含义直接复制的格式word看不懂&#xff0c;基于这个web可以正常加载显示。 下面是读取的效果展示&#xff1a;下面程序保存为stl_read.py然后运行下面指令。 streamlit run stl_read.pyimport streamlit as st import base64 import …

mapbox高阶,结合threejs(threebox)添加extrusion挤出几何体,并添加侧面窗户贴图和楼顶贴图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox extrusion挤出几何体二、🍀…

mock的定义和使用场景

Python自动化中使用mock的示例 在Python自动化测试中&#xff0c;mock 用于模拟对象、函数或方法的行为&#xff0c;以便在隔离的环境中测试代码。以下是一个简单的示例&#xff1a; 假设你有一个 user.py 模块&#xff0c;其中包含一个 get_user_info 函数&#xff0c;用于从…

封装Axios拦截器实现用户无感刷新AccessToken实践指南

一、背景与需求场景 1.1 单点登录体系中的Token管理 在单点登录&#xff08;SSO&#xff09;体系下&#xff0c;用户登录后系统会颁发两种令牌&#xff1a; AccessToken&#xff1a;短期有效&#xff08;2小时&#xff09;&#xff0c;用于接口鉴权 RefreshToken&#xff1a…

CSDN博客:Markdown编辑语法教程总结教程(下)

❤个人主页&#xff1a;折枝寄北的博客 Markdown编辑语法教程总结 前言1. LaTex数学公式2. 插入不同类别的图2.1 插入甘特图2.2 插入UML图2.3 插入Mermaid流程图2.4 插入Flowchart流程图2.5 插入classDiagram类图 3. CSDN快捷键4. 字体相关设置4.1 字体样式改变4.2 字体大小改变…

【Python】06、流程控制语句

文章目录 1.条件判断语句1.1 if 语句2. input 函数3.if-else 语句4.if-elif-else 语句 2.循环语句2.1 while语句2.2 while语句练习&#xff1a;2.3 循环嵌套2.4 break和continue 通过流程控制语句&#xff0c;可以改变程序的执行顺序&#xff0c;也可以让指定程序反复执行多次。…

《python》—— threading库(线程和多线程)

文章目录 threading简介threading基本概念常用类和方法线程同步线程池实例 threading简介 threading 是 Python 标准库中用于实现多线程编程的模块。多线程编程允许程序同时执行多个任务&#xff0c;提高程序的并发性能&#xff0c;尤其适用于 I/O 密集型任务&#xff0c;例如…

【数据分享】2000-2024年全国逐年归一化植被指数(NDVI)栅格数据(年最大值)

NDVI&#xff0c;全名为Normalized Difference Vegetation Index&#xff0c;中文名称为归一化植被指数。这个指数可以用来定性和定量评价植被覆盖及其生长活力&#xff0c;我们也可以简单地将它理解为体现植被密度和健康状况的一个指标。 之前我们给大家分享了来源于MOD13A3数…

混沌理论与混沌映射——算法改进初始化创新点之一

混沌理论与混沌映射 混沌理论研究混沌系统的动力学&#xff0c;其特征是非线性和对初始条件的极端敏感性。即使在这些条件下的微小变化也可能导致系统结果的显著变化。尽管看起来是随机的&#xff0c;混沌系统可以在不依赖随机性的情况下表现出不规则的行为&#xff0c;因为确…

19874并查集

19874并查集 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;并查集、数据结构 &#x1f4d6; &#x1f4da; import java.util.*;public class Main {static int N 100010;static int[] a new int[N];static int[] p new int[N];static int n;static int m;st…

Jmeter下载安装配置及使用

1、下载 官网地址&#xff1a;Apache JMeter - Download Apache JMeter 2、配置环境变量 ①找到环境变量&#xff0c;两种方法 法一&#xff1a;我的电脑→右键菜单→属性→高级系统设置→环境变量 法二&#xff1a;直接搜索环境变量 ②新建两个系统变量 1.变量名&#x…