繽智、XR-V都顫抖!這款1.5T小鋼炮SUV來到有多強?_包裝設計

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

XX-18。XX萬之間,屆時以下車型將會是其最大競爭對手:繽智(XRV)新車指導價:12。88-18。98萬2014年10月25日上市的廣汽本田繽智,已經上市銷售了兩年,目前還在以每個月1萬5千台銷量持續在買。雖然1。5T/1。8L這種組合在目前來看依然主流,但以推動1。

前言

馬自達靠家轎、MpV多款車型佔據市場的場面,但最近幾年已經還在大賣的車型已經變得越來越少了,隨着CX-4以及昂克賽拉的改款,以及以下這台即將來臨的CX-3,不僅會讓馬自達變得好轉,而且會讓目前沉悶的小型SUV市場更加活躍起來!

CX-3其實是以馬自達2基礎而來,可以說兩者幾乎是同平台產物,所以操控性乃至空間上CX-3都與馬自達2沒什麼區別,關鍵在於CX-3是一款緊湊型SUV,因此馬自達很有可能為其配備1.5T/2.0L兩套動力系統,兩者都為創馳藍天技術的發動機,1.5T應該是基於柴油發動機,最大105匹馬力,而2.0升自吸車型則有望配備156匹馬力。當然還有目前在阿特茲上基於發動機和底盤整合控制的GVC系統(G-Vectoring Control)。

外觀將繼續沿用目前家族化的前臉–魂動設計,除了必須有的魂動紅之外,還將新增有鋼鐵灰、雲母藍和躍雪白三種車身顏色。同時還會在高配車型上配備LED大燈以及215/50的18寸輪轂,

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

並將會加大塞入隔音棉以利於NVH隔音提升車身安靜度。(現款昂克賽拉以及阿特茲都比同級車型有更多道路信息)

其他配置方面,將會配備能自動剎停的主動防護系統。根據目前CX-5的16.98-24.58萬以及CX-4的14.08-21.58萬價格區間,CX-3很有可能會定位在12.XX-18.XX萬之間,屆時以下車型將會是其最大競爭對手:

繽智(XRV)

新車指導價:12.88-18.98萬

2014年10月25日上市的廣汽本田繽智,已經上市銷售了兩年,目前還在以每個月1萬5千台銷量持續在買。雖然1.5T/1.8L這種組合在目前來看依然主流,但以推動1.2噸-1.39噸的車身來說在後半段加速時確實有些力不從心,對於一向追求黑科技的本田來說,更新確實迫在眉睫。

北京現代ix25

新車指導價:11.98-18.68萬

ix25上市之初確實成為一道亮麗的小鮮肉,特別是都金秀賢的代言讓其一下子就其紅火起來,不過一樣是2014年10月10日上市的ix25目前月銷量僅有7700多以及大幅落後於XRV了更別說繽智。雖然2016款新增了兩台160匹馬力的1.6T車型,不過也難力挽狂瀾,最大原因是售價稍高的緣故吧。

今年6月21日上市的馬自達CX-4,未曾上市就受到了多方追捧,可惜4個月過去了,累計銷量僅2萬1千台,雖然同比馬自達CX-5月銷量上升了1000多,可是比起目前已經存在的緊湊SUV廣闊市場來說還是力量薄弱,CX-3其實已經在日本、台灣局部地區開始銷售了,但並非是全球車型,馬自達的自閉症啥時候才能治呢?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

這台車看起來值30多萬 “國產路虎攬勝”竟只賣10萬?_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

內飾相比霸氣時尚的前臉,內飾就相對有些落後了,中控面板很不和諧,像是加裝的感覺,好在在配色上面黑橙雙色的設計還是挺吸引眼球的,全系標配無鑰匙啟動但是沒有無鑰匙進入系統,還有車身穩定系統全系都沒有,另外胎壓監測、倒車影像、自動空調等配置還是很實用的。

相信不少消費者對卡威這個品牌並不熟悉,它旗下第一款車卡威K1是個皮卡,在2014年的時候就有了年銷量過萬輛的成績,當然啦在中國它的熱度當然是比不過SUV的,所以推出了旗下第二款車型-卡威W1,它的售價為9.48-10.33萬,採用非承載式車身這是主打越野的節奏嗎?一起來看一下吧!

外觀

喲喲喲,這前臉看上去怎麼那麼熟悉呢,是不是和福特F-150皮卡非常相似呢,看那造型獨特的前大燈,但是細節上面進行了改進,進氣格柵又是另一種風格,充滿了JEEp風格的豎狀格柵,整體輪廓還是蠻相似的,看上去相當霸氣,長*寬*高(mm)為4600*1855*1810mm,在競爭對手中屬於中等水平。

而車身側面和尾部造型與黃海旗勝F1有這很高的相似度,這也難怪因為黃海的配件供應商之前一直是卡威供應的,簡單的線條勾勒出比較飽滿的效果,LED光源的尾燈有些令人意外,

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

雙邊雙出的的排氣管也算和霸氣的前臉相互呼應。

內飾

相比霸氣時尚的前臉,內飾就相對有些落後了,中控面板很不和諧,像是加裝的感覺,好在在配色上面黑橙雙色的設計還是挺吸引眼球的,全系標配無鑰匙啟動但是沒有無鑰匙進入系統,還有車身穩定系統全系都沒有,另外胎壓監測、倒車影像、自動空調等配置還是很實用的。

空間

卡威W1的座椅造型比較普通,但是柔軟性不錯,舒適的良好,2730mm的軸距在同級別來說也算中上水平,後排空間比較寬敞,中間座椅都配備了獨立頭枕,中央扶手箱也沒有缺席,儲物空間日常夠用,不過後備箱開口離地間隙稍高,便利性不好,總的來說中規中矩吧。

動力

動力方面該車提供了2.0L(最大功率129馬力)/2.4L汽油發動機(最大功率143馬力),最大扭矩轉速在2500轉,分別為175牛米和200牛米,搭配5擋手動變速器,相對於競爭對手來說差距不少,懸挂則採用前雙橫臂后五連桿整體橋式結構,加上非承載式車身,越野能力是否出色咋們拭目以待。

總結:外觀模仿痕迹還是較為明顯,霸氣威猛的外觀還是挺符合當下審美觀,內飾造型用料稍微遜色很多,但門板皮革包裹等細節做得很細心,動力上的不足應該是迫在眉睫的問題。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

10萬內品質好、操控性強的合資三廂車這幾款真不錯_台中搬家公司

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」


6L 110馬力和1。4T 131馬力,匹配5擋手動、6擋自動和7擋雙離合變速箱。
大家買桑塔納就是奔著老桑塔納耐操的口碑去的,雖然現在的桑塔納跟之前的老普桑沒有關係,但是由於車子的製造工藝較為簡單,配置也比較少,所以質量也還是槓槓的。

身邊的很多朋友諮詢我買車的時候都在強調車子的質量一定要好,最好可以開到報廢,畢竟老百姓賺錢不容易啊,所以今天就給大家推薦幾款質量過硬的車子,雖然低配的配置不高,但是質量還是很好的。

東風標緻-標緻301

標緻301的車身尺寸為4442*1748*1476mm,軸距為2652mm。前臉和側身的腰線處理的很好,所以很好看,畢竟法國人還是比較擅長設計的。

301的動力系統為1.6L 102馬力+5擋手動,1.6L 117馬力+5擋手動/6擋手自一體變速箱。301的外觀比較好看,後排空間空間也夠大,車身鈑金很厚,底盤也比較緊緻,行駛質感很不錯。但是301後排中間頭部空間太小了,和桑塔納一樣,配置真的不高,

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

不過這個價位貌似除了國產車,合資車的配置都是很低的。同時301還有減配的嫌疑,低配的後排頭枕都簡配了。但是說起質量301還是很耐操的。

上汽大眾-桑塔納

桑塔納的車身尺寸為4473*1706*1469mm、4475*1706*1469mm、4282*1706*1475mm,軸距為2603mm。雖然是大眾體系中定位最低的車型,但是桑塔納依然採用大眾家族式的設計。

桑塔納的發動機有1.4L 90馬力、1.6L 110馬力和1.4T 131馬力,匹配5擋手動、6擋自動和7擋雙離合變速箱。大家買桑塔納就是奔着老桑塔納耐操的口碑去的,雖然現在的桑塔納跟之前的老普桑沒有關係,但是由於車子的製造工藝較為簡單,配置也比較少,所以質量也還是杠杠的。從桑塔納的銷量就可以看出來,國人對它還是非常信任的。

上汽通用雪佛蘭-科魯茲

2017款科魯茲的4666*1807*1460mm,軸距為2700mm,最新款的科魯茲造型比較立體,前低后高的造型呈現出一種俯衝的運動感。但是我們更推薦的優惠幅度更大的老款科魯茲。

由於科魯茲是新款老款同堂銷售,所以動力系統很繁瑣。發動機為1.5L 113馬力、1.5L 114馬力、1.6L 121馬力、1.4T 150馬力和1.6T 184馬力,匹配5擋手動、6擋手自一體和7擋雙離合變速箱。老科魯茲的車型較老,配置很低,但是車型卻很耐看,另外用料也很實在,質量也很好,價格很實惠,底盤紮實,想買還是可以的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

Caviar 推出奢侈黄金版 AirPods Max 、PlayStation 5 ,前者要價 300 萬元起_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

月初我們才剛分享過 CAVIAR 這間來自俄羅斯的客製化品牌的 iPhone 12 Pro 鈦合金潛行款,隨著今年下半年兩款別具話題的產品 AirPods Max 與 PlayStation 5(PS5)開賣後, CAVIAR 這次也將腦筋動到了這兩款產品上。
一如既往, CAVIAR 選用了黃金和鱷魚皮作為客製化版本的材質,當然價格也不是一般消費者能負擔得起的程度,光是相對便宜的黃金版 AirPods Max 就要價約 300 萬元新台幣。

Caviar 推出奢侈黄金版 AirPods Max 、PlayStation 5 ,前者要價 300 萬元起

Caviar 近期宣布將於 2021 年推出度有純金的 AirPods Max ,售價高達 108,000 美元(約合新台幣 304.2 萬元)。據悉這款 AirPods Max 黃金版的耳罩部分將原本的鋁金屬材質改為 18K 金打造,頭帶部分則以鱷魚皮材質取代原本的網狀材質。

CAVIAR 將推出掰色和黑色兩種顏色的鱷魚皮搭配以黃金為主體的 AirPods Max 。雖然 CAVIAR 官方未公布黃金版本的 AirPods Max 機身重量有多重,不過回顧已經不算輕盈的標準版 AirPods Max  重量就有 384.8 公克,黃金版本的重量肯定沈重不少。

耳罩部分包括控制按鈕和旋鈕都以鍍金處理,更提升了整體的奢華感:

價格方面, AirPods Max 黃金版建議售價為 108,000 美元(約合新台幣 304.2 萬元),大約可等同 164 組標準版 AirPods Max 的價位。

與 AirPods Max 建議售價相當的 PlayStation 5 ,也同樣在 CAVIAR 這次黃金版客製化的名單中,黃金版 PS5 一樣採用 18K 黃金材質打造,總共使用了大約 20 公斤的黃金:

與以往 CAVIAR 客製化產品相同, PS5 黃金版主要在外殼上進行重新設計,不僅在機身換上兩塊 3D 打造的 18K 純金實心外殼:

CAVIAR 設計師表示這款 Golden Rock 的 PS5 靈感源自於金礦石的獨特幾何形狀和優美優美的岩石輪廓:

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

除此之外,在 Dual Sense 遊戲控制器除了黃金還有加入鱷魚皮等材質:

PS5 黃金版目前 CAVIAR 尚未公開價格,不過光是以黃金價格來估算就能推測他價格將非常驚人。

圖片/消息來源:CAVIAR

延伸閱讀:
iOS 應用小技巧:自動停止播放影片/音樂,睡前喜愛滑手機的人都必學!

Caviar 發表 iPhone 12 Pro 鈦合金「潛行款」,取消所有相機還加三倍價賣

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

340 萬台,據報 PS5 破 PlayStation 首月出貨最高紀錄_貨運

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

雖然距離前代 PlayStation 4 突破億台的銷量還有很長一段路要走,不過身為 2020 年 Sony 端出的最強次世代主機,PlayStation 5 還是以各種開箱攻佔了各大媒體與社群平台的熱門話題。現在據報也已經以首四週 340 萬台的好銷售達到破紀錄的銷售成績。繼續閱讀 340 萬台,據報 PS5 破 PlayStation 首月出貨最高紀錄報導內文。

340 萬台,據報 PS5 破 PlayStation 首月出貨最高紀錄

缺貨到讓人又愛又恨的 PlayStation 5,很多也好奇到底這次的銷量成績與同樣都受到極高歡迎的先前幾代有沒有更強的銷售力道?是說,儘管在極度缺貨的日本,銷量表現似乎有所抑制(但我們還是搶先開箱日本版的 PlayStation 5 了)不過 Sony 這台次世代遊戲主機的全球銷量部分,現在已經從 Digitimes 關於出貨量的報導裡,間接揭露了 PlayStation 5 全球首四週的銷量,已直破以往自家主機的紀錄,來到 340 萬台的好成績。

是說,這篇報導主要劃的重點是在於緊接著在 2021 年初,得益於產線的改進年產量預估可達 1,680 萬至 1,800 萬台;1 月起將預留供貨給等得焦急的亞洲消費者(太好惹)。但對於 Sony 來說,這銷量相較於以往大受歡迎的 PS4(2018 年 8 月開賣至 12 月初,達到 210 萬台)應該真的讓他們有點措手不及吧,必須馬上修正提供更高的產量對應。

必須說,看來在這全人類都因為疫情悶得發慌的年代裡, PlayStation 5 出現的時間點也算是剛好對應了許多人居家娛樂的需求。

引用來源

延伸閱讀:

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

PlayStation 5 第一手搶先開箱!絕對是現今最值得入手的遊戲主機

iPhone 12 Pro Max 深度實拍體驗:ProRAW 讓 iPhone 踏入專業

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

AirPods Pro 2 零件現蹤,可能將像 Apple Watch 一樣有雙尺寸?_網頁設計公司

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

看到將蘋果自家耳機產品推上價格「Max」值的 AirPods Max,雖說也不至於貴到遙不可及,甚至也有傳將會有更入門的版本。但就生活使用來講,似乎還是同樣具備主動降噪機能與空間音訊等功能的 AirPods Pro 比較適合自己?看來,蘋果應該也沒打算放掉這個產品系列,現在被發現已經默默在準備新品當中 — 而且這次將可能像旗下智慧型手錶那樣,提供更客製化的尺寸選項(!)。繼續閱讀 AirPods Pro 2 零件現蹤,可能將像 Apple Watch 那樣具備雙尺寸報導內文。

▲圖片來源:Mr·White

AirPods Pro 2 零件現蹤,可能將像 Apple Watch 一樣有雙尺寸?

AirPods 無疑已經是現階對最受歡迎的真無線耳機。而儘管目前看來此系列的產品已經被 AirPods Max 給奪下了最高階的寶座,不過這不代表蘋果沒打算持續精進相對低價且易用的產品系列 — 畢竟市場上的對手也早已開始端出更小尺寸的版本。

▲圖片來源:Apple

從最近在社群網站上由 Mr·White 所貼出的疑似 AirPods Pro 2 零件照看來,蘋果似乎不僅準備帶來新的真無線耳塞耳機還。可能像 Apple Watch 那樣,疑似準備提供兩種不同的尺寸來對應使用者的需求。

雖說還是採用 W2 的晶片,不過根據爆料者的猜測,新世代的 AirPods Pro 很可能會有大小兩種尺寸可供選擇。對照先前媒體報導,新世代 AirPods Pro 很可能移除底部的控制桿造型,帶來僅剩下 Earbuds 耳機本體的新設計。

▲圖片來源:Mr·White

是說,儘管這樣「耳機豆」的設計在其他品牌已經不算少見,但畢竟 AirPods Pro 小小一顆耳機裡面塞入包括動態追蹤、光學感測器、加速度計與力度感測器等,可以配合蘋果生態系帶來有趣功能的硬體配置。所以某種程度來講,能在保有舊有配置更進一步縮小機身體積,甚至加入新功能與帶來不同尺寸的版本,應該也是十分不容易的事。

不過,更小的耳機本體雖然應該會看起來更美型,相應而來的電力與表現是否會有所落差,應該也會是許多人會想關注的重點。總之,畢竟目前也僅有零件洩漏而已,一切就等更多相關消息浮現再來看看有些什麼樣令人驚豔的可能性吧。

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

本篇圖片 / 引用來源

延伸閱讀:

傳明年中 Apple 將推出更便宜的 AirPods Max Sport 運動版,售價 400 美元

340 萬台,據報 PS5 破 PlayStation 首月出貨最高紀錄

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

輕鬆實現記錄與撤銷——C#中的Command模式_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

Command模式屬於行為模式,作為大名鼎鼎的23個設計模式之一,Command模式理解起來不如工廠模式,單例模式等那麼簡單直白。究其原因,行為模式着重於使用,如果沒有編程實踐,確實不如創造模式那麼直白。我們先看看UML類圖。

估計很多同學看着圖就暈了,那麼多東西,Command和Concrete Command還好理解,那些Receiver和Invoker又是什麼東西呢?
 
別著急,只要理解了一點,這個模式就很容易理解了,下面划重點,Command模式最主要的特點,是將命令封裝成類,在類中保存命令執行的上下文(即該命令執行的參數,執行的對象),以實現命令執行對象和命令發出對象的解耦
 
這樣一來是不是覺得好理解多了?Command類裏面的Receiver,就是命令具體執行的對象。這裏的Client可以理解為裝配環境,在這裏面代碼實例化Command。Invoker內部保存命令(可以保存多條命令,實現命令記錄查看,撤銷等),客戶端代碼通過Invoker來操作命令。接下來我們看看示例代碼。

 

定義Command接口

首先我們定義一個支持撤銷的Command接口。

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

    interface Command
    {
        void Execute();
        void Undo();
    }

定義Receiver

接下來我們定義Receiver,也就是命令的執行對象,這裏我們定義一個Ball類。

    class Ball
    {
        public int Size { get; set; } = 10;
        public string Name { get; set; } = "My First Ball";
        public void Inspect()
        {
            Console.WriteLine("My Name is {0} and size is {1}", Name, Size);
        }
    }

定義具體命令

這裏定義兩個命令,一個修改名字,一個修改大小。

    class ChangeNameCommand : Command
    {
        private Ball _Ball;
        private string _OldName;
        public string NameYouWant { get; set; }
        public ChangeNameCommand(Ball ball)
        {
            _Ball = ball;
        }

        public void Execute()
        {
            _OldName = _Ball.Name;
            _Ball.Name = NameYouWant;
        }

        public void Undo()
        {
            _Ball.Name = _OldName;
        }
    }
    
	class ChangeSizeCommand : Command
	{
	//代碼大同小異,略
	}

定義Invoker

接下來是Invoker,,也就是存儲命令,並最終會被用戶代碼調用的類,這裏我們叫它CommandManager。

    class CommandManager
    {
        private Stack<Command> commands = new Stack<Command>();

        public void RunCommand(Command command)
        {
            command.Execute();
            commands.Push(command);
        }

        public void Undo()
        {
            if (commands.Count > 0)
            {
                var command = commands.Pop();
                command.Undo();
            }
        }
        
		public void ShowCommands()
        {
            var temp = commands.Reverse();
            foreach(var command in temp)
            {
                //display command
            }
        }
    }

使用命令

現在我們看看客戶端代碼是怎麼使用他們的,定義Ball,定義命令,通過CommandManager去調用,這樣可以方便查看命令記錄,撤銷命令,等。

        static void Main(string[] args)
        {
            Ball ball = new Ball();
            ball.Inspect();

            ChangeNameCommand changeName = new ChangeNameCommand(ball) { NameYouWant = "Changed" };
            ChangeSizeCommand changeSize = new ChangeSizeCommand(ball) { SizeYouWant = 20 };

            CommandManager manager = new CommandManager();
            manager.RunCommand(changeName);
            manager.RunCommand(changeSize);
            ball.Inspect();

			manager.ShowCommands();
            
            manager.Undo();
            ball.Inspect();

            manager.Undo();
            ball.Inspect();            
        }

就醬,我們已經實現了命令模式,並且還支持命令的記錄與撤銷,希望能對大家有點幫助。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

DQN(Deep Q-learning)入門教程(六)之DQN Play Flappy-bird ,MountainCar_台北網頁設計

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

在DQN(Deep Q-learning)入門教程(四)之Q-learning Play Flappy Bird中,我們使用q-learning算法去對Flappy Bird進行強化學習,而在這篇博客中我們將使用神經網絡模型來代替Q-table,關於DQN的介紹,可以參考我前一篇博客:DQN(Deep Q-learning)入門教程(五)之DQN介紹

在這篇博客中將使用DQN做如下操作:

  • Flappy Bird
  • MountainCar-v0

再回顧一下DQN的算法流程:

項目地址:Github

MountainCar-v0

MountainCar的訓練好的Gif示意圖如下所示,汽車起始位置位於山的底部,最終目標是駛向右邊山的插旗的地方,其中,汽車的引擎不能夠直接駛向終點,必須藉助左邊的山體的重力加速度才能夠駛向終點。

MountainCar-v0由OpenAI提供,python包為gym,官網網站為https://gym.openai.com/envs/MountainCar-v0/。在Gym包中,提供了很多可以用於強化學習的環境(env):

在MountainCar-v0中,狀態有2個變量,car position(汽車的位置),car vel(汽車的速度),action一共有3種 Accelerate to the Left Don't accelerateAccelerate to the Right,然後當車達到旗幟的地方(position = 0.5)會得到\(reward = 1\)的獎勵,如果沒有達到則為\(-1\)。但是如果當你運行步驟超過200次的時候,遊戲就會結束。詳情可以參考源代碼(ps:官方文檔中沒有這些說明)。

下面介紹一下gym中幾個常用的函數:

  • env = gym.make("MountainCar-v0")
    

    這個就是創建一個MountainCar-v0的遊戲環境。

  • state = env.reset()
    

    重置環境,返回重置后的state

  • env.render()
    

    將運行畫面展示在屏幕上面,當我們在訓練的時候可以不使用這個來提升速度。

  • next_state, reward, done, _ = env.step(action)
    

    執行action動作,返回下一個狀態,獎勵,是否完成,info。

初始化Agent

初始化Agent直接使用代碼說明吧,這個還是比較簡單的:

import keras
import random
from collections import deque

import gym
import numpy as np
from keras.layers import Dense
from keras.models import Sequential


class Agent():
    def __init__(self, action_set, observation_space):
        """
        初始化
        :param action_set: 動作集合
        :param observation_space: 環境屬性,我們需要使用它得到state的shape
        """
        # 獎勵衰減
        self.gamma = 1.0
        # 從經驗池中取出數據的數量
        self.batch_size = 50
        # 經驗池
        self.memory = deque(maxlen=2000000)
        # 探索率
        self.greedy = 1.0
        # 動作集合
        self.action_set = action_set
        # 環境的屬性
        self.observation_space = observation_space
        # 神經網路模型
        self.model = self.init_netWork()

    def init_netWork(self):
        """
        構建模型
        :return: 模型
        """
        model = Sequential()
        # self.observation_space.shape[0],state的變量的數量
        model.add(Dense(64 * 4, activation="tanh", input_dim=self.observation_space.shape[0]))
        model.add(Dense(64 * 4, activation="tanh"))
        # self.action_set.n 動作的數量
        model.add(Dense(self.action_set.n, activation="linear"))
        model.compile(loss=keras.losses.mean_squared_error,
                      optimizer=keras.optimizers.RMSprop(lr=0.001))
        return model

我們使用隊列來保存經驗,這樣的話新的數據就會覆蓋遠古的數據。此時我們定義一個函數,專門用來將數據保存到經驗池中,然後定義一個函數用來更新\(\epsilon\)探索率。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

def add_memory(self, sample):
    self.memory.append(sample)

def update_greedy(self):
    # 小於最小探索率的時候就不進行更新了。
    if self.greedy > 0.01:
        self.greedy *= 0.995

訓練模型

首先先看代碼:

def train_model(self):
    # 從經驗池中隨機選擇部分數據
    train_sample = random.sample(self.memory, k=self.batch_size)

    train_states = []
    next_states = []
    for sample in train_sample:
        cur_state, action, r, next_state, done = sample
        next_states.append(next_state)
        train_states.append(cur_state)

    # 轉成np數組
    next_states = np.array(next_states)
    train_states = np.array(train_states)
    # 得到next_state的q值
    next_states_q = self.model.predict(next_states)

    # 得到state的預測值
    state_q = self.model.predict_on_batch(train_states)

    # 計算Q現實
    for index, sample in enumerate(train_sample):
        cur_state, action, r, next_state, done = sample
        if not done:
            state_q[index][action] = r + self.gamma * np.max(next_states_q[index])
        else:
            state_q[index][action] = r
    
    self.model.train_on_batch(train_states, state_q)

大家肯定從上面的代碼發現一些問題,使用了兩個for循環,why?首先先說一下兩個for循環分別的作用:

  • 第一個for循環:得到train_statesnext_states,其中next_states是為了計算Q現實。
  • 第二個for循環:計算Q現實

可能有人會有一個疑問,為什麼我不寫成一個for循環呢?實際上寫成一個for循環是完全沒有問題的,很,但是寫成一個for循環意味着我們要多次調用model.predict_on_batch,這樣會耗費一定的時間(親身試驗過,這樣會比較慢),因此,我們寫成了兩個for循環,然後只需要調用一次predict

執行動作與選擇最佳動作

執行動作的代碼如下所示:

def act(self, env, action):
    """
    執行動作
    :param env: 執行環境
    :param action: 執行的動作
    :return: ext_state, reward, done
    """
    next_state, reward, done, _ = env.step(action)

    if done:
        if reward < 0:
            reward = -100
        else:
            reward = 10
    else:
        if next_state[0] >= 0.4:
            reward += 1

    return next_state, reward, done

其中,我們可以修改獎勵以加快網絡收斂。

選擇最好的動作的動作如下所示,會以一定的探索率隨機選擇動作。

def get_best_action(self, state):
    if random.random() < self.greedy:
        return self.action_set.sample()
    else:
        return np.argmax(self.model.predict(state.reshape(-1, 2)))

開始訓練

關於具體的解釋,在註釋中已經詳細的說明了:

if __name__ == "__main__":
    # 訓練次數
    episodes = 10000
    # 實例化遊戲環境
    env = gym.make("MountainCar-v0")
    # 實例化Agent
    agent = Agent(env.action_space, env.observation_space)
    # 遊戲中動作執行的次數(最大為200)
    counts = deque(maxlen=10)

    for episode in range(episodes):
        count = 0
        # 重置遊戲
        state = env.reset()

        # 剛開始不立即更新探索率
        if episode >= 5:
            agent.update_greedy()

        while True:
            count += 1
            # 獲得最佳動作
            action = agent.get_best_action(state)
            next_state, reward, done = agent.act(env, action)
            agent.add_memory((state, action, reward, next_state, done))
            # 剛開始不立即訓練模型,先填充經驗池
            if episode >= 5:
                agent.train_model()
            state = next_state
            if done:
                # 將執行的次數添加到counts中
                counts.append(count)
                print("在{}輪中,agent執行了{}次".format(episode + 1, count))

                # 如果近10次,動作執行的平均次數少於160,則保存模型並退出
                if len(counts) == 10 and np.mean(counts) < 160:
                    agent.model.save("car_model.h5")
                    exit(0)
                break

訓練一定的次數后,我們就可以得到模型了。然後進行測試。

模型測試

測試的代碼沒什麼好說的,如下所示:

import gym
from keras.models import load_model
import numpy as np
model = load_model("car_model.h5")

env = gym.make("MountainCar-v0")

for i in range(100):
    state = env.reset()
    count = 0
    while True:
        env.render()
        count += 1
        action = np.argmax(model.predict(state.reshape(-1, 2)))
        next_state, reward, done, _ = env.step(action)
        state = next_state
        if done:
            print("遊戲的次數:", count)
            break

部分的結果如下:

Flappy Bird

FlappyBird的代碼我就不過多贅述了,裏面的一些函數介紹可以參照這個來看:DQN(Deep Q-learning)入門教程(四)之Q-learning Play Flappy Bird,代碼思想與訓練Mountain-Car基本是一致的。

import random
from collections import deque

import keras
import numpy as np
from keras.layers import Dense
from keras.models import Sequential
from ple import PLE
from ple.games import FlappyBird


class Agent():
    def __init__(self, action_set):
        self.gamma = 1
        self.model = self.init_netWork()
        self.batch_size = 128
        self.memory = deque(maxlen=2000000)
        self.greedy = 1
        self.action_set = action_set

    def get_state(self, state):
        """
        提取遊戲state中我們需要的數據
        :param state: 遊戲state
        :return: 返回提取好的數據
        """
        return_state = np.zeros((3,))
        dist_to_pipe_horz = state["next_pipe_dist_to_player"]
        dist_to_pipe_bottom = state["player_y"] - state["next_pipe_top_y"]
        velocity = state['player_vel']
        return_state[0] = dist_to_pipe_horz
        return_state[1] = dist_to_pipe_bottom
        return_state[2] = velocity
        return return_state

    def init_netWork(self):
        """
        構建模型
        :return:
        """
        model = Sequential()
        model.add(Dense(64 * 4, activation="tanh", input_shape=(3,)))
        model.add(Dense(64 * 4, activation="tanh"))
        model.add(Dense(2, activation="linear"))

        model.compile(loss=keras.losses.mean_squared_error,
                      optimizer=keras.optimizers.RMSprop(lr=0.001))
        return model

    def train_model(self):
        if len(self.memory) < 2500:
            return

        train_sample = random.sample(self.memory, k=self.batch_size)
        train_states = []
        next_states = []

        for sample in train_sample:
            cur_state, action, r, next_state, done = sample
            next_states.append(next_state)
            train_states.append(cur_state)
        # 轉成np數組
        next_states = np.array(next_states)
        train_states = np.array(train_states)

        # 得到下一個state的q值
        next_states_q = self.model.predict(next_states)
        # 得到預測值
        state_q = self.model.predict_on_batch(train_states)

        for index, sample in enumerate(train_sample):
            cur_state, action, r, next_state, done = sample
            # 計算Q現實
            if not done:
                state_q[index][action] = r + self.gamma * np.max(next_states_q[index])
            else:
                state_q[index][action] = r
        self.model.train_on_batch(train_states, state_q)

    def add_memory(self, sample):
        self.memory.append(sample)

    def update_greedy(self):
        if self.greedy > 0.01:
            self.greedy *= 0.995

    def get_best_action(self, state):
        if random.random() < self.greedy:
            return random.randint(0, 1)
        else:
            return np.argmax(self.model.predict(state.reshape(-1, 3)))

    def act(self, p, action):
        """
        執行動作
        :param p: 通過p來向遊戲發出動作命令
        :param action: 動作
        :return: 獎勵
        """
        r = p.act(self.action_set[action])
        if r == 0:
            r = 1
        if r == 1:
            r = 100
        else:
            r = -1000
        return r


if __name__ == "__main__":
    # 訓練次數
    episodes = 20000
    # 實例化遊戲對象
    game = FlappyBird()
    # 類似遊戲的一個接口,可以為我們提供一些功能
    p = PLE(game, fps=30, display_screen=False)
    # 初始化
    p.init()
    # 實例化Agent,將動作集傳進去
    agent = Agent(p.getActionSet())
    max_score = 0
    scores = deque(maxlen=10)

    for episode in range(episodes):
        # 重置遊戲
        p.reset_game()
        # 獲得狀態
        state = agent.get_state(game.getGameState())
        if episode > 150:
            agent.update_greedy()
        while True:
            # 獲得最佳動作
            action = agent.get_best_action(state)
            # 然後執行動作獲得獎勵
            reward = agent.act(p, action)
            # 獲得執行動作之後的狀態
            next_state = agent.get_state(game.getGameState())
            agent.add_memory((state, action, reward, next_state, p.game_over()))
            agent.train_model()
            state = next_state
            if p.game_over():
                # 獲得當前分數
                current_score = p.score()
                max_score = max(max_score, current_score)
                scores.append(current_score)
                print('第%s次遊戲,得分為: %s,最大得分為: %s' % (episode, current_score, max_score))
                if len(scores) == 10 and np.mean(scores) > 150:
                    agent.model.save("bird_model.h5")
                    exit(0)
                break

該部分相比較於Mountain-Car需要更長的時間,目前的我還沒有訓練出比較好的效果,截至寫完這篇博客,最新的數據如下所示:

emm,我又不想讓我的電腦一直開着,。

總結

上面的兩個例子便是DQN最基本最基本的使用,我們還可以將上面的FlappyBird的問題稍微複雜化一點,比如說我們無法直接的知道環境的狀態,我們則可以使用CNN網絡去從遊戲圖片入手(關於這種做法,網絡上有很多人寫了相對應的博客)。

項目地址:Github

參考

  • openai-gym
  • MountainCar-v0 ——src code
  • DQN(Deep Q-learning)入門教程(四)之Q-learning Play Flappy Bird

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

UWP開發入門(25)——通過Radio控制Bluetooth, WiFi_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

回顧寫了許久的UWP開發入門,竟然沒有講過通過Windows.Devices.Radios.Radio來控制Bluetooth和WiFi等功能的開關。也許是因為相關的API設計的簡單好用,以至於被我給忽略了。最近工作中有涉及這塊的內容,不妨一起來回顧下,順便看看一些新的發現。

在Windows 10以前,想要控制Bluetooth,WiFi等功能,那麻煩大了。得操作ManagementBaseObject,ManagementEventWatcher 等一系列WMI提供的API,寫出來的代碼又臭又長。其間還夾着複雜的WMI query字符串,十分難用。

升級到Windows 10后,我們通過Windows.Devices.Radios.Radio可以方便的獲取控制Bluetooth和WiFi的對象。

var radios = await Radio.GetRadiosAsync();
Bluetooth = radios.FirstOrDefault(r => r.Kind == RadioKind.Bluetooth);
WiFi = radios.FirstOrDefault(r => r.Kind == RadioKind.Bluetooth);

在拿到上面的Bluetooth和WiFi的Radio實例后,就可以通過

Public event TypedEventHandler<Radio, object> StateChanged;

來監聽Radio實例的狀態改變,可以說通過寥寥幾行代碼,就可以替代以往大量繁瑣的操作。

而設置Bluetooth和WiFi設備On/Off的狀態,也非常簡單。

public IAsyncOperation<RadioAccessStatus> SetStateAsync(RadioState value);

RadioState枚舉如同字面的意思:

    public enum RadioState
    {
        //
        // Summary:
        //     The radio state is unknown, or the radio is in a bad or uncontrollable state.
        Unknown = 0,
        //
        // Summary:
        //     The radio is powered on.
        On = 1,
        //
        // Summary:
        //     The radio is powered off.
        Off = 2,
        //
        // Summary:
        //     The radio is powered off and disabled by the device firmware or a hardware switch
        //     on the device.
        Disabled = 3
    }

這裏需要提一下的是,在第一次更改狀態前,UWP APP需要向用戶申請權限。

慢着慢着,貌似忘記給UWP APP向Windows要權限了,我們要編輯Package.aaxmanifest文件,在Capabilities節點加上DeviceCapability這一行才行。

  <Capabilities>
    <Capability Name="internetClient" />
    <DeviceCapability Name="radios"></DeviceCapability>
  </Capabilities>

 

這回運行起來,才真的可以操作Bluetooth和WiFi了。

是不是覺得幾行代碼就能寫出一個控制Bluetooth和WiFi的APP了?事實也確實如此。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

如果人生只如初見那般美好,UWP的處境就不會如此難堪了。對於某軟提供了完善UWP API的功能,開發起來那是一個爽快。但要是沒有或是沒來得及提供,UWP就顯得頗為尷尬了。

我們不妨看下RadioKind的枚舉,很顯然如果想操作FM radio就得另尋他法。而MobileBoardband即Cellular也是從1703版本才開始得到支持。

那是不是意味這MobileBroadband就可以像Bluetooth和WiFi一樣通過

public static IAsyncOperation<IReadOnlyList<Radio>> GetRadiosAsync();

來獲取實例對象了,還真不是,欲知如何操作,且聽下回《UWP開發入門(26)——通過Radio控制Cellular》。

實際是我Sample code還沒整理好。所以分成了兩篇來寫。

有感日前MS Store里的網易雲音樂UWP也被替換成Win32版本,可嘆國產的UWP APP越來越少。某軟畫了個好餅,可惜不能讓人在Windows生態上通過UWP掙到錢。好技術生不逢時出不了頭,真是可惜。

同時也能感覺到某軟的妥協和進步,現如今的UWP,結合desktop extension以及desktop bridge技術。只要公司的APP能通過某軟的審核,功能方面已經無限接近傳統desktop APP了。可惜一個Windows平台做Win32和UWP兩個產品,燒的錢可不是小數目。總不能用愛發電吧。

希望Win7早日被淘汰,WinUI 3.0能進一步融合UWP和Win32。距離上一次某軟說要重振desktop開發已經過去蠻久了。

本篇提到的相關Sample code在GitHub:

https://github.com/manupstairs/UWPSamples/tree/master/UWPSamples/RadioDevice

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

藍瘦、香菇!十幾萬貶值最快的車型,好多人都中招了_台中搬家公司

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

豐田的車也被套上高貶值率,看到這肯定不少朋友要起異議了。別急,這次講的是雷凌混動版,並非汽油版車型。儘管雷凌雙擎的貶值率較高,但憑藉著開不爛的豐田,以及最便宜混動車的頭銜,雙擎想不火都難,若是秉承買一輛車開一輩子的打算,覺得雷凌雙擎還是非常值得購買的。

最近陪一位屌絲朋友去置換汽車時,發現一個很有意思的事。小夥伴的車只開兩三年,降價百分之50都無人問津,而隔壁老王的車不僅買時便宜,即使開了十年以上仍會有人以高價競購。看到這,小夥伴不禁發出感嘆“藍瘦~香菇 為什麼我的車會買時貴賣時虧!”

造成如此大的差異,究其原因就是“貶值率”的問題了,不同的汽車,貶值率也各不相同,有的車品牌力度強,性能穩定,消費者就都願意選意選購這類車型,價格自然水漲船高。而有的車即使當初購買的時候價格花費高,但由於車型較為小眾,保有量低,所以想再賣出時即使大幅度降價也無人問津。下面給大家捋一捋20萬以內,哪些車的貶值率是偏高的,大家在選購時要多加留意。

福特-蒙迪歐

售價:17.98萬—26.58萬

貶值率:三年將近50%

新蒙迪歐改款以後,憑藉著家族式的馬丁前臉,超高的顏值,一度成為關注度較高的中型車。但他的銷量表現卻遠沒有關注度來得強烈,屬於典型的叫好不叫座類型。

但平心而論,這一代蒙迪歐的改變較原款車致勝,確實有了翻天覆地的變化。看不膩的馬丁前臉、發動機蓋隆起的線條無不在展現美式肌肉車的線條動力系統及底盤的表現同樣出彩,2.0T的發動機搭配六擋手自一體變速箱,

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

讓蒙迪歐具有百公里加速進入8秒的實力。

豐田-雷凌雙擎

售價:13.98-15.98萬

貶值率:三年將近40%

納尼!豐田的車也被套上高貶值率,看到這肯定不少朋友要起異議了。別急,這次講的是雷凌混動版,並非汽油版車型。

儘管雷凌雙擎的貶值率較高,但憑藉著開不爛的豐田,以及最便宜混動車的頭銜,雙擎想不火都難,若是秉承買一輛車開一輩子的打算,覺得雷凌雙擎還是非常值得購買的。

雪鐵龍-世嘉

9.58—11.18萬元

貶值率:三年將近40%

聊起法系車,我想大家體會最深的就是它前衛的外觀設計以及深厚的底盤調校能力。但為何在國內法系車就是永遠無法“雄起”呢?究其原因就是法國人不了解中國, 就拿本文的世嘉來看外觀看上去挺大的,各項數據也領先同級,可乘坐空間比起飛度都不如,這讓我們以大為美的國人情何以堪啊!

也許法國人根本不在乎你們的想法,他們的產品只給懂得欣賞他們的人去選擇,實事上也正是這樣。世嘉具有鮮明的特點,外形奇特,低產量,這也許就是人們追求的“高逼格”吧。

總結一句:對於法系車,你改變不了,那你就要去適應它,而購買法系車的同學就要做好貶值的心理準備了。

馬自達6

售價12.98-15.98萬元

貶值率:三年將近60%

說起老馬6,我想有不少同學已經非常熟悉了。馬自達6車型在國內生產銷售了超過10年時間,不僅沒有停產,並且衍生出了3代車型(馬自達6、睿翼、阿特茲),可謂是三代同堂。

老馬六的市場保有量大,這是毋庸置疑的事實,但自從老馬六改款,新舊兩代車型同時銷售,當時20萬起步的老馬六立刻官降10萬,希望以低價中級車的身份搶佔緊湊級車市場。

總結:汽車的貶值會受諸多因素的影響,建議小夥伴們在購車選車的時候要充分考慮貶值率這個問題,多關注心儀車型的品牌口碑、換代新車的價格、車輛的受眾情況等等,綜合這幾方面來選購車型。(要是有選擇困難症的小夥伴也可以在下方留言,讓給你分析下)本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」