JPS/JPS+ 尋路算法

目錄

  • 概念
    • 強迫鄰居(Forced Neighbour)
    • 跳點(Jump Point)
  • JPS 尋路算法(Jump Point Search)
    • 實現原理
    • 示例過程
  • JPS+(Jump Point Search Plus)
    • 預處理
    • 示例過程
  • 總結
  • 參考

概念

JPS(jump point search)算法實際上是對A* 尋路算法的一個改進,因此在閱讀本文之前需要先了解A*算法。A* 算法在擴展節點時會把節點所有鄰居都考慮進去,這樣openlist中點的數量會很多,搜索效率較慢。

若不了解A*算法,可以參考博主以前寫的一篇文章 A* 尋路算法 – KillerAery – 博客園

例如在無遮擋情況下(往往會有多條等價路徑),而我們希望起點到終點實際只取其中一條路徑,而該路徑外其它節點可以沒必要放入openlist(不希望加入沒必要的鄰居)。

其次我們還希望直線方向上中途的點不用放入openlist,如果只放入每段直線子路徑的起點和終點,那openlist又可以少放很多沒必要的節點:

可以看到 JPS 算法搜到的節點總是“跳躍性”的,這是因為這些關鍵性的節點都是需要改變行走方向的拐點,因此這也是 Jump Point 命名的來歷。

在介紹JPS等算法具體實現前,我們必須先掌握下面的概念。

強迫鄰居(Forced Neighbour)

強迫鄰居:節點 x 的8個鄰居中有障礙,且 x 的父節點 p 經過x 到達 n 的距離代價比不經過 x 到達的 n 的任意路徑的距離代價小,則稱 n 是 x 的強迫鄰居。

看定義也許十分晦澀難懂。直觀來說,實際就是因為前進方向(父節點到 x 節點的方向為前進方向)的某一邊的靠後位置有障礙物,因此想要到該邊靠前的空位有最短的路徑,就必須得經過過 x 節點。

可能的情況見圖示,黑色為障礙,紅圈即為強迫鄰居:

(左圖為直線方向情況下的強迫鄰居,右圖為斜方向情況下的強迫鄰居)

跳點(Jump Point)

跳點:當前點 x 滿足以下三個條件之一:

  • 節點 x 是起點/終點。
  • 節點 x 至少有一個強迫鄰居。
  • 如果父節點在斜方向(意味着這是斜向搜索),節點x的水平或垂直方向上有滿足條件a,b的點。

節點y的水平或垂直方向是斜向向量的拆解,比如向量d=(1,1),那麼水平方向則是(1,0),並不會往左搜索,只會看右邊,如果向量d=(-1,-1),那麼水平方向是(-1,0),只會搜索左邊,不看右邊,其他同理。

下圖舉個例子,由於黃色節點的父節點是在斜方向,其對應分解成向上和向右兩個方向,因為在右方向發現一個藍色跳點,因此黃色節點也應被判斷為跳點:

JPS 尋路算法(Jump Point Search)

實現原理

JPS 算法和A* 算法非常相似,步驟大概如下:

  1. openlist取一個權值最低的節點,然後開始搜索。(這些和A*是一樣的)
  2. 搜索時,先進行 直線搜索(4/8個方向,跳躍搜索),然後再 斜向搜索(4個方向,只搜索一步)。如果期間某個方向搜索到跳點或者碰到障礙(或邊界),則當前方向完成搜索,若有搜到跳點就添加進openlist。

跳躍搜索是指沿直線方向一直搜下去(可能會搜到很多格),直到搜到跳點或者障礙(邊界)。一開始從起點搜索,會有4個直線方向(上下左右),要是4個斜方向都前進了一步,此時直線方向會有8個。

  1. 若斜方向沒完成搜索,則斜方向前進一步,重複上述過程。

因為直線方向是跳躍式搜索,所以總是能完成搜索。

  1. 若所有方向已完成搜索,則認為當前節點搜索完畢,將當前節點移除於openlist,加入closelist。
  2. 重複取openlist權值最低節點搜索,直到openlist為空或者找到終點。

下面結合圖片更好說明過程2和3:首先我們從openlist取出綠色的節點,作為搜索的開始,先進行直線搜索,再斜向搜索,沒有找到任何跳點。

斜方向前進一步后,重複直線搜索和斜向搜索過程,仍沒發現跳點。

斜方向前進兩步后,重複直線搜索和斜向搜索過程,仍沒發現跳點。

斜方向前進了三步后(假設當前位置為 x),在水平直線搜索上發現了一個跳點(紫色節點為強迫鄰居)。

於是 x 也被判斷為跳點,添加進openlist。斜方向結束,綠色節點的搜索過程也就此結束,被移除於openlist,放入closelist。

示例過程

下面展示JPS算法更加完整的過程:
假設起點為綠色節點,終點為紅色節點

重複直線搜索和斜向搜索過程,斜方向前進了3步。在第3步判斷出黃色節點為跳點(依據是水平方向有其它跳點),將黃色跳點放入openlist,然後斜方向搜索完成,綠色節點移除於openlist,放入closelist。

對openlist下一個權值最低的節點(即黃色節點)開啟搜索,在直線方向上發現了藍色節點為跳點(依據是紫色節點為強迫鄰居),類似地,放入openlist。

由於斜方向還沒結束,繼續前進一步。最後一次直線搜索和斜向搜索都碰到了邊界,因此黃色節點搜索完成,移除於openlist,放入closelist。

對openlist下一個權值最低的節點(原為藍色節點,下圖變為黃色節點)開啟搜索,直線搜索碰到邊界,斜向搜索無果。斜方繼續前進一步,仍然直線搜索碰到邊界,斜向搜索無果。

由於斜方向還沒結束,繼續前進一步。

最終在直線方向上發現了紅色節點為跳點,因此藍色節點先被判斷為跳點,只添加藍色節點進openlist。斜方向完成,黃色節點搜索完成。

最後openlist取出的藍色節點開啟搜索,在水平方向上發現紅色節點,判斷為終點,算法完成。

回憶起跳點的第三個判斷條件(如果父節點在斜方向,節點x的水平或垂直方向上有滿足條件a,b的點),會發現這個條件判斷是最複雜的。在尋路過程中,它使尋路多次在水平節點上搜到跳點,也只能先添加它本身。其次,這也是算法中需要使用到遞歸的地方,是JPS算法性能瓶頸所在。

JPS+(Jump Point Search Plus)

JPS+ 本質上也是 JPS尋路,只是加上了預處理來改進,從而使尋路更加快速。

預處理

我們首先對地圖每個節點進行跳點判斷,找出所有主要跳點:

然後對每個節點進行跳點的直線可達性判斷,並記錄好跳點直線可達性:

若可達還需記錄號跳點直線距離:

類似地,我們對每個節點進行跳點斜向距離的記錄:

剩餘各個方向如果不可到達跳點的數據記為0或負數距離。如果在對應的方向上移動1步后碰到障礙(或邊界)則記為0,如果移動n+1步後會碰到障礙(或邊界)的數據記為負數距離-n

最後每個節點的8個方向都記錄完畢,我們便完成了JPS+的預處理過程:

以上預處理過程需要有一個數據結構存儲地圖上每個格子8個方向距離碰撞或跳點的距離。

示例過程

做好了地圖的預處理之後,我們就可以使用JPS+算法了。大致思路與JPS算法相同,不過這次有了預處理的數據,我們可以更快的進行直線搜索斜向搜索

在某個搜索方向上有:

  • 對於正數距離 n(意味着距離跳點 n 格),我們可以直接將n步遠的節點作為跳點添加進openlist
  • 對於0距離(意味着一步都不可移動),我們無需在該方向搜索;
  • 對於負數距離 -n(意味着距離邊界或障礙 n 格),我們直接將n步遠的節點進行一次跳點判斷(有可能滿足跳點的第三條件,不過得益於預處理的數據,這步也可以很快完成)。

如下圖示,起始節點通過已記錄的向上距離,直接將3步遠的跳點添加進openlist,而不再像以前需要迭代三步(還每步都要判斷是否跳點):

其它過程也是類似的:

總結

可以看到 JPS/JPS+ 算法里只有跳點才會被加入openlist里,排除了大量不必要的點,最後找出來的最短路徑也是由跳點組成。這也是 JPS/JPS+ 高效的主要原因。

JPS

  • 絕大部分地圖,使用 JPS 算法都會比 A* 算法更快,內存佔用也更小(openlist里節點少了很多)。
  • JPS 在跳點判斷上,要盡可能避免遞歸的深度過大(或者期待一下以後出現避免遞歸的算法),否則在超大型的地圖裡遞歸判斷跳點可能會造成災難。
  • JPS 也可以用於動態變化的地圖,只是每次地圖改變都需要再進行一次 JPS 搜索。
  • JPS 天生擁有合併節點(亦或者說是在一條直線里移除中間不必要節點)的功能,但是仍存在一些可以繼續合併的地方。
  • JPS 只適用於 網格(grid)節點類型,不支持 Navmesh 或者路徑點(Way Point)。

JPS+

  • JPS+ 相比 JPS 算法又是更快上一個檔次(特別是避免了過多層遞歸判斷跳點),內存佔用則是每個格子需要額外記錄8個方向的距離數據。
  • JPS+ 算法由於包含預處理過程,這讓它面對動態變化的地圖有天生的劣勢(幾乎是不可以接受動態地圖的),因此更適合用於靜態地圖。
  • JPS+ 預處理的複雜度為 \(O(n)\) ,n 代表地圖格子數。
算法 性能 內存佔用 支持動態地圖 預處理 支持節點類型
A* 中等 支持 網格、Navmesh、路徑點
JPS 偏小 支持 網格
JPS+ 非常快 中等 不支持 有,\(O(n)\) 網格

綜上,JPS/JPS+ 是A*算法的優秀替代者,絕大部分情況下更快和更小的內存佔用已經足夠誘人。在GDC 2015 關於 JPS+ 算法的演講中,Steve Rabin 給出的數據甚至是比A* 算法快70~350倍。

參考

[1] 從頭理解JPS尋路算法 – 簡書 by ElephantKing

[2] JPS+: Over 100x Faster than A* | GDC 2015

[3] JPS+ with GoalBounding C++實現,和上面GDC2015的演講人是同一個人 Steve Rabin。

[4] 一個在線可視化的JPS實現附說明 A Visual Explanation Of Jump Point Search

[5] JPS 算法原作者論文 github Harabor, Daniel Damir, and Alban Grastien. “Online Graph Pruning for Pathfinding On Grid Maps.” AAAI. 2011.

博主其它相關文章:
遊戲AI 系列文章 – KillerAery – 博客園
遊戲AI之路徑規劃 – KillerAery – 博客園

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

【其他文章推薦】

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

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

模式識別與機器學習筆記專欄之貝恭弘=叶 恭弘斯分類決策(一)

目錄

  • 1. 貝恭弘=叶 恭弘斯公式
  • 2. 最小錯誤率貝恭弘=叶 恭弘斯決策
  • 3. 最小風險貝恭弘=叶 恭弘斯決策

這是模式識別與機器學習筆記專欄的第一篇,我會持續更新。

在所有的生活場景中,我們無時無刻不在進行着模式識別。比如你看見迎面走來一個人,根據他的長相來辨認出他好像是你一年前某個活動小組的組長,然後你開始決策要不要和他打個招呼。或者你走進水果店,把西瓜拍了個遍來決定最後買哪一個。或者你突然被捂上眼睛,聽着背後人的聲音來辨別是不是你的親愛的。

模式(pattern) 可以理解成某種特徵,也就是你可以獲取到的某種原始數據,而 模式識別(pattern recognition) 就是根據輸入原始數據來判斷其類別並採取相應行為的能力。它對我們至關重要,但我們常常希望可以有機器幫我們來做這個工作,讓機器執行預定的程序來進行分類從而決策。比如一個短信攔截系統,幫我們分辨哪些是騷擾短信,哪些是有用的信息。

在這個問題上,貝恭弘=叶 恭弘斯決策理論是最最經典而基本的分類方法了。那麼,何為貝恭弘=叶 恭弘斯分類決策?

1. 貝恭弘=叶 恭弘斯公式

首先,我們熟悉的貝恭弘=叶 恭弘斯公式

\[P(\omega_i|x)=\frac{p(x|\omega_i)P(\omega_i)}{p(x)} \]

在模式識別問題中,用 \(d\) 維向量 \(x\) 來表示希望分類對象的特徵,它一般是從傳感器獲取,並且抽象化出來。\(\omega\) 來表示可能分類的類別。\(\omega_i\) 對應着第 \(i\) 類,如果是一個兩類問題,\(i=1,2\) ,如果是 \(c\) 類問題,則 \(i=1,2,…,c\)

\(P(\omega_i|x)\) 是由特徵 \(x\) 預測的結果,也就是后驗概率,\(p(x|\omega_i)\) 是類條件概率,或者叫似然概率,就是特徵 \(x\) 這個隨機變量分佈情況,它是取決於類別 \(\omega\) 的狀態的。\(P(\omega_i)\)是類先驗信息,是根據先前知識經驗給定的,並且因為總共就c類,所以很容易得到\(\sum^{c}_{j=1}P(\omega_j)=1\)\(p(x)\)是歸一化因子,並不重要:

\[p(x)=\sum^{c}_{j=1}p(x|\omega_j)P(\omega_j) \]

目的就是使得所有后驗概率之和為1。

貝恭弘=叶 恭弘斯公式提供了一個后驗概率的重要計算依據:從似然概率和先驗概率得到。

2. 最小錯誤率貝恭弘=叶 恭弘斯決策

首先簡化問題為二分類問題,比如短信分類問題,\(\omega=\omega_1\) 是將短信分為有用短信,\(\omega=\omega_2\) 是將短信分類為垃圾短信。假設我們現在對這兩類的先驗概率和特徵 \(x\) 的類條件概率分佈都知道了。那麼通過一個短信提取到的特徵 \(x\) ,就可以利用貝恭弘=叶 恭弘斯公式計算后驗概率,也就是對可能的兩類做出的概率判斷。

\[P(\omega_1|x)=p(x|\omega_1)P(\omega_1)\\ P(\omega_2|x)=p(x|\omega_2)P(\omega_2) \]

很自然的來比較后驗概率來進行決策,哪一類的后驗概率大,就判定為哪一類,先驗是給定的,歸一化因子不重要,實質上比的就是類條件概率分佈。

  • 現在引入一個錯誤率 \(P(error|x)\) 的概念,對一個\(x\) ,算出了 \(P(\omega_1|x)\)\(P(\omega_2|x)\),假如我們讓\(\omega=\omega_1\),也就是判定為第一類,把這條短信判斷成有用的,那麼我們判斷正確的概率就是 \(P(\omega_1|x)\) ,而判斷錯誤的概率就是\(P(\omega_2|x)\)。寫成公式:

\[P(error|x)= \begin{cases} P(\omega_1|x)& \text{如果判定為}\omega_2 \\ P(\omega_2|x)& \text{如果判定為}\omega_1 \end{cases} \]

  • 我們希望我們判斷的錯誤率更小,因此我們得到判決規則:

如果\(P(\omega_1|x)>P(\omega_2|x)\),判定為 \(\omega_1\);否則判定為 \(\omega_2\)

——這就是最小錯誤率貝恭弘=叶 恭弘斯決策,也就是哪一類后驗概率大,判為哪一類

  • 寫成似然概率和先驗概率的形式:

如果\(p(x|\omega_1)P(\omega_1)>p(x|\omega_2)P(\omega_2)\),判定為 \(\omega_1\);否則判定為 \(\omega_2\)

3. 最小風險貝恭弘=叶 恭弘斯決策

下面把判決規則升級一下。

再回想一下短信分類的問題。假如預測成有用短信和騷擾短信的后驗概率接近的時候,這時候誤判的可能性還是比較高的。如果誤判,可能會把有用的分成垃圾,把垃圾短信分成有用的。可以想象這兩者的錯誤率是此消彼長的,但對哪種的錯誤率容忍度更高呢?把有用的分成垃圾的看起來更加難以接受。這時候可能就希望那種模稜兩可的情況還是判定成有用的好。那麼如何來體現這種對錯誤率容忍度的不同呢?下面就引入損失函數。

對每一種判斷以及真實情況定義一個損失函數\(\lambda(\alpha_i|\omega_j)\),以下面的兩類問題為例

\(\lambda(\alpha_i\vert\omega_j)\) \(\omega_1\) \(\omega_2\)
\(\alpha_1\) 0 1
\(\alpha_2\) 2 0

\(\omega_j\) 表示要分類對象的真實類別是 \(\omega_j\)\(\alpha_i\) 表示要採取的行為,即判定為 \(\omega_i\)

以短信分類為例,假如真實是\(\omega_1\) ,有用短信,採取\(\alpha_1\) ,判斷為有用,也就是判斷正確了,可以定義損失就是0。假如真實是\(\omega_2\) ,垃圾短信,採取\(\alpha_1\) ,判斷為有用,也就是判斷錯誤了,可以定義損失函數為1。假如真實是\(\omega_1\) ,有用短信,採取\(\alpha_2\) ,判斷為垃圾,同樣是判斷錯誤了,而這種錯誤我們的容忍度更低,那麼可以定義損失函數為2。

  • 損失函數乘以對應的后驗概率\(P(\omega_j|x)\) 並求和,得到風險函數\(R(\alpha_i|x)\)

\[R(\alpha_1|x)=\lambda(\alpha_1|\omega_1)P(\omega_1|x) +\lambda(\alpha_1|\omega_2)P(\omega_2|x)\\ R(\alpha_2|x)=\lambda(\alpha_2|\omega_1)P(\omega_1|x) + \lambda(\alpha_2|\omega_2)P(\omega_2|x) \]

理解起來就是:\(\alpha_i\)行為的風險=每種 \(\omega\) 情況下採取\(\alpha_i\)行為的損失x是這種 \(\omega\) 的后驗概率

  • 與最小錯誤率貝恭弘=叶 恭弘斯決策相對應的,這時候使得風險函數最小就行了,判決規則寫成:

如果\(R(\alpha_1|x) < R(\omega_2|x)\),採取行為\(\alpha_1\) ,也就是判定為 \(\omega_1\);否則採取行為\(\alpha_2\) ,也就是判定為 \(\omega_2\)

因此決策的方式就是採取風險\(R(\alpha_i|x)\)最小的行為\(\alpha_i\)——這是最小風險貝恭弘=叶 恭弘斯決策

  • \(\lambda(\alpha_i|\omega_j)\) 簡寫成\(\lambda_{ij}\) ,並把類條件概率和先驗概率代入,得到判決規則:

如果\((\lambda_{11}-\lambda_{21})p(x|\omega_1)P(\omega_1) < (\lambda_{22}-\lambda_{12})p(x|\omega_2)P(\omega_2)\),採取行為\(\alpha_1\) ,也就是判定為 \(\omega_1\);否則採取行為\(\alpha_2\) ,也就是判定為 \(\omega_2\)

  • 還可以寫成似然比的形式:

如果\(\frac{p(x|\omega_1)}{p(x|\omega_2)}<\frac{(\lambda_{22}-\lambda_{12})}{(\lambda_{11}-\lambda_{21})}\frac{P(\omega_2)}{P(\omega_1)}\) ,採取行為\(\alpha_1\) ,也就是判定為 \(\omega_1\);否則採取行為\(\alpha_2\) ,也就是判定為 \(\omega_2\)

這樣寫的好處是,不等式右邊的損失函數和先驗概率都是給定的,是一個常數,左邊就是似然概率之比,所以只需要算出似然概率之比就可以進行分類預測

  • 另外,如果採用如下0-1損失函數的時候,最小風險貝恭弘=叶 恭弘斯決策就會退化成最小錯誤率貝恭弘=叶 恭弘斯決策
\(\lambda(\alpha_i\vert\omega_j)\) \(\omega_1\) \(\omega_2\)
\(\alpha_1\) 0 1
\(\alpha_2\) 1 0

\[R(\alpha_1|x)=\lambda(\alpha_1|\omega_1)P(\omega_1|x)+\lambda(\alpha_1|\omega_2)P(\omega_2|x)=P(\omega_2|x)\\ R(\alpha_2|x)=\lambda(\alpha_2|\omega_1)P(\omega_1|x) + \lambda(\alpha_2|\omega_2)P(\omega_2|x)=P(\omega_1|x) \]

  • 如果是多類情況

\[R(\alpha_i|x)=\sum^c_{j=1}\lambda(\alpha_i|\omega_j)P(\omega_j|x) \]

決策行為\(\alpha^*=argminR(\alpha_i|x)\) ,也就是採取的行為\(\alpha_i\) 是使得風險\(R(\alpha_i|x)\) 最小的那個\(\alpha_i\)

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

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

對馬克宏很失望 法環境部長請辭 「不想再騙自己」

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

加州議會通過法案 2045年前100%清潔能源

摘錄自2018年8月30日世界日報報導

加州州議會29日準備將一項畫時代的法案送交州長簽署,這項法案規定,加州在2045年前將電力供應全面變為清潔能源,不再使用煤和石油發電,100%改用太陽能、風力和其他再生能源。

由州參議會議長德利昂提出的SB100號法案,先獲州參議會通過,29日再獲州眾議會以43票對32票通過;州眾議會進行了修改,所以須再送回州參議會通過,就可以送交州長簽署。州議會今年的會期,將於本周結束,所以SB100估計可於周末前送交州長。

加州的公用事業公司包括太平洋瓦電和聖地牙哥瓦電,都反對SB100。美西各州石油協會和其他組織也反對。

布朗州長對SB100保持沉默,沒有說是否簽署,雖然他是加州反暖運動的先鋒。明年可能接替布朗做州長的紐森,曾說要以100%清潔能源作為加州的目標,但是他也沒有對SB100表態。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

看好電動車需求,嘉能可加大投入銅鈷鎳的生產

  路透社12月5日報導,全球五大礦商之一的嘉能可(Glencore plc)加大投入電動車電池所需金屬的生產,因看好電動車市場的成長。路透社委託S&P Global Market Intelligence所做的研究顯示,嘉能可過去五年的銅與鈷產量都已經倍增,鎳產量更是四倍增長。其中,該公司銅產量從2011年的70萬噸增加至2016年的140萬噸,鈷產量從2011年的12,880公噸增加至2016年的28,300公噸,鎳產量從2011年的28,500公噸增加至2016年的115,100公噸。   報告顯示,銅鈷鎳等電動車相關金屬佔嘉能可核心獲利的五成比重,相比競爭對手包括力拓(Rio Tinto)、必和必拓(BHP Billiton)以及英美資源(Anglo American)等高出一倍。另一方面,嘉能可的股價自2015年以來已經上漲400%,2017年至今的漲幅也超過20%,表現也同樣優於其他三家競爭對手。 2017年1~9月,嘉能可銅產量較去年同期的106萬噸減少11%至94.65萬噸,主要由於尚比亞銅礦遭遇供電問題的影響。嘉能可也將今年全年的銅產量目標下調2%至131萬噸,較該公司去年的銅產量將減少8%。今年第三季,該公司的銅產量年減15%至30.36萬噸。   2017年1~9月,嘉能可的鋅產量年增4.8%至82.74萬噸,但是第三季的產量年減9%至25.66萬噸,較前季也減少12%。該公司也將全年的鋅產量目標下調2%至113萬噸。1~9月,該公司鎳產量年減2%至80,700公噸,全年產量則預估較去年持平為115,000公噸。   必和必拓商務長巴爾惠森(Arnoud Balhuizen)稱銅是「未來的金屬」,因2017年電動車迎來革命性的一年,市場大大低估了銅的需求潛力。國際銅業協會(International Copper Association)報告表示,電動汽車的產業增長,可望令未來十年該產業的銅需求量大幅增長,預估將從2017年的18.5萬噸增長至2027年的174萬噸,主要因為電動汽車較傳統汽車使用更多銅的影響。   加拿大蒙特利爾銀行資本市場(BMO Capital Markets)12月4日報告表示,受惠電動車電池需求的增長,鈷的價格在未來兩年預期將會大幅攀升。報告預估,鈷的價格將從當前的每磅30美元,上漲至2019年的每磅40.50美元(每噸89,290美元),並且不排除有倍增的可能。鈷價2017年至今已經上漲一倍,年初的價格約為每磅14.75美元。電動車電池的正極材料包括鋰、鈷與鎳,負極材料包括石墨與銅箔。   (本文內容由授權使用。首圖來源:public domain CC0)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

聚甘新

拚空污防制,政院:目標2040年汽車全面電動化

  為整合部會推動空氣品質改善工作,行政院長賴清德12月21日在行政院會聽取環保署「空氣污染防制行動方案」報告,並於會後親自召開記者會。賴清德表示,國人對空氣品質的要求日益提升,政府展現決心,針對不同汙染源也提出「空氣污染防制行動方案:紅害減半大作戰」,除加強執行已律定的政策外,也提出新的管制與防制措施。相關指標性政策目標,包括2019年空污紅害日減半、2035年機車全面電動化、2040年汽車全面電動化等目標。   賴揆指出,今年4月林全前院長核定「空氣污染防制策略」,經相關部會與地方縣市政府努力,空污減量已獲初步成果。近期民眾、專家學者及社會團體輿論,要求政府進一步對空氣汙染問題提出更有效的方法,因此上週行政院會通過「空氣汙染防製法」修正草案,並在與立法委員溝通,聽取地方政府意見後,於院會提出「空氣污染防制行動方案」。會請各部會與環保署共同推動、逐項落實,未來政院也會加強與地方政府合作,希望化危機為轉機。   賴揆表示,地方政府實際執行空氣汙染防制的相關工作,尤其桃園、台中、雲林及高雄等設有火力發電廠的縣市,直接承受來自民眾的壓力;而台中市整合雲林縣、嘉義縣、嘉義市、苗栗縣、彰化縣及南投縣6縣市的建議,包括加速綠能發電;訂定全國鍋爐加嚴排放標準並全面補助;增加空污基金地方分配比例;捷運延伸中台灣以及公車營運補助全面加碼等4項要求,與政院的目標不謀而合。   環保署則明確表示,「空氣污染防制行動方案」訂定數項指標性政策目標,包括2019年空污紅害日減半、2030年公務車輛全面電動化、2035年機車全面電動化、2040年汽車全面電動化等目標;針對細懸浮微粒排放量較大者,提出具體管制與防制措施,包括要求國營事業達超低排放的世界最嚴標準、全面禁止烏賊車上路、加強餐飲業油煙、道路、營建工程及河川揚塵的管理等。   環保署並指出,除修法加嚴標準或加重罰則、擴大處分對象等行政手段外,也將提供優惠貸款以鼓勵業者汰換高污染的老舊大客貨車,目標自2018年起,將8萬輛一、二期老舊柴油大貨車汰換為符合最新的環保排放標準,1萬輛公車全面更換為電動車。   賴揆也進一步強調,空污問題並非是環保署或地方政府可以獨立面對,是需要跨部會共同合作。同時也希望地方政府與中央攜手執行,研議訂定紅害減半目標,並請上述7縣市針對固定與移動汙染源等屬於地方政府負責事項,擬訂具體策略。   (本文內容由授權使用。首圖來源:public domain CC0)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新

Spark如何與深度學習框架協作,處理非結構化數據

隨着大數據和AI業務的不斷融合,大數據分析和處理過程中,通過深度學習技術對非結構化數據(如圖片、音頻、文本)進行大數據處理的業務場景越來越多。本文會介紹Spark如何與深度學習框架進行協同工作,在大數據的處理過程利用深度學習框架對非結構化數據進行處理。

Spark介紹

Spark是大規模數據處理的事實標準,包括機器學習的操作,希望把大數據處理和機器學習管道整合。

Spark使用函數式編程範式擴展了MapReduce模型以支持更多計算類型,可以涵蓋廣泛的工作流。Spark使用內存緩存來提升性能,因此進行交互式分析也足夠快速(如同使用Python解釋器,與集群進行交互一樣)。緩存同時提升了迭代算法的性能,這使得Spark非常適合機器學習。

由於Spark庫提供了Python、Scale、Java編寫的API,以及內建的機器學習、流數據、圖算法、類SQL查詢等模塊;Spark迅速成為當今最重要的分佈式計算框架之一。與YARN結合,Spark提供了增量,而不是替代已存在的Hadoop集群。在最近的Spark版本中,Spark加入了對於K8s的支持,為Spark與AI能力的融合提供了更好的支持。

 

深度學習框架介紹

TensorFlow

TensorFlow最初是由Google機器智能研究部門的Google Brain團隊開發,基於Google 2011年開發的深度學習基礎架構DistBelief構建起來的。由於Google在深度學習領域的巨大影響力和強大的推廣能力,TensorFlow一經推出就獲得了極大的關注,並迅速成為如今用戶最多的深度學習框架。

TensorFlow是一個非常基礎的系統,因此也可以應用於眾多領域。但由於過於複雜的系統設計,對讀者來說,學習TensorFlow底層運行機制更是一個極其痛苦的過程。TensorFlow的接口一直處於快速迭代之中,並且沒有很好地考慮向後兼容性,這導致現在許多開源代碼已經無法在新版的TensorFlow上運行,同時也間接導致了許多基於TensorFlow的第三方框架出現BUG。

Keras

Keras 於2015年3月首次發布,擁有“為人類而不是機器設計的API”,得到Google的支持。它是一個用於快速構建深度學習原型的高層神經網絡庫,由純Python編寫而成,以TensorFlow、CNTK、Theano和MXNet為底層引擎,提供簡單易用的API接口,能夠極大地減少一般應用下用戶的工作量。

嚴格意義上講,Keras並不能稱為一個深度學習框架,它更像一個深度學習接口,它構建於第三方框架之上。Keras的缺點很明顯:過度封裝導致喪失靈活性。Keras最初作為Theano的高級API而誕生,後來增加了TensorFlow和CNTK作為後端。學習Keras十分容易,但是很快就會遇到瓶頸,因為它缺少靈活性。另外,在使用Keras的大多數時間里,用戶主要是在調用接口,很難真正學習到深度學習的內容。

PyTorch

PyTorch於2016年10月發布,是一款專註於直接處理數組表達式的低級API。 前身是Torch(一個基於Lua語言的深度學習庫)。Facebook人工智能研究院對PyTorch提供了強力支持。PyTorch支持動態計算圖,為更具數學傾向的用戶提供了更低層次的方法和更多的靈活性,目前許多新發表的論文都採用PyTorch作為論文實現的工具,成為學術研究的首選解決方案。

Caffe/Caffe2.0

Caffe的全稱是Convolutional Architecture for Fast Feature Embedding,它是一個清晰、高效的深度學習框架,於2013年底由加州大學伯克利分校開發,核心語言是C++。它支持命令行、Python和MATLAB接口。Caffe的一個重要特色是可以在不編寫代碼的情況下訓練和部署模型。如果您是C++熟練使用者,並對CUDA計算游刃有餘,你可以考慮選擇Caffe。

在Spark大數據處理中使用深度學習框架

在Spark程序中使用一個預訓練過的模型,將其并行應用於大型數據集的數據處理。比如,給定一個可以識別圖片的分類模型,其通過一個標準數據集(如ImageNet)訓練過。可以在一個Spark程序中調用一個框架(如TensorFlow或Keras)進行分佈式預測。通過在大數據處理過程中調用預訓練模型可以直接對非結構化數據進行直接處理。

我們重點介紹在Spark程序中使用Keras+TensorFlow來進行模型推理。

使用深度學習處理圖片的第一步,就是載入圖片。Spark 2.3中新增的ImageSchema包含了載入數百萬張圖像到Spark DataFrame的實用函數,並且以分佈式方式自動解碼,容許可擴展地操作。

使用Spark’s ImageSchema:

from pyspark.ml.image import ImageSchema
image_df = ImageSchema.readImages("/data/myimages")
image_df.show()

也可以利用Keras的圖片處理庫:

from keras.preprocessing import image
img = image.load_img("/data/myimages/daisy.jpg", target_size=(299, 299))

可以通過圖片路徑來構造Spark DataFrame:

def get_image_paths_df(sqlContext, dirpath, colName):
    files = [os.path.abspath(os.path.join(dirpath, f)) for f in os.listdir(dirpath) if f.endswith('.jpg')]
    return sqlContext.createDataFrame(files, StringType()).toDF(colName)

使用Keras接口加載預訓練模型:

from keras.applications import InceptionV3
model = InceptionV3(weights="imagenet")
model.save('/tmp/model-full.h5')
model = load_model('/tmp/model-full.h5')

定義圖片識別推理方法:

def iv3_predict(fpath):
            model = load_model('/tmp/model-full.h5')
            img = image.load_img(fpath, target_size=(299, 299))
            x = image.img_to_array(img)
            x = np.expand_dims(x, axis=0)
            x = preprocess_input(x)
 
            preds = model.predict(x)
            preds_decode_list = decode_predictions(preds, top=3)
            tmp = preds_decode_list[0]
            res_list = []
            for x in tmp:
                res = [x[0], x[1], float(x[2])]
                res_list.append(res)
            return res_list

定義推理輸入結果Schema:

def get_labels_type():    
    ele_type = StructType()    
    ele_type.add("class", data_type=StringType())    
    ele_type.add("description", data_type=StringType())    
    ele_type.add("probability", data_type=FloatType())    
    return ArrayType(ele_type)

將推理方法定義成Spark UDF:

spark.udf.register("iv3_predict", iv3_predict, returnType=get_labels_type())

載入圖片定義為數據表:

df = get_image_paths_df(self.sql)
df.createOrReplaceTempView("_test_image_paths_df")

使用SQL語句對接圖片進行處理:

df_images = spark.sql("select fpath, iv3_predict(fpath) as predicted_labels from _test_image_paths_df")
df_images.printSchema()
df_images.show(truncate=False)

結語

在大數據Spark引擎中使用深度學習框架加載預處理模型,來進行非結構數據處理有非常多的應用場景。但是由於深度學習框架目前比較多,模型與框架本身是深度耦合,在大數據環境中安裝和部署深度學習框架軟件及其依賴軟件會非常複雜,同時不利於大數據集群的管理和維護,增加人力成本。

華為雲DLI服務,採用大數據Serverless架構,用戶不需要感知實際物理集群,同時DLI服務已經在大數據集群中內置了AI計算框架和底層依賴庫(Keras/tensorflow/scikit-learn/pandas/numpy等)。DLI最新版本中已經支持k8s+Docker生態,並開放用戶自定義Docker鏡像能力,提供給用戶來擴展自己的AI框架、模型、算法包。在Serverless基礎上,為用戶提供更加開放的自定義擴展能力。

DLI支持多模引擎,企業僅需使用SQL或程序就可輕鬆完成異構數據源的批處理、流處理等,挖掘和探索數據信息,揭示其中的規律並發現數據潛在價值,華為雲618年中鉅惠,大數據+AI專場,歷史低價,助力企業“智能化”,業務“數據化”。

 

點擊關注,第一時間了解華為雲新鮮技術~

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

【其他文章推薦】

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

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

聚甘新

C# WPF – MVVM實現OPC Client管理系統

前言

本文主要講解採用WPF MVVM模式設計OPC Client的過程,算作對於WPF MVVM架構的學習記錄吧!不足之處請不吝賜教,感謝!

涉及知識點

  • C#基礎
  • Xaml基礎
  • 命令、通知和數據綁定
  • Prism+Blend
  • MahApps.Metro(第三方框架)
  • OPC

項目實現功能

  • 用戶登陸(模擬登陸過程,未連接數據庫)
  • OPC同步讀寫、異步讀寫操作等

開發環境

  • Window 10
  • Visual Studio 2019
  • .Net Framework 4.8

成品效果圖

項目詳解

MVVM框架搭建

為了節省開發時間,在事件綁定上使用了Prism框架,OPC通信方面使用了OPCDAAuto.dll類庫,二者均可以通過Nuget方式安裝到項目中。

  • 定義了一個DelegateCommand類用來處理屬性和命令;
  • 定義了一個NotificationObject類用來通知屬性和命令的改變;

注意:在使用事件綁定時,需要添加引用 xmlns:i=”http://schemas.microsoft.com/xaml/behaviors”,然後根據控件對應事件的名稱設置綁定命令即可。

比如我們想給ComboBox的SelectionChanged事件設置一個事件綁定,可這麼寫

xaml代碼:

<ComboBox
    x:Name="CombServerList"
    Width="120"
    Margin="{StaticResource ControlMargin}"
    ItemsSource="{Binding ServerList}">
    <!--  事件綁定  -->
    <i:Interaction.Triggers>
          <i:EventTrigger EventName="SelectionChanged">
             <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=CombServerList}" />
          </i:EventTrigger>
     </i:Interaction.Triggers>

</ComboBox>

View Code

VM代碼:

        public ICommand SelectionChangedCommand
        {
            get
            {
                return new Prism.Commands.DelegateCommand<ComboBox>((combobox) =>
                {
                   // 業務邏輯
                });
            }
        }

View Code

相關類的定義代碼如下:

 public class DelegateCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;

        /// <summary>
        /// 判斷判斷命令是否可以被執行
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public bool CanExecute(object parameter)
        {
            if (this.CanExecuteFunc != null)
            {
                this.CanExecuteFunc(parameter);
            }
            else
            {
                return true;
            }
            return false;
        }

        /// <summary>
        /// 執行相關的函數或者命令
        /// </summary>
        /// <param name="parameter"></param>
        public void Execute(object parameter)
        {
            if (this.ExecuteAction != null)
            {
                this.ExecuteAction(parameter);
            }
            else
            {
                return;
            }
        }

        /// <summary>
        /// 聲明一個委託用來執行命令對應的方法
        /// </summary>
        public Action<object> ExecuteAction { get; set; }

        /// <summary>
        /// 聲明一個方法,用來判斷命令是否可以被執行
        /// </summary>
        public Func<object, bool> CanExecuteFunc { get; set; }

    }

DelegateCommand

public class NotificationObject : INotifyPropertyChanged
    {
        /// <summary>
        /// 實現接口
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// 通知屬性的改變
        /// </summary>
        /// <param name="propertyName"></param>
        public void RaisePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

NotificationObject

UI界面搭建

這裏主要採用第三方開源框架MahApps.Metro,可以通過NuGet方式安裝到項目中,這裏不再展開講解,感興趣的朋友可以參考 MahApps.Metro – Quick Start

OPC相關處理

大致分為如下幾步:

  • 獲取OPC服務列表
  • 連接OPC服務
  • 創建分組
  • 獲取項目列表
  • 添加項目到分組中
  • 對項目的內容進行讀寫操作

比較簡單,不再展開了。

登陸界面

這裏我們說一說登陸界面的實現,由於追求PURE MVVM,所以這裡有三點需要說明一下:

  • PasswordBox綁定
  • 圓形頭像
  • 登陸窗體切換

PasswordBox綁定:自定義幫助類,使用PasswordBoxBehavior實現綁定;

圓形頭像:自定義樣式,增加Image圓角屬性;

登陸窗體切換:藉助prism的shell。

至此,已全部結束。

  作者:Jeremy.Wu
  出處:https://www.cnblogs.com/jeremywucnblog/
  本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

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

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新

Formula E 香港開賽,在地團隊推出新車

由FIA於2012年成立推行的Formula E電動方程式賽車,今年10月8、9日將在香港開賽。香港全城不僅摩拳擦掌準備迎接賽事,一支在地團隊也將展示一輛「100%香港製造」的未來電動概念車。

Formula E的第一場正式賽事於2014年在中國北京舉行,至今已巡迴亞、歐、美洲多個國家,2015-2016賽季的參賽車隊共有九隊。Formula E與正規方程式賽車最大的差別之處,在於所有賽車都是電動車,希望藉此鼓勵電動車技術發展。

香港中環海濱區將於10月8、9日舉辦Formula E本季賽事的其中一場比賽。除了引人注目的賽事之外,賽車場附近的eVillage空間也將展出一輛概念電動車,搭載智能化安全駕駛輔助系統、再生能源、電腦視覺等功能。系統亦可收集交通數據,即時提示交通路況。

這輛概念電動車由香港科學園公司整合九個科技團隊的技術所打造,是香港第一輛100%港產電動車。科學園公司也表示將與香港本地的一家巴士公司合作,研究將電動車計入應用於巴士上,並預計在今年年底推出自動駕駛巴士。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

聚甘新

別賜死蘋果車?傳庫克沒死心、擬收購McLaren超跑

先前一度傳出蘋果電動車開發案「泰坦計畫」(Project Titan)胎死腹中,蘋果將放棄硬體,轉向研發自駕車技術。不過新消息顯示,蘋果似乎還沒死心,向英國超跑車商McLaren提親。

巴倫(Barronˋs)、英國金融時報21日報導,內情人士透露,蘋果考慮收購McLaren、或進行策略投資,雙方好幾個月前開始洽談。據了解,蘋果對McLaren的工程技術和專利極感興趣,估計若真要併購McLaren,價格可能為10~15億英鎊。不過相關人士強調,最近蘋果電動車發展方向改變,不確定是否繼續協商。

消息傳出後,McLaren發布聲明,表示未與蘋果討論投資提案,不過沒有說明蘋果是否曾接洽過該公司。

McLaren出面否認,仍然止不住市場議論。Creative Strategies分析師Ben Bajarin以特斯拉和英國超跑Lotus結盟為例,說明可行性。他指出,2004年特斯拉與Lotus合作,發布電動跑車「Tesla Roadster」,定價十萬美元。儘管Roadster賣不到3,000輛,卻替之後的特斯拉暢銷車款「Model S」打下基礎。Bajarin稱,特斯拉從高檔跑車出發,蘋果或許也會如此。

富國銀行(Wells Fargo)的Maynard Um則認為,蘋果看上的不是硬體,而是McLaren的感測器技術。他在報告稱,McLaren超跑聞名於世,但是蘋果青睞的應是旗下的McLaren Applied Technologies部門。McLaren跑車利用偵測器蒐集胎壓、煞車溫度、衝擊力道等資料,透過預測分析,提升汽車維修和表現;此一技術可運用於許多領域,如能源業、健保業等。

紐約時報9月初報導,知情人士透露,蘋果發展電動車計畫,因潛在競爭者眾且技術難度高而大打退堂鼓,策略面臨修正,部分泰坦研發案已提前結案,並連帶資遣數十名工作人員。

蘋果七月請回老將Bob Mansfield主導泰坦計畫,重心從硬體製造移往自駕車應用科技,裁員是策略轉向的一部份。谷歌在更早之前就開始研發自駕車,且已上路測試好幾年,重心同樣放在谷歌最擅長的軟體研發與應用。

本文由嘉實資訊 MoneyDJ 授權使用 記者 陳苓 報導

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新