我用Python做设计(一)
我用Python做設計(一)
目錄
- 我用Python做設計一
-
- 目錄
- 前言
- 簡介
- 數據處理
- 算法分析
-
前言
“鈴鈴鈴,鈴鈴鈴。。。”隨著一陣急促的電話,我知道又要有的忙了。“XX,有一份規劃,著急要,要求和資料我已經發你了,你抓緊看一下,有什么問題給我打電話。”
暈,難得的清閑時間,又沒了,開始接收文件,看看是啥。原來是一份本地區的配網自動化規劃設計要求。
簡介
看了下要求,原來對本地的配網自動化光纖建設進行規劃,做到本地區配網自動化節點和配變節點的光纖100%覆蓋。要求知道了,下面就是看看,都有哪些資料。
- 本地的當前配電房的GIS的CAD版本
本地的當前所有配變的Excel版資料
先對本地區的配網自動化組網方案進行一個簡要的介紹,本地區的配網光線自動化組網方案,采用以太網交換機的光纖環網的組網方案,環網從變電站出發,串接各個自動化節點,最后再回到變電站。然后原則上,一個變電站可以出不超過4個光纖環,一個環,原則上串接不超過25個節點。
要求有了,先熟悉一下資料,看看有啥可用的。
首先先從CAD中導出所有的變電站資料,看看有多少座變電站,他們都在哪兒。
| 1 | 葉孤城變電站 | 114.0911 | 22.5536 | 0 |
| 2 | 驚云變電站 | 114.1025 | 22.5758 | 0 |
| 3 | 連城變電站 | 114.1035 | 22.5716 | 0 |
| … | … | … | … | … |
| 14 | 香山變電站 | 114.1692 | 22.66 | 0 |
然后是本地的所有配電房的數據,這個數據就比較多了,然后格式也是一樣的,就不列舉了。
下面開始嘗試先對數據有個簡單的感受。
數據處理
變電站的數據很少,就先看它。下面,當然是掏出我的大蟒蛇,嘻嘻嘻嘻,將數據處理之后,放進去,代碼很簡單。
import geoplotlib from geoplotlib.utils import read_csv, BoundingBoxdata = read_csv('data/lh_stations.csv') geoplotlib.dot(data, point_size=8) geoplotlib.set_bbox(BoundingBox(22.58, 114.11, 22.53, 114.16)) geoplotlib.show() 得到的效果如下:
額。。。,好吧,開導自己,我至少知道了這幾個變電站在哪兒,看著這些站的位置還是很不平均的,有些地方空出了很大位置,不曉得會不會影響規劃。
先不管了,再看看本地區的配電房都在那里吧。配電房數據,肯定不能這么看了,畢竟它要密的多,所以決定用熱力圖看看,代碼也很簡單。
得到的效果如下:
圖中,分成若干個矩形區域,然后統計每個矩形區域中的配電房的個數,配電房密度越高,顏色越亮,配電房密度越低,顏色越暗。從中可以看到配電房的分布也是很不均勻的。
粗略的計算了一下,按照業主的要求,1個變電站可以接25*4=100個節點,那14座變電站就可以接1400個節點,對當前的規劃來說,是夠用的,那下面開始考慮,該怎么能實現業主的要求能。
算法分析
首先想到的就是K-means算法,因為這跟聚類思想很像,假設我如果每個變電站出4個環,然后每個環接不超過25個點的話,通過不斷嘗試每個分組的最小類,來計算所有的分組。因為,如果要考慮每個環接不超過25個點這個條件的話,算法的復雜度會增大,所以,這里先直接調用經典K-means算法。
K-means算法是硬聚類算法,是典型的基于原型的目標函數聚類方法的代表,它是數據點到原型的某種距離作為優化的目標函數,利用函數求極值的方法得到迭代運算的調整規則。K-means算法以歐式距離作為相似度測度,它是求對應某一初始聚類中心向量V最優分類,使得評價指標J最小。算法采用誤差平方和準則函數作為聚類準則函數。
代碼比上面的稍長一些。
from geoplotlib.colors import create_set_cmap import pyglet from sklearn.cluster import KMeans import geoplotlib from geoplotlib.layers import BaseLayer from geoplotlib.core import BatchPainter from geoplotlib.utils import BoundingBox import numpy as np import comclass KMeansLayer(BaseLayer):def __init__(self, data):self.data = dataself.k = 56def invalidate(self, proj):self.painter = BatchPainter()x, y = proj.lonlat_to_screen(self.data['lon'], self.data['lat'])k_means = KMeans(n_clusters=self.k)k_means.fit(np.vstack([x,y]).T)labels = k_means.labels_self.cmap = create_set_cmap(set(labels), 'hsv')for l in set(labels):self.painter.set_color(self.cmap[l])self.painter.convexhull(x[labels == l], y[labels == l])self.painter.points(x[labels == l], y[labels == l], 2)def draw(self, proj, mouse_x, mouse_y, ui_manager):ui_manager.info('Use left and right to increase/decrease the number of clusters. k = %d' % self.k)self.painter.batch_draw()def on_key_release(self, key, modifiers):if key == pyglet.window.key.LEFT:self.k = max(2,self.k - 1)return Trueelif key == pyglet.window.key.RIGHT:self.k = self.k + 1return Truereturn Falsedata = geoplotlib.utils.read_csv('data/lh_powerhouses.csv') geoplotlib.add_layer(KMeansLayer(data)) geoplotlib.set_smoothing(True) geoplotlib.set_bbox(com.boundingBoxDefault) geoplotlib.show() 得到的效果如下:
我細數了一下,最多的一個環里面有30+個,所以直接用肯定是不行的。不過暫時看著還像那么回事兒的,把得到的數據,先稍微處理一下,就先這樣向老板交差吧,后面再細細考慮算法的問題。( ̄▽ ̄)”
總結
以上是生活随笔為你收集整理的我用Python做设计(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌浏览器中全屏及跳过页面打印预览的设置
- 下一篇: 047、学习打卡230409