import pygame # 导入Pygame库用于游戏开发
import numpy as np # 导入Numpy库用于数字计算
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from time import time
import itertools
NUM_ACTIONS = 2 # 定义动作数量为2,选择或者不选择
NUM_STATES = 5 # 定义状态数量为5(共有5个物品)
Q = np.zeros([5, 2])
def val(x, y, z, total):
i = 0
ba = 0
zhongliang = 0
while (i < 5):
zhongliang = zhongliang + y[i] * z[i]
ba = ba + x[i] * z[i]
i = i + 1
if (total < zhongliang):
return -1000
else:
return ba
def get_reward(x,y,z,total,i):
if z[i] == 0:
return 0 # 如果当前格子是0,返回0
elif z[i] == 1:
return val(x,y,z,total) # 如果当前格子是1,返回-100(表示撞墙了)
# 定义超参数
alpha = 0.1 # 学习率
gamma = 0.9 # 折扣因子
epsilon = 0.1 # 探索概率
x=[1,6,18,22,28]
y=[1,2,5,6,7]
total=18
z=[0,0,0,0,0]
item = pd.DataFrame(data=[[1, 1],
[6, 2],
[18, 5],
[22, 6],
[28, 7]],
columns=['Value', 'Weight'])
print(item.values[1][0])
print(item)
for iii in range(10000):
state = 0 # 初始化状态为0(起点)
i = 0 # 记录步数,初始为0
#2种退出方式,重量超出限制或者循环结束
while True:
# 更新Q值
print((np.random.randn(1, 2) * (1. / (i + 1))))
action = np.argmax(Q[state, :] + np.random.randn(1, 2) * (1. / (i + 1)))
# 根据当前状态选择一个动作,其中np.argmax()用于获取当前状态下Q值最大的动作,
# 这里加上一个噪声项,用于控制探索,当i越大时,探索概率越小。
#动作为1代表选择,为2代表不选择
#print(action)
if(action==1):
z[state]=1
else:
z[state]=0
reward = get_reward(x, y, z, total,state)
#print(reward)
Q[state, action] += alpha * (reward + gamma * 1 - Q[state, action])
#print((Q[state, action]))
# 根据公式更新Q值,其中alpha为学习率,gamma为折扣因子,np.max(Q[next_state, :])用于获取下一个状态的最大Q值
i=i+1
state = state + 1 # 更新当前状态为下一个状态
if(state==5):
break
elif(val(x,y,z,total)==-1000):
break
print(Q)
学习日志19
最新推荐文章于 2024-11-04 13:07:19 发布