||
本人的专业是交通工程,致力于交通网络、应急交通和GIST方向,研究中用到了复杂网络的理论,需要复杂网络的指标,但却不想在复杂网络的计算上花费太多精力(呵呵,毕竟不是那个专业的)。本来想用Pajek,研究生能了几个星期也没能明白,看了看写个文件一读也能做,但灵活性较差。问了下搞复杂网络的同事(呵呵,在网上呢),说python可以,就搭了一个编程框架,觉得也是python进行复杂网络计算的难点,大多数学生可能搭建起了比较费劲费时(反正自己的学生没有让他们碰),实现通过数据库或者地理信息系统数据快速建立复杂网络,解决已有数据进行复杂网络计算的问题,个人觉得还是挺有意义的,共享给大家交流,希望各个研究者、学生节省更多时间关注本专业的相关研究。我的工作环境是 WIN7,SQL2005(因为做交通地理信息系统,数据都存在数据库里)。
一、Python + Eclipse + PyDev 插件的Python开发环境
1.准备工作:
下载32位的JDK6 Java的开发包
下载32位的Eclipse
下载Python 3.2 (一定要3.2,3.3版本不支持扩展库,我就走了弯路)
2. 安装JDK6
JDK的安装很容易的,一般一直点下一步即可。
添加环境变量JAVA_HOME,值为JDK的路径,我这里是”C:JavaJDK”
添加环境变量CLASSPATH,值为”.;%JAVA_HOME%lib;%JAVA_HOME%libtools.jar”
在环境变量Path的值后面加上”;%JAVA_HOME%bin;%JAVA_HOME%jrebin”
3.安装Eclipse和Python
Eclipse是绿色软件,找个地方解压一下就OK了。
Python的安装就更不用说了。
这里最好也设置环境变量,扩展库安装挺简单的。
在环境变量Path的值后面加上python安装路径;我的是c:python32,即”;c:python32”
4.给Eclipse安装PyDev插件
在Help菜单中,选择Install New Software···, 选择Add按钮,Name:PyDev(这个随便起),Location:http://pydev.org/updates(PyDev的更新地址),OK
选择PyDev下的PyDev for Eclipse,别的都不要选,否则依赖检查那关过不去,依次完成即可。
5.配置PyDev插件
最后重启Eclipse,在Window菜单中选Preference,PyDev->Interpreter - Python,New一个Python解释器,填上解释器名字(任意)和路径,路径选相应的python.exe。所所有选项全选即可。
二、python扩展库的安装
1.准备工作:
networkx:复杂网络扩展库
pywin32:访问windows系统API的库
matplotlib:绘图软件
numpy :快速处理数据库
SciPy: 数值计算库
Sympy:符号运算数据库
pyodbc: ODBC数据连接库
如果进行科学计算,上面的库还非常有用的。下载可在https://pypi.python.org/pypi网站下载即可,下载3.2版本的。
2. 安装
只有networkx 需要在DOS命令下安装,其他的双击安装即可。networkx 安装需要进入DOS窗口,即“附件“中的”命令提示符“下,进入networkx 安装文件所在目录,键入” python setup.py install“ 安装即可(注:前面设置了环境变量,忘了设置就要键入全部路径信息了)。
3.配置ODBC
我们数据经常会存在数据库或地理信息系统当中,可通过ODBC平台,建立复杂网络,实现计算。
在控制面板中的管理工具中打开ODBC管理器,输入在“用户DSN”中点“添加”,驱动程序选择SQL NATIVE CLIENT,然后点“完成”,输入名称(任意),服务器就输你那个服务器IP或local,接着下一步输入用户名密码,然后跟着向导下一步到结束就行了。
检查1433端口是否打开,如果没有打开则不能应用,DOS命令键入“netstat -an”,没有找到1433端口,说明1433端口没有打开。安装的SQL2005默认TCP/IP的状态是禁止的。选择“开始菜单->所有程序->Microsoft SQL Server 2005->配置工具->SQL Server Configuration Manager”,选择“SQLServer 2005 网络配置->MSAQLSERVER的协议”和“SQL Native Client”,把TCP/IP和Nameed Pipes的状态设置为Enabled,可能有已设为Enabled。重新启动计算机,再次检验是否打开1433。
三、实例计算
实例路网如图所示,这是我们GIS的路网,存储在数据库里。
程序如下:
importnetworkx as nx #导入复杂网络计算扩展库
importpyodbc #导入ODBC连接扩展库
importmatplotlib.pyplot asplt #导入绘图扩展库
G=nx.Graph() #定义网路图
cnxn = pyodbc.connect('DRIVER={SQLServer};SERVER=192.168.212.231;DATABASE=ptestNet;UID=sa;PWD=123456')
#连接函数,此处服务器必须设为IP
cursor = cnxn.cursor() #创建游标,可理解为执行连接
forrow in cursor.execute("select * from point"):
#执行SQL语句并在循环语句中调用结果集
G.add_node(row.ID) #给网络图加点,我的ID为点索引字段
forrowt in cursor.execute("select * from Line"):
#执行SQL语句并在循环语句中调用结果集
G.add_edge(rowt.EID,rowt.SID) #给网络图加边,EID和SID分别为起始点字段
nx.draw(G) #绘制网络图G
plt.show() #显示网络图G
结果如图所示
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-27 08:25
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社