[英]How does Deep Reinforcement Learning remove the need to map or explore every state, action pair for an agent?
我有興趣使用深度強化學習來教 AI 如何玩游戲,其中 AI 在開始時就知道游戲的模型(所以我會使用基於模型的深度強化學習?)
但是,可以采取的可能狀態和動作組合的數量非常大,我無法繪制出每一對。 我聽說深度強化學習是這個非常大的狀態空間的解決方案,但我不確定如何訓練神經網絡在任何(未來)狀態下采取哪些行動,如果它沒有經歷過每種可能的狀態然而。
任何人都可以就這個問題提供澄清嗎?
好,這里有幾件事。
首先,在服務器繁忙的情況下,connect設計為在超時之前等待一會兒。 您可以調整超時時間,盡管我不記得確切該怎么做。
其次,您的代碼將找到一個服務器,但是您如何知道它在尋找的服務器呢? 可能是其他一些僅在同一端口上監聽的應用程序。 除非您僅對任何服務器進行掃描,否則都需要進行一些驗證以確保另一端正在與誰交談。
最后,假設您同時編寫客戶端和服務器,則更好的解決方案是讓客戶端發送廣播/多播消息,並使服務器(或服務器(如果有多個))偵聽並響應該消息。 。 然后,客戶端只需等待指定的時間段,以便做出響應以弄清服務器的位置。
我將進行一項研究,以確定winsock是否支持異步I / O。
服務器IP地址是否是如此隨機,以至於您每次都需要這樣做? 我已經很長時間沒有做任何套接字編程了,但是超時了,這樣可能不會變得更好。
其他選項:
機器學習中的大多數近似形式也會導致泛化——當出現一個以前沒有見過的例子時,能夠為目標變量提供優於猜測的估計。
在 RL 之外,使用帶有神經網絡或其他函數逼近器的訓練數據集,實現這種泛化是訓練時最常見的目標。 這就是交叉驗證和測試數據集的原因,以衡量模型學習概括的程度。
深度強化學習在探索非常大的狀態/動作空間時,依賴這種泛化效應來有效學習。
近似器仍然很難在棋盤游戲中很好地概括,在這種情況下,狀態的微小差異可能會導致完全不同的結果。 因此,像AlphaZero這樣的自學學習系統使用復雜的架構和大量的計算資源在短時間內獲得大量的經驗(數百萬個游戲)。 這仍然遠遠不能強制所有可能的狀態(許多數量級),因此仍然嚴重依賴泛化。
如果您知道服務器在子網上,為什么不發送帶有本地接收端口號作為消息數據的廣播消息? 然后,服務器可以簡單地偵聽此消息並連接回該端口,或者將其自己的配置數據發送回該端口,以便客戶端可以直接連接。 這樣,您只需要發送一條消息即可,而無需遍歷256個IP地址。
過去,在“每個人都有139端口”的開放日里,我都取得了巨大的成功。
我發現使用多個線程(可悲的是,我使用了大約500個線程,但這只是一次射擊,只是為了好玩),在嘗試連接之前,我對服務器進行了ping操作,使我每秒可以穿越數小時和IP。
我仍然有源代碼(C ++),如果您想檢查一下,請給我留言。
另外,為什么到底有必要掃描IP? 即使它是動態的,您也應該能夠通過其主機名來查找ip。 請參閱gethostbyname()或getaddrinfo()。
我看到您正在使用Windows。 但是,如果您使用的是Linux,則可以通過組合非阻塞套接字來創建具有超時功能的連接函數,然后選擇:
int connect_with_timeout(int sock, struct sockaddr *addr, int size_addr, int timeout) {
#if defined(Linux)
int error = 0;
fd_set rset;
fd_set wset;
int n;
// set the socket as nonblocking IO
int flags = fcntl (sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flags | O_NONBLOCK);
errno = 0;
// we connect, but it will return soon
n = connect(sock, addr, size_addr);
if(n < 0) {
if (errno != EINPROGRESS) {
return -1;
}
} else if (n == 0) {
goto done;
}
FD_ZERO(&rset);
FD_ZERO(&wset);
FD_SET(sock, &rset);
FD_SET(sock, &wset);
struct timeval tval;
tval.tv_sec = timeout;
tval.tv_usec = 0;
// We "select()" until connect() returns its result or timeout
n = select(sock + 1, &rset, &wset, 0, timeout ? &tval : 0);
if(n == 0) {
errno = ETIMEDOUT;
return -1;
}
if (FD_ISSET(sock, &rset) || FD_ISSET(sock, &wset)) {
socklen_t len = sizeof(error);
if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
return -1;
}
} else {
return -1;
}
done:
// We change the socket options back to blocking IO
if (fcntl(sock, F_SETFL, flags) == -1) {
return -1;
}
return 0;
#else
return connect(sock, addr, size_addr);
#endif
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.