微頭條丨【RL】算法簡介與實現 Value-Based-Learning算法
一 Value-Based
Q-Learning
(資料圖片僅供參考)
Q-Learning是RL算法中Value-Based的算法,Q即為Q(s,a)就是在某一時刻的s狀態下(s∈S),采取 動作a (a∈A)能夠獲得收益的期望,環境會根據agent的動作反饋相應的回報reward。所以算法的主要思想就是將State與Action構建成一張Q-table來存儲Q值,然后根據Q值來選取能夠獲得最大的收益的動作。 下面是Q-Learning的TensorFlow實現
import numpy as npimport pandas as pdclass QLearning: def __init__(self, actions, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9): """ QLearning :param actions: :param learning_rate: :param reward_decay: :param e_greedy: """ self.actions = actions self.lr = learning_rate self.gamma = reward_decay self.epsilon = e_greedy self.q_table = pd.DataFrame(columns=self.actions) def chooseAction(self, observation): """Choose action with state and observation""" self.checkStateExist(observation) if np.random.uniform()<SELF.EPSILON: :]="" opt_actions="self.q_table.loc[observation," #="" ="="np.max(opt_actions)].index)"" return="" action="opt_actions.argmax()" updateparams(self,="" state,="" action,="" reward,="" self.checkstateexist(state_)="" q_pre="self.q_table.loc[state," state_="" !="terminal" self.gamma="" self.q_table.loc[state_,="" :].max()="" q_target="reward" self.q_table.loc[state,="" action]="" +="" *="" (q_target="" -="" q_pre)="" def="" checkstateexist(self,="" if="" state="" not="" in="" self.q_table="self.q_table.append(" pd.series([0]*len(self.actions),="" index="self.q_table.columns," name="state)" )
DQN
當狀態動作很多時,Q-Learning使用Table存儲Value的方式不再實用(甚至不可行)。
如何不使用Table而得到每個狀態下采取各個動作的Value呢?DQN用神經網絡將State映射到Value。 DQN是在Q-Learning的主框架上做了擴展,包括:
記憶庫(用于重復學習,隨機抽取的經歷也打亂的狀態之間的相關性,使神經網絡的更新更有效率)MLP計算Q值暫時凍結Q_target參數(切斷相關性),target網絡用來計算Q現實
下面是DQN的TensorFlow實現
import tensorflow as tfimport numpy as npclass DeepQNet: def __init__(self, n_actions, n_features, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9, update_target_iter=300, memory_size=500, batch_size=32, e_greedy_increment=None, output_graph=False, ): """ DQN :param n_actions: :param n_features: :param learning_rate: :param reward_decay: :param e_greedy: :param update_target_iter: :param memory_size: :param batch_size: :param e_greedy_increment: :param output_graph: """ self.n_actions = n_actions self.n_actions = n_actions self.n_features = n_features self.lr = learning_rate self.gamma = reward_decay self.epsilon_max = e_greedy self.update_target_iter = update_target_iter self.memory_size = memory_size self.batch_size = batch_size self.epsilon_increment = e_greedy_increment self.epsilon = 0 if e_greedy_increment is not None else self.epsilon_max # total learning step(Cooperate with update_target_iter in learn() to update the parameters of target net) self.learn_step_counter = 0 # memory: row = memory_size, col = observation + observation_ + action + reward self.memory = np.zeros((self.memory_size, self.n_features*2+2)) self._buildNet() self.sess = tf.Session() if output_graph: tf.summary.FileWriter("logs/", self.sess.graph) self.sess.run(tf.global_variables_initializer()) self.cost = [] def _buildNet(self): """"Build evaluate network and target network""" # build evaluate net self.state = tf.placeholder(tf.float32, [None, self.n_features], name="state") self.q_target = tf.placeholder(tf.float32, [None, self.n_actions], name="Q_target") with tf.variable_scope("evaluate_net"): c_names, n_l1 = ["evaluate_net_params", tf.GraphKeys.GLOBAL_VARIABLES], 10 w_initializer, b_initializer = tf.random_normal_initializer(0, 0.3), tf.constant_initializer(0.1) with tf.variable_scope("layer1"): w1 = tf.get_variable("w1", [self.n_features, n_l1], initializer=w_initializer, collections=c_names) b1 = tf.get_variable("b1", [1, n_l1], initializer=b_initializer, collections=c_names) l1 = tf.nn.relu(tf.matmul(self.state, w1) + b1) with tf.variable_scope("layer2"): w2 = tf.get_variable("w2", [n_l1, self.n_actions], initializer=w_initializer, collections=c_names) b2 = tf.get_variable("b2", [1, self.n_actions], initializer=b_initializer, collections=c_names) self.q_evaluate = tf.nn.relu(tf.matmul(l1, w2) + b2) with tf.variable_scope("loss"): self.loss = tf.reduce_mean(tf.squared_difference(self.q_target, self.q_evaluate)) with tf.variable_scope("train"): self.opt = tf.train.RMSPropOptimizer(self.lr).minimize(self.loss) # build target net self.state_ = tf.placeholder(tf.float32, [None, self.n_features], name="state_") with tf.variable_scope("target_net"): c_names = ["target_net_params", tf.GraphKeys.GLOBAL_VARIABLES] with tf.variable_scope("layer1"): w1 = tf.get_variable("w1", [self.n_features, n_l1], initializer=w_initializer, collections=c_names) b1 = tf.get_variable("b1", [1, n_l1], initializer=b_initializer, collections=c_names) l1 = tf.nn.relu(tf.matmul(self.state_, w1) + b1) with tf.variable_scope("layer2"): w2 = tf.get_variable("w2", [n_l1, self.n_actions], initializer=w_initializer, collections=c_names) b2 = tf.get_variable("b2", [1, self.n_actions], initializer=b_initializer, collections=c_names) self.q_next = tf.nn.relu(tf.matmul(l1, w2) + b2) def storeTransition(self, state, action, reward, state_): """Store the state, observation and reward experienced during the train process to enable batch training""" if not hasattr(self, "memory_counter"): self.memory_counter = 0 transition = np.hstack((state, [action, reward], state_)) index = self.memory_counter % self.memory_size self.memory[index, :] = transition self.memory_counter += 1 def chooseAction(self, observation): """Choose action with state and observation""" observation = observation[np.newaxis, :] if np.random.uniform() < self.epsilon: actions = self.sess.run(self.q_evaluate, feed_dict={self.state: observation}) action = np.argmax(actions) else: action = np.random.randint(0, self.n_actions) return action def updateTargetNet(self): """Update the target net with the latest evaluate net parameters""" evaluate_params = tf.get_collection("evaluate_net_params") target_params = tf.get_collection("target_net_params") self.sess.run([tf.assign(t, e) for t, e in zip(target_params, evaluate_params)]) def learn(self): # check to update target net if self.learn_step_counter % self.update_target_iter == 0: self.updateTargetNet() print("Update target net!") # Get batch training data from the memory if self.memory_counter > self.memory_size: sample_index = np.random.choice(self.memory_size, size=self.batch_size) else: sample_index = np.random.choice(self.memory_counter, size=self.batch_size) batch_memory = self.memory[sample_index, :] q_evaluate, q_next = self.sess.run([self.q_evaluate, self.q_next], feed_dict={self.state: batch_memory[:, 0:self.n_features], self.state_: batch_memory[:, -self.n_features:]}) q_target = q_evaluate.copy() batch_index = np.arange(self.batch_size, dtype=np.int32) eval_act_index = batch_memory[:, self.n_features].astype(int) reward = batch_memory[:, self.n_features + 1] # Related to memory format, here means [action, reward] q_target[batch_index, eval_act_index] = reward + self.gamma * np.max(q_next, axis=1) _, cost = self.sess.run([self.opt, self.loss], feed_dict={self.state: batch_memory[:, 0:self.n_features], self.q_target: q_target }) self.cost.append(cost) self.epsilon = self.epsilon + self.epsilon_increment if self.epsilon < self.epsilon_max else self.epsilon_max self.learn_step_counter += 1 def showCost(self): import matplotlib.pyplot as plt plt.plot(np.arange(len(self.cost)), self.cost) plt.ylabel("Cost") plt.xlabel("training steps") plt.show()
二 Policy-Based
直接輸出動作,可以在連續區間內選擇動作;而Value-Based要在連續區間中,對無數個動作計算價值選擇行為是不可行的。
誤差如何反向傳遞呢?沒有誤差,它的目的是選的動作在下次更有可能被選擇,但怎么知道動作的好壞呢,用reward,reward小,動作在下次被選擇的可能性增加的少。
Actor-Critic
Actor:Policy-Based,輸入State,預測輸出采取各種Action的概率。 Critic;Value-Based,輸入State,預測輸出當前State的Value,并與下一狀態的next_stateValue求TD_error 在Actor-Critic中,Actor可以每一步都更新學習(而單純的Policy-Based方法要在回合結束后才能更新)
但也帶來了問題:由于兩個網絡在連續狀態中更新參數,每次跟新前后的參數具有相關性,導致網絡只能片面的看待問題,甚至學不到有效的參數,不能收斂。
TRPO
PPO
Deep Deterministic Policy Gradient(DDPG)
標簽:
相關推薦:
精彩放送:
- []如何查看.dat文件內容?dat文件是什么意思?
- []熱門看點:NCBI-BLAST在線使用教程詳細攻略(圖解)
- []每日關注!標準股份:截至2023年2月28日,公司股東人數約為2.36萬戶
- []金科回復深交所關注函:約4.8億股份將被司法拍賣,不會導致公司實控人發生變化
- []天天最新:什么是二叉樹的遍歷?二叉樹的遍歷順序規則是什么?
- []linux中Gy模式什么意思?一文讀懂重要極端微生物的生理特點
- []環球視訊!卸載MySQL重新安裝:安裝失敗解決方法
- []環球即時看!【企業版】Mule3的新增特點-云連接
- []中科江南:有關內容請參考之前的敬請廣大投資者理性投資,注意風險
- []外媒:英國房價出現10多年來最大跌幅
- []旭輝、中駿擬分別以14億、25億元整棟出售上海虹橋辦公樓
- []微頭條丨【RL】算法簡介與實現 Value-Based-Learning算法
- []世界報道:免費小巧的分屏軟件 支持win7和win8系統
- []世界頭條:天威視訊:公司的深汕威視數據中心一期、清湖云中心機房項目正在建設過程中尚未投產
- []對數的計算公式是什么?對數的計算公式性質及推導過程
- []美的置業2023前兩月合同銷售額150.2億元
- []文旅局長“出圈”,爆紅之后如何長紅?
- []M8宗師入圍CCTV·《中國汽車風云盛典》
- []中國銀河證券:PMI繼續超預期回升 經濟持續向好
- []全球熱門:2022年股市放假安排時間表,股市放假時間一覽
- []增量資金即將注入A股?基金最新研判:強勁復蘇或開啟第二波行情
- []股票假期安排2022,放假時間一覽
- []降準會造成哪些影響,有以下三點影響
- []今日訊!工行如何基金定投
- []銀行十一放假嗎,有的銀行會放假
- []【全球速看料】實探北京新房市場:小陽春提前到來 部分樓盤價格回漲
- []天天熱推薦:武進不銹:很抱歉,公司證券部聯系電話是051988737341,請在工作時間拔打
- []當前速遞!東方鋯業:具體情況敬請關注公司披露的相關公告。公司目前只處于提供樣品供一些電池材料廠家研發的階段
- []生活性消費需求是什么需求?生產性消費需求又是什么需求?有何不同?
- []市場經濟是什么意思?商品經濟概念是什么?
- []什么是消費需求?什么是投資需求?和投資需求有什么不同?
- []索克服務注資500萬元成立科技服務公司 經營范圍含網絡技術服務
- []經濟危機的含義是什么?經濟周期代表了什么?
- []家居丨益森科技啟動上市輔導 注冊資本1.07億元
- []當前焦點!財面兒丨聯發集團發行8.2億元中期票據 利率4.98%
- []世界資訊:百勝中國2022年度收入95.7億美元 錄得4.42億美元凈利潤
- []百龍創園:截至2023年2月28日,公司股東總戶數為7364戶
- []精選!短線高手炒股方法
- []十大正規外匯平臺排行,外匯平臺名單一覽
- []世界動態:如何辦理香港銀行賬戶
- []焦點熱議:看股票漲跌的最簡單的辦法,有以下三個方法
- []焦點速訊:多只權益類基金提前結束募集
- []中國酒店業疫后復蘇猜想:魔鬼都在細節里
- []世界熱推薦:中簽可轉債怎么操作
- []科創50指數etf基金怎么買
- []北元申購是什么板塊
- []還唄借錢靠譜嗎 還唄借錢靠不靠譜
- []天天觀熱點:創業板新股上市的漲跌幅限制為
- []創業板注冊制交易新規
- []環球微頭條丨3月2日重點數據和大事件前瞻
- []環球熱點!原油價格為什么會出現負值
- []廣西元強建設項目管理有限公司
- []天天快消息!拋售美國國債是什么意思
- []頭條焦點:股票熔斷什么意思
- []全球今日訊!內外兼修!晶澳科技引領光伏高質量發展
- []天天即時看!稅優識別碼在保單哪里
- []天天速訊:美國印鈔票對世界有什么影響
- []世界看點:公積金怎么自動代扣
- []健康賬戶和個人賬戶的區別
- []全球速訊:高爭民爆:截止2月28日,1.8萬左右
- []2015年世界快樂報告
- []觀熱點:超聲胃鏡和腸鏡可以一起做嗎_胃鏡和腸鏡可以一起做嗎
- []滾動:次級債券是什么意思
- []委比委差什么意思
- []天天看點:郵政儲蓄小額貸款條件,有以下五點
- []全球熱消息:買車按揭是怎么計算的
- []車船稅在哪里繳納
- []全球資訊:興業物聯:將上市所得款項余下未動用部分用于收購拓展
- []天天百事通!昊華能源:2022年歸母凈利潤同比降33.78%
- []今日熱文:衛寧健康:公司醫院客戶的院內數據通常由醫院存儲管理,公司提供相應的技術支持和服務
- []世界訊息:股票kdj線圖怎么看
- []焦點速訊:養老個人繳費比例,是8%
- []世界報道:工商銀行卡余額怎么查詢
- []世界速遞!etf怎么買賣交易
- []2022年中國人民銀行存款利率表,各類型存款利率一覽
- []今日觀點!光的速度_說一說光的速度的簡介
- []世界熱頭條丨盈建科:2月28日公司高管梁博減持公司股份合計2.3萬股
- []堅朗五金:2月28日公司高管趙鍵減持公司股份合計5.04萬股
- []保利發展125億元定增申請獲得上交所受理
- []今日視點:湖北襄陽3.87億元掛牌3.91萬平方米商住地
- []全球熱點評!中泰化學:公司南黃草湖煤礦尚未取得采礦權證
- []先進數通:2月28日公司高管范麗明減持公司股份合計37萬股
- []環球關注:應收賬款的管理有哪些,有以下三點
- []天天資訊:什么是保本基金
- []全球資訊:農業銀行還款日期,在賬單日后的第25天
- []【全球播資訊】建設銀行住房貸款利率表2022最新利率,分以下兩種利率
- []今日熱文:基金定投什么意思
- []熱門看點:超訊通信:2月22日至2月24日公司高管鐘海輝、陳桂臣、鄧國平減持公司股份合計12.92萬股
- []格力地產:重大免稅資產重組交易對方更換財務顧問
- []太辰光:2月28日公司高管張藝明、肖湘杰減持公司股份合計27萬股
- []世界短訊!清研環境:公司目前主營業務暫不涉及數字經濟相關業務
- []當前關注:賽特新材:2月27日至2月28日公司高管汪美蘭減持公司股份合計10.75萬股
- []全球播報:美國加息影響
- []世界熱資訊!巴菲特投資理念
- []銀行卡更換手機號
- []熱門:證券交易所是做什么的 包括以下5點
- []熱門看點:年線是多少日均線
- []班耶華友
- []全球熱點評!河南開封:鼓勵回購存量商品房用作保障性租賃住房
- []東吳證券(香港):房地產正經歷較大邊際變化 擁有市場化外拓和服務邊界拓寬能力的物業公司具備長期投
- B站注冊資本增幅400%至5億 目前由陳睿全資持股
- 光源資本出任獨家財務顧問 沐曦集成電路10億元A輪融資宣告完成
- 巨輪智能2021年上半年營收11.24億元 期內研發費用投入增長19.05%
- 紅棗期貨尾盤拉升大漲近6% 目前紅棗市場總庫存約30萬噸
- 嘉銀金科發布2021年Q2財報 期內凈利潤達1.27億元同比增長208%
- 成都銀行2021上半年凈利33.89億元 期內實現營收同比增長17.27億元
- 汽車之家發布2021年第二季度業績 期內新能源汽車品牌收入增長238%
- 中信銀行上半年實現凈利潤290.31億元 期末不良貸款余額706.82億元
- 光伏概念掀起漲停潮交易價格創新高 全天成交額達1.29億元
- 上半年生物藥大增45% 關鍵財務指標好轉營收賬款持續下降
- 全球簡訊:百強房企2月業績同環比雙增長:保利蟬聯首位,頭部房企領銜迎來“小陽春”
- 天天新動態:成交量超1.5萬套!北京二手房小陽春已至
- 首都在線:公司的對外投資情況,請查閱公司在巨潮資訊網披露的公告
- 河南:住房公積金發放貸款時限壓縮至20個工作日
- 焦點快播:麗臣實業:公司目前正在按計劃有序推進通過電商平臺進行日化產品的銷售業務
- 新股怎么買
- 2022-2023上海育兒假期新規多少天?2023年上海育兒假必須連續休嗎?
- 環球熱消息:新股上市首日漲幅限制
- 每日快訊!地方債是什么
- 查保險到期怎么查,有以下六種方法
- p2p理財公司排名,十大p2p理財公司一覽
- 當前短訊!順發恒業減持回購股份70萬股 所得資金總額為257.34萬元
- 全球速遞!欣賀股份:公司目前暫未收到相關信息
- 當前速訊:凱撒文化:《我開動物園那些年》還沒有上線運營
- 廣宇集團:子公司一石巨鑫為旗下一公司3000萬元貸款提供擔保
- 鼎捷軟件:公司如有相關計劃,將嚴格按照規定及時履行信息披露義務,您請持續關注公司發布的公告
- 鈉電自行車落地!儲能還會遠嗎?
- 當前播報:工信部金壯龍:新能源汽車、光伏產量連續多年保持全球第一
- 環球今頭條!股票7開頭是什么股
- 當前快訊:k寶證書過期怎么更新
- 當前速訊:曾韜:鈉電池需求增量大 2025年全球潛在市場空間或達73GWh
- 天天滾動:股票下跌的原因,有以下五點
- 熱消息:攜手中科海鈉!又一化工巨頭跨界10萬噸電池級碳酸鈉項目
- 邦普循環攜手梅賽德斯-奔馳,開展動力電池閉環回收項目
- 新消息丨巴菲特2000億投資新能源,為何8次減持比亞迪
- 天天新資訊:孚能科技鈉電池獲車企定點!今年上半年啟動量產
- 每日報道:又一新型儲能技術實現新突破!
- 當前要聞:河南新鄉:抓緊布局 大力推廣儲能氫能產業
- 當前動態:互聯網金融什么意思
- 天天簡訊:買保險的注意事項
- 2022年印度新增光伏裝機15GW
- 天天新資訊:佳兆業集團:2023年1-2月合計交付7個項目 共3899套房
- 滾動:今年2月底全港持牌代理人數錄41038人 扭轉連續5個月跌勢
- 全球今亮點!中通國脈:公司將嚴格按照相關法律法規的要求履行信息披露義務;具體情況請以公司公告信息為準
- 萬東醫療:APEXCT是GE醫療推出的基于深度學習算法的CT系統
- 仁恒:2022年利潤為25.79億元 同比降36.24%
- 世界快報:漢嘉設計:目前相關工作正在推進中
- 金健米業:目前,公司主要從事國內糧油業務的生產與銷售,主要產品有大米、食用油、面條、面粉、牛奶等
- 天天微速訊:2022年度全國農村網絡零售額達2.17萬億元 同比增長3.6%
- 企業-TMC-酒店之間價格不透明,到底是誰在作祟?
- 產業化進程加速,固態電池開辟鋰電新未來
- 今日精選:期貨在哪里開戶才正規,期貨公司
- 天天看熱訊:“強政策+市場化參與”雙驅動,美國儲能需求爆發在即
- 播報:為什么開酒店難賺錢
- 當前滾動:通貨膨脹怎么辦
- 天天熱訊:工商銀行五星級客戶是什么意思
- 當前焦點!新股申購技巧
- 股票專業術語
- 大中礦業: 關于總經理辭職及聘任總經理和變更法定代表人的公告
- 天天視訊!河南:個人住房公積金貸款發放時限壓縮至20個工作日內
- 國際油價受益于中國需求前景,OPEC+變政須等待此情形
- 每日資訊:3月1日金橋信息漲停分析:數據要素,智慧政務,web3.0概念熱股
- 全球視訊!3月1日深桑達A漲停分析:數據要素,數字經濟,國產操作系統概念熱股
- 合肥就公積金新政征求意見 多子女家庭最高可貸75萬元
- 全球熱訊:3月1日魅視科技漲停分析:智慧政務,數字經濟,人工智能概念熱股
- 當前視點!揚州金泉:業績高增長背后,戶外用品代工廠還有空間嗎?
- 今亮點!NYMEX原油上看78.97美元
- 每日熱訊!鄭州新型城市基礎設施建設項目初步設計獲批 總投資4.46億元
- 環球微速訊:豫園股份:復地投資質押1600萬股股份予中融國際信托
- 【全球報資訊】山西:2023年將開工改造城鎮老舊小區1855個
- 焦點報道:全世界所有狗狗的種類有哪些?全世界所有狗狗的種類怎么劃分的?
- 從怎么組詞?從組詞有哪些?
- 世界看點:如果還有明天誰寫的?《如果還有明天》的原唱是誰?
- 美國有哪些著名的好葡萄酒?美國著名的好葡萄酒介紹?
- 建設銀行個人貸款需要哪些條件?建行個人貸款條件介紹?
- 海南旅游業人氣旺,酒店餐飲企業盼求職者“火速到崗”
- 觀察:能單獨買重疾險嗎,可以
- 銳步pump籃球鞋怎么樣?銳步pump籃球鞋有哪些優缺點?
- 股指期貨交易時間
- 毛呢大衣怎么清洗?毛呢大衣清洗方法?
- 通訊!吉林市美食有哪些?吉林市美食介紹?
- 農商銀行貸款要什么條件,有以下7種條件
- 食人魚的天敵是什么?食人魚的天敵有哪些?
- 【全球新視野】主角變成僵尸的小說有哪些?推薦幾部主角變成僵尸的小說
- 黃金會掉價嗎,可能會
- 世界球精選!旭輝集團:2023年1-2月在全國交付近萬套新房
- 天天熱點評!香港法院將佳源國際清盤呈請聆訊押后至3月6日
- 力盛體育:請見公司上一條互動易相關問題的
- 全球實時:百度集團午后一度漲近8% ChatGPT項目文心一言于3月16日正式發布
- 【世界速看料】中鐵置業2023年度第一期中票注冊報告狀態更新為“反饋中” 注冊金額60億
- 全球訊息:張家港行:截至2月28日,公司股東戶數為59660戶
- 焦點日報:廈門國貿6億元公司債決定不行使續期選擇權 將于4月13日兌付
- 世紀華通:請關注公司披露的信息;公司將于2023年4月29日披露《2022年年報》
- 環球速看:頂格申購是什么意思? 啥叫頂格申購
- 2011年房貸利率是多少
- 1.42-1.432/Wh,河南大唐內黃100MW風電項目儲能系統開標
- 聚焦:績優股是什么意思
- 【全球新視野】森林防火小知識完整版_森林防火小知識
- 信用卡透支額度,是先消費后還款的授信額度
- 世界最新:86MW/170MWh!國能打捆采購儲能系統項目公開招標!
- 周末酒店房價翻番,水果撈日售百余杯“不成問題”,柳州最近有多火?
- 熱點聚焦:pos機刷卡手續費標準,不同銀行和發行機構的標準不同
- 全球熱點評!廣西平陸儲能電站首次參與電網調峰調頻
- 天天熱訊:文旅局長圈粉80萬之后,塔河的考驗剛剛開始
- 478萬元!泓慧能源預中標華電光伏項目飛輪儲能系統
- 鋰價明年真能回到20萬元?鋰都宜春停產整頓是否會影響鋰價回落?
- 時訊:美原油交易策略:中國數據提振需求預期,油價短線偏向多頭
- 世界快看點丨無錫城建:審計機構將變更為公證天業會計師事務所
- 環球今熱點:雄安新區:執行"認房不認貸" 首套房5年以上公積金貸款利率為3.1%
- 全球快消息!英皇文化產業租賃深業上城(南區)一期2層商鋪 用于戲院營運及相關業務