我用Python做设计(一)
我用Python做設(shè)計(jì)(一)
目錄
- 我用Python做設(shè)計(jì)一
-
- 目錄
- 前言
- 簡介
- 數(shù)據(jù)處理
- 算法分析
-
前言
“鈴鈴鈴,鈴鈴鈴。。?!彪S著一陣急促的電話,我知道又要有的忙了?!癤X,有一份規(guī)劃,著急要,要求和資料我已經(jīng)發(fā)你了,你抓緊看一下,有什么問題給我打電話。”
暈,難得的清閑時(shí)間,又沒了,開始接收文件,看看是啥。原來是一份本地區(qū)的配網(wǎng)自動(dòng)化規(guī)劃設(shè)計(jì)要求。
簡介
看了下要求,原來對(duì)本地的配網(wǎng)自動(dòng)化光纖建設(shè)進(jìn)行規(guī)劃,做到本地區(qū)配網(wǎng)自動(dòng)化節(jié)點(diǎn)和配變節(jié)點(diǎn)的光纖100%覆蓋。要求知道了,下面就是看看,都有哪些資料。
- 本地的當(dāng)前配電房的GIS的CAD版本
本地的當(dāng)前所有配變的Excel版資料
先對(duì)本地區(qū)的配網(wǎng)自動(dòng)化組網(wǎng)方案進(jìn)行一個(gè)簡要的介紹,本地區(qū)的配網(wǎng)光線自動(dòng)化組網(wǎng)方案,采用以太網(wǎng)交換機(jī)的光纖環(huán)網(wǎng)的組網(wǎng)方案,環(huán)網(wǎng)從變電站出發(fā),串接各個(gè)自動(dòng)化節(jié)點(diǎn),最后再回到變電站。然后原則上,一個(gè)變電站可以出不超過4個(gè)光纖環(huán),一個(gè)環(huán),原則上串接不超過25個(gè)節(jié)點(diǎn)。
要求有了,先熟悉一下資料,看看有啥可用的。
首先先從CAD中導(dǎo)出所有的變電站資料,看看有多少座變電站,他們都在哪兒。
| 1 | 葉孤城變電站 | 114.0911 | 22.5536 | 0 |
| 2 | 驚云變電站 | 114.1025 | 22.5758 | 0 |
| 3 | 連城變電站 | 114.1035 | 22.5716 | 0 |
| … | … | … | … | … |
| 14 | 香山變電站 | 114.1692 | 22.66 | 0 |
然后是本地的所有配電房的數(shù)據(jù),這個(gè)數(shù)據(jù)就比較多了,然后格式也是一樣的,就不列舉了。
下面開始嘗試先對(duì)數(shù)據(jù)有個(gè)簡單的感受。
數(shù)據(jù)處理
變電站的數(shù)據(jù)很少,就先看它。下面,當(dāng)然是掏出我的大蟒蛇,嘻嘻嘻嘻,將數(shù)據(jù)處理之后,放進(jìn)去,代碼很簡單。
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() 得到的效果如下:
額。。。,好吧,開導(dǎo)自己,我至少知道了這幾個(gè)變電站在哪兒,看著這些站的位置還是很不平均的,有些地方空出了很大位置,不曉得會(huì)不會(huì)影響規(guī)劃。
先不管了,再看看本地區(qū)的配電房都在那里吧。配電房數(shù)據(jù),肯定不能這么看了,畢竟它要密的多,所以決定用熱力圖看看,代碼也很簡單。
得到的效果如下:
圖中,分成若干個(gè)矩形區(qū)域,然后統(tǒng)計(jì)每個(gè)矩形區(qū)域中的配電房的個(gè)數(shù),配電房密度越高,顏色越亮,配電房密度越低,顏色越暗。從中可以看到配電房的分布也是很不均勻的。
粗略的計(jì)算了一下,按照業(yè)主的要求,1個(gè)變電站可以接25*4=100個(gè)節(jié)點(diǎn),那14座變電站就可以接1400個(gè)節(jié)點(diǎn),對(duì)當(dāng)前的規(guī)劃來說,是夠用的,那下面開始考慮,該怎么能實(shí)現(xiàn)業(yè)主的要求能。
算法分析
首先想到的就是K-means算法,因?yàn)檫@跟聚類思想很像,假設(shè)我如果每個(gè)變電站出4個(gè)環(huán),然后每個(gè)環(huán)接不超過25個(gè)點(diǎn)的話,通過不斷嘗試每個(gè)分組的最小類,來計(jì)算所有的分組。因?yàn)?#xff0c;如果要考慮每個(gè)環(huán)接不超過25個(gè)點(diǎn)這個(gè)條件的話,算法的復(fù)雜度會(huì)增大,所以,這里先直接調(diào)用經(jīng)典K-means算法。
K-means算法是硬聚類算法,是典型的基于原型的目標(biāo)函數(shù)聚類方法的代表,它是數(shù)據(jù)點(diǎn)到原型的某種距離作為優(yōu)化的目標(biāo)函數(shù),利用函數(shù)求極值的方法得到迭代運(yùn)算的調(diào)整規(guī)則。K-means算法以歐式距離作為相似度測度,它是求對(duì)應(yīng)某一初始聚類中心向量V最優(yōu)分類,使得評(píng)價(jià)指標(biāo)J最小。算法采用誤差平方和準(zhǔn)則函數(shù)作為聚類準(zhǔn)則函數(shù)。
代碼比上面的稍長一些。
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() 得到的效果如下:
我細(xì)數(shù)了一下,最多的一個(gè)環(huán)里面有30+個(gè),所以直接用肯定是不行的。不過暫時(shí)看著還像那么回事兒的,把得到的數(shù)據(jù),先稍微處理一下,就先這樣向老板交差吧,后面再細(xì)細(xì)考慮算法的問題。( ̄▽ ̄)”
總結(jié)
以上是生活随笔為你收集整理的我用Python做设计(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌浏览器中全屏及跳过页面打印预览的设置
- 下一篇: 学Python,站在这棵树上就对了 |