You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实验时间约束下多维度状态最优选择与轨迹优化方案咨询

实验路径优化与数据多样性最大化问题

问题背景

设计一项实验:系统接收5个输入变量[x1, x2, x3, x4, x5]并记录对应状态的目标数据;系统从旧状态切换至新状态时,各变量以固定速率变化,切换过程中会记录路径上的目标值。需在总实验时间不超过20分钟(1200秒)的约束下,确定最优状态子集与轨迹,最大化生成数据点的多样性。

变量与实验约束

  • 变量取值范围:
x1 = np.arange(5, 37, 2)
x2 = np.arange(5, 53, 3)
x3 = np.arange(0, 3, 1)
x4 = np.arange(0, 4.3, 0.3)
x5 = np.arange(-3, 3.2, 0.2)
  • 总共有357120种可能的状态组合
  • 状态切换规则:到达新状态后,系统需静止5秒再切换至下一状态
  • 各变量的变化速率(每0.1秒):
x1_speed = 0.1
x2_speed = 0.1
x3_speed = 0.005 
x4_speed = 0.13
x5_speed = 0.1

当前方案与存在的问题

当前采用随机初始化状态子集的策略:在时间约束内随机生成状态序列,通过计算数据点间的总欧氏距离衡量多样性,保留总距离最大的子集。
存在的核心问题:随机采样无法覆盖全部状态空间区域,探索效率低,容易陷入局部最优的状态组合。

曾尝试路径优化方向,但因状态数与转移数过大,全量模拟不可行;同时待选状态需动态优化而非预定义,进一步提升了问题复杂度。

改进策略建议

1. 贪心+局部搜索的迭代优化算法

针对大状态空间,贪心策略结合局部搜索是高效的实用方案:

  • 初始状态选择:从状态空间中选取覆盖各变量取值范围的代表性状态(如各变量的极值点、中点组合),而非随机生成,确保初始集合就具备基础多样性。
  • 迭代扩展状态:每次选择下一个状态时,计算当前已选集合到所有候选状态的最小欧氏距离,优先选择使该最小距离最大的状态(最大化新增多样性),同时验证切换时间+静止时间是否满足总时间约束。
  • 局部优化调整:每新增3-5个状态后,尝试替换当前集合中对总多样性贡献最小的状态(比如替换后总欧氏距离提升且时间合规),避免陷入局部最优。

2. 强化学习路径规划

将问题建模为强化学习任务,适配大状态空间的动态决策需求:

  • 状态定义:包含当前系统状态、已用时间、已收集数据的多样性统计特征(如数据点的分布均值、方差,或最近邻距离的均值)。
  • 动作空间:选择下一个要切换的目标状态(可先对状态空间做降维处理,比如用PCA将5维变量压缩到2-3维,降低动作空间复杂度)。
  • 奖励函数:以新增数据点与已有所有点的平均欧氏距离作为正奖励,对超时行为给予强烈负奖励,引导模型在时间约束内持续提升多样性。
  • 算法选择:采用PPO(近端策略优化)算法,其适合处理大离散/连续动作空间,训练效率优于DQN类算法。

3. 空间填充采样+启发式路径规划

先通过空间填充方法生成覆盖性强的候选状态,再做路径优化:

  • 空间填充采样:用拉丁超立方采样(LHS)生成一批候选状态,确保各变量维度上均匀覆盖取值范围,避免随机采样的稀疏区域。
  • 路径规划:将候选状态视为节点,状态间的切换时间+静止时间为边权,转化为带时间约束的TSP变种问题,用遗传算法、蚁群算法等启发式算法求解,选择在总时间内最大化数据多样性的路径。

当前实现代码

import numpy as np
import pandas as pd
from scipy.spatial.distance import pdist

def state_gen():

    var1 = np.random.choice(x1)
    var2 = np.random.choice(x2)
    var3 = round(np.random.choice(x3), 1)
    var4 = round(np.random.choice(x4), 1)
    var5 = round(np.random.choice(x5), 1)

    state = [var1, var2, var3, var4, var5]
    return state


def state_change(state_old):

    state_new = state_gen()

    #x1
    x1_travel = state_old[0] - state_new[0]
    x1_time = abs(x1_travel/x1_speed) #in seconds

    #x2
    x2_travel = state_old[1] - state_new[1]
    x2_time = abs(x2_travel/x2_speed) #in seconds

    #x3
    x3_travel = state_old[2] - state_new[2]
    x3_time = abs(x3_travel/x3_speed) #in seconds

    #x4
    x4_travel = state_old[3] - state_new[3]
    x4_time = abs(x4_travel/x4_speed) #in seconds

    #x5
    x5_travel = state_old[4] - state_new[4]
    x5_time = abs(x5_travel/x5_speed) #in seconds

    #Record values to **states_df** here, add to return statement

    t_change = max(x1_time, x2_time, x3_time, x4_time, x5_time)
    return state_new, t_change


def objective():

    #Initialize first state
    state_old = state_gen()

    t_tot = 0

    while t_tot < 11500: #Little under 20 minutes in tenths of seconds

        state_new, t_change, = state_change(state_old)
        
        #System stationary for 5 seconds
        t_change += 50
        t_tot += t_change
        state_init = state_new
    
    tot_euc = pdist(states_df.values, metric='euclidean').sum()
    return tot_euc, tot_time, states_df



iter_nums = 250000
tot_euc_max = 0

for i in range(0, iter_nums):
    tot_euc, tot_time, states_df = objective()
    if tot_euc > tot_euc_max:
        tot_euc_max = tot_euc

print('Maximum {} attained'.format(tot_euc_max))
print('Total run time: {}'.format(tot_time))

内容的提问来源于stack exchange,提问作者tishafok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:45:24