学习日志19

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值