def optimal_bellman(env, gamma=1.): p = np.zeros((env.nS, env.nA, env.nS)) # 初始化一个三维数组p,记录state,action,next_state之间的转移概率 r = np.zeros((env.nS, env.nA)) # 初始化二维数组r,存储当前state和action的即时reward for state in range(env.nS - 1): for action in range(env.nA): for prob, next_state, reward, done in env.P[state][action]: # 用于遍历每一个可能的状态及其概率,奖励和终止 p[state, action, next_state] += prob r[state, action] += (reward * prob) # 程序通过遍历所有可能的状态和动作,并对每个转移情况中的概率和奖励进行累加。 # 这样,最后得到的 p[state, action, next_state] 就是从当前状态 state 执行动作 action 后 # 转移到下一个状态 next_state 的累计概率。而 r[state, action] 则是从当前状态 state 执行动作 action 后累计获得的奖励值。 c = np.ones(env.nS) a_ub = gamma * p.reshape(-1, env.nS) - \ np.repeat(np.eye(env.nS), env.nA, axis=0) b_ub = -r.reshape(-1) a_eq = np.zeros((0, env.nS)) b_eq = np.zeros(0) bounds = [(None, None), ] * env.nS res = scipy.optimize.linprog(c, a_ub, b_ub, bounds=bounds, method='interior-point') v = res.x q = r + gamma * np.dot(p, v) return v, q 中a_ub和b_ub的作用
时间: 2024-04-10 15:31:36 浏览: 80
Python库 | optimal_buy_cbpro-1.1.20.tar.gz
在这段代码中,`a_ub` 和 `b_ub` 是线性规划问题的约束条件,用于定义最优Bellman方程的线性规划问题。
`a_ub` 是一个二维数组,其维度为 `(nS * nA) x nS`,其中 `nS` 是状态空间的大小,`nA` 是动作空间的大小。它表示了不等式约束的系数矩阵。具体来说,`a_ub` 的每一行对应于一个不等式约束,每一列对应于一个状态。`a_ub` 的定义是通过将转移概率矩阵 `p` 重新排列得到的。它的每个元素表示从当前状态执行某个动作后转移到下一个状态的累计概率。
`b_ub` 是一个一维数组,其长度为 `(nS * nA)`,表示了不等式约束的右侧值。它的每个元素表示了从当前状态执行某个动作后累计获得的即时奖励值的相反数。
综合起来,`a_ub @ v <= b_ub` 表示了最优Bellman方程的线性规划问题的不等式约束条件。即,对于所有的状态和动作组合,从当前状态执行某个动作后得到的累计奖励值乘以折扣因子 `gamma` 加上下一个状态的累计价值,不能超过当前状态的累计价值。
这样,通过求解线性规划问题,可以得到最优Bellman方程的解,即每个状态的最优价值函数 `v` 和最优动作价值函数 `q`。
阅读全文