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

[复制链接]
发表于 2025-10-16 17:40:04 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

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盘算,每一次随机产生的加速包,用于加速哪一个队列,做出决议优先加速哪一个构筑,最快完成构筑升级。
  1. import random
  2. class Building:
  3.     def __init__(self, name, building_type, initial_remaining):
  4.         self.name = name
  5.         self.type = building_type
  6.         self.level = 0  # 当前等级
  7.         self.stage_remaining = initial_remaining  # 当前阶段剩余时间(秒)
  8.         self.upgrading = initial_remaining > 0  # 是否正在升级
  9.     def apply_accelerator(self, accelerator_seconds):
  10.         if not self.upgrading or self.level >= 3:
  11.             return
  12.         # 应用加速
  13.         self.stage_remaining -= accelerator_seconds
  14.         if self.stage_remaining <= 0:
  15.             self.level += 1
  16.             if self.level >= 3:
  17.                 self.upgrading = False
  18.                 self.stage_remaining = 0
  19.             else:
  20.                 # 开始下一阶段的升级
  21.                 if self.type == 'abc':
  22.                     self.stage_remaining = 8 * 86400  # 8天
  23.                 else:
  24.                     self.stage_remaining = 10 * 86400  # 10天
  25.                 self.upgrading = True
  26.         else:
  27.             self.upgrading = True
  28.     def get_total_remaining_time(self):
  29.         if self.level >= 3:
  30.             return 0
  31.         total = self.stage_remaining
  32.         remaining_stages = 3 - (self.level + 1)
  33.         if remaining_stages <= 0:
  34.             return total
  35.         if self.type == 'abc':
  36.             total += remaining_stages * 8 * 86400
  37.         else:
  38.             total += remaining_stages * 10 * 86400
  39.         return total
  40. # 初始化建筑队列(时间转换为秒)
  41. buildings = [
  42.     Building('A', 'abc', 7 * 86400 + 5 * 3600 + 16 * 60 + 20),  # 7天05:16:20
  43.     Building('B', 'abc', 6 * 86400 + 6 * 3600 + 6 * 60 + 54),  # 6天06:06:54
  44.     Building('C', 'abc', 37 * 60),  # 00:37:00
  45.     Building('D', 'def', 1 * 86400 + 51 * 60 + 1),  # 01:51:01
  46.     Building('E', 'def', 9 * 86400 + 7 * 3600 + 10 * 60),  # 09:07:10
  47.     Building('F', 'def', 7 * 86400 + 10 * 3600 + 10 * 60 + 10),  # 07:10:10
  48. ]
  49. def select_best_target(accelerator_seconds, buildings):
  50.     min_max_time = float('inf')
  51.     best_building = None
  52.     current_totals = [b.get_total_remaining_time() for b in buildings]
  53.     current_max = max(current_totals)
  54.     if current_max == 0:
  55.         return None, 0
  56.     for b in buildings:
  57.         if not b.upgrading:
  58.             continue
  59.         # 保存当前状态
  60.         original_level = b.level
  61.         original_stage = b.stage_remaining
  62.         original_upgrading = b.upgrading
  63.         # 模拟应用加速
  64.         temp_b = Building(b.name, b.type, original_stage)
  65.         temp_b.level = original_level
  66.         temp_b.upgrading = original_upgrading
  67.         temp_b.apply_accelerator(accelerator_seconds)
  68.         # 计算新总时间
  69.         simulated_totals = []
  70.         for bb in buildings:
  71.             if bb.name == b.name:
  72.                 simulated_totals.append(temp_b.get_total_remaining_time())
  73.             else:
  74.                 simulated_totals.append(bb.get_total_remaining_time())
  75.         new_max = max(simulated_totals)
  76.         # 比较最优
  77.         if new_max < min_max_time or (new_max == min_max_time and best_building is None):
  78.             min_max_time = new_max
  79.             best_building = b
  80.         elif new_max == min_max_time:
  81.             if b.get_total_remaining_time() > best_building.get_total_remaining_time():
  82.                 best_building = b
  83.     return best_building, min_max_time
  84. # 模拟加速包生成和使用
  85. while True:
  86.     # 随机生成加速包(15/30/45/60/120分钟)
  87.     accelerator = random.choice([15, 30, 45, 60, 120]) * 60  # 转换为秒
  88.     best_building, new_max = select_best_target(accelerator, buildings)
  89.     if not best_building:
  90.         print("所有建筑已升级完成!")
  91.         break
  92.     # 应用加速包
  93.     best_building.apply_accelerator(accelerator)
  94.     print(
  95.         f"使用 {accelerator // 60}分钟加速包到建筑 {best_building.name},当前最长剩余时间:{new_max // 86400}天 {new_max % 86400 // 3600}小时{(new_max % 3600) // 60}分")
  96.     # 检查是否全部完成
  97.     if all(b.get_total_remaining_time() == 0 for b in buildings):
  98.         print("全部建筑升级完成!")
  99.         break
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表