AIIC学习日记-python篇

文章目录

      • python
          • 2020-2-25 anaconda+pycharm安装
            • 2020-2-25 numpy入门
          • 2020-2-28 python环境变量设置、notepad++编辑器
            • 2020-2-28 notepad++编辑器、pycharm段注释
          • 2020-2-29 python脚本编写Verilog文件
          • 2020-3-3 python科学制图
          • 2020-3-4 python入门class、import
          • 2020-3-4 python多线程
          • 2020-3-4 python界面-Tkinter
          • 2020-3-15 python常规操作以及对文件的读取处理
            • 常规操作
          • 2020-3-17 python3D绘图
            • 安装Matplotlib
            • 操练
          • 2020-3-18 python多个文件调用
        • 中兴算法大赛
          • 2020-4-22 python join,split()
          • 2020-4-23 慢慢学数据结构咯
            • 2020-4-26 digraph画无向图
            • 2020-4-26 Python中的*使用
            • 2020-4-26 A*算法再学习
          • 2020-4-27 继续学习
            • 2020-4-27 class继承
            • 2020-4-27 贪心算法+Qlearning
          • 2020-4-29 搬运class和文本处理代码合并,debug
          • 2020-4-30 车厢载重考虑
          • 2020-5-1 多个测试用例的验证、bat批处理
          • 2020-5-2 调bug
            • 2020-5-2 bug:R0
            • 2020-5-2 bug:站台人数超员
            • 2020-5-2 终于突破0分了
          • 2020-5-2 改进方向
            • 如何加快规划速度
            • 同源同宿
            • 人员规划(有余重但没有人的时候不能继续安排)
            • R矩阵更新
            • 提高python代码运行速度:说到底还是数据结构问题
          • numpy 高维变1维数组
          • 2020-5-6 总结中兴挑战赛(迪杰斯特拉派)

python

2020-2-25 anaconda+pycharm安装

搞AI,除了理论,还要当个调包侠。不动手怎么行呢,这也不会,那也不会。

pycharm+anaconda安装(官网),在anaconda里进入terminal,下载python,需要换源(比较快)然后装一些没有的库(视项目文件需要而下载)
然后在pycharm中建立工程,建立.py文件,在File菜单下settings,在project下project Interpreter(解释器)里add(右边齿轮)anaconda里刚下载好的python。(不是新建环境,而是存在的环境,解释器选…/anaconda/envs/tools/python.exe,自动会有一个conda依存,目录为…/anaconda/Scripts/conda.exe。勾上最后一个选项。(之前一直选envs/tools/目录下的conda,没有找到)(scripts目录里找python,也是自己智障了)

这样做可以很方便的管理python版本。

没有的东西嘛,pip(or pip3)(同linux里的install)安装。

其实之前也有下载一个普通的python的IDE3.7.4,但是那个只有对应的版本。打开的时候是shell界面,只能写一句enter解释一句;在file里创建一个文件之后,就能写很多行了。

言归正传,pycharm里也能写shell,在左下角里点terminal,输入python(或者python3?)进入shell,写一句解释一句,其实在学习初期用这种方式还是比较舒服的。(写成文件的话,每次要print才能看到内容)

2020-2-25 numpy入门

跟着链接里的练习咯。其实做AI主要还是调包不是咯,python够调包就行,很多讲python(或者讲numpy)的也没这个好——对于纯新手。
AI学习基础-numpy入门

想多了解下python的话可以看这个PDF。
AI基础-python入门

以下为练习:初始化数组,以及数据类型

>>> np.arange(1,20,8)#1-20之间,每隔8,生成一个有序一维数组
array([ 1,  9, 17])
>>> np.arange(1,20,5)
array([ 1,  6, 11, 16])
>>> np.arange(12).reshape(3, 4)#在0-12内
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

>>> np.zeros((2,3))#创建一个2行3列的数组,其值全0
array([[0., 0., 0.],
       [0., 0., 0.]])
>>> np.ones((3,4))#创建一个3行4列的数组,其值全1
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
>>> np.empty((5,2)) #生成一个五行二列的数组,其值无限趋近于0
array([[6.95251225e-310, 1.07378333e-311],
       [1.07376636e-311, 0.00000000e+000],
       [0.00000000e+000, 0.00000000e+000],
       [0.00000000e+000, 0.00000000e+000],
       [0.00000000e+000, 0.00000000e+000]])

>>> data=np.array([1,2,3])
>>> data.dtype #查看数据类型
dtype('int32')
>>> f=data.astype(np.float32)#转换数据类型为32位浮点数 #可用于证明低精度数值不影响学习结果
>>> f.dtype
dtype('float32')

以下为练习:向量化(矩阵运算,线性代数)
数组的重要性在于,我们不用编写循环就可以对数据执行批量运算。也就是矢量化。在大小不同的数组之间的运算叫广播。

>>> d1=np.array([[1,1,1],[1,1,1]])
>>> d2=np.array([[2,2,2],[2,2,2]])
>>> d1+d2
array([[3, 3, 3],
       [3, 3, 3]])
>>> d1*d2
array([[2, 2, 2],
       [2, 2, 2]])
>>> d1/d2
array([[0.5, 0.5, 0.5],
       [0.5, 0.5, 0.5]])

>>> d1.T  #转置
array([[1, 1],
       [1, 1],
       [1, 1]])
       
>>> d1*0.5  #广播:将标量0.5和数组每个数相乘
array([[0.5, 0.5, 0.5],
       [0.5, 0.5, 0.5]])

有关数组的更多信息可以看这个:数组
a=np.array(2,3)和b=np.array(3,2)是不能相乘的。
c=np.dot(a,b)是可以的

2020-2-28 python环境变量设置、notepad++编辑器

最近需要用脚本写Verilog文件。无奈作死在电脑上开了第二个账户(这样以前很乱的桌面就没有了,崭新的世界–同时很多配置也没有了,pycharm,anaconda的虚拟环境也变成了未激活)

为了将python设置成环境变量,四处寻找秘法。anaconda下载及python环境变量设置中所言,在path里添加各种路径,还是无效。
最后发现,居然是anaconda下载的python的虚拟环境没有激活,所以导致网上的各种良方都没有作用。激活之后,加上环境变量,可以随意用python写脚本了,汗!
感谢下面这位小哥的conda python安装

2020-2-28 notepad++编辑器、pycharm段注释

由于使用的notepad++编辑器,需要段注释,所以学习了一下。

单行、多行注释 #方式 :ctrl+k
取消单行、多行、区块注释 :ctrl+shift+k
区块注释或取消 #方式 :ctrl+q

顺便写一下pycharmIDE,段注释:
ctrl+/

2020-2-29 python脚本编写Verilog文件

1.首先我需要使用python的函数,创建了一个Func.py的文件,向里面写入:

def Add(x,y): #冒号!语法规则
    z=x+y
    a=z
    return z,a

在另一个脚本test.py:

from Func import Add #从自建的Fun库里调用函数(不需要输入参数)

x=Add(3,5)
print(x)

在test.py文件的目录下用cmd执行该文件:python test.py
结果是(8,8),结果正确,但是返回的是元组而不是两个单独的数字。
python中需要注意:函数必须先定义、后调用(函数调用函数例外)。
函数输入变量为自定义的字符时,记得双引号:‘ 字符’
自学测试完毕,开始下一步。

2.创建文件(有b.v这个文件的时候,自动覆盖其内容)

file=open('./b.v','w') #生成文件
file.write('hello')
file.close()

打开文件(没有b.v这个文件的时候会报错)

file=open('b.v','w') #生成文件
file.write('hello1')
file.close()

注意print()打印变量和file.write(’{list}’)
write()函数里只能用字符类型,用于编码内容**。如何写入变量?** file.write(f ’ {变量} ’ )
write()模式’a’,代表追加模式’a’,可以实现多次写入。即每次执行都会在上一行的基础上,换行写入。还有一个模式,在’w’写入模式下,当我们下次写入变量时,会覆盖原本txt文件的内容
在python里,打印字符需要用print(‘hello’) ,而不是print(“hello”),和C有区别。

3.python中需要注意:小括号,中括号,花括号意义不一样

4.python没有switch-case。
python的if-elif-else语句:

5.对于python能自己定义数据类型,所以不经意间有些数据和自己想的不一样,会造成数据的误差甚至错误(习惯了verilog和C的变量定义,都是在算整数,突然来了个float让结果出错,懵了)
强制数据转换:

x=int(x)
int(x [,base ]) #但是我的编译器报错!只能用上面的形式

6.跨文件的全局变量(只有自己写一个py文件,原本没有这种用法)

debug方法:print!直接在有问题的地方插入,或者直接进入cmd,python脚本(shell)模式。
debug记录

float精度对结果的影响
cs和cx变量混淆。(由于case,多次复制,更改格式)
其实上一跳和下一跳都一样。1的右边是2,无论是1到2还是2到1,右边都是2。本来打算得到一个值,能方便放在变量里作为RTL的连线。但是这样得到的值,好像永远都不能满足要求?罢了,白写了一个函数。

7.python 特别喜欢
冒号,缩进

最后:
python制作verilog代码

2020-3-3 python科学制图

Scipy(科学计算库)
数据可视化简易入门

2020-3-4 python入门class、import

class
属性引用的语法:obj.属性
类实例化的语法:obj = 类名()
类中方法的调用:obj.方法名()

class里的self相当于一个形参,在多次实例化的时候,分别成为那个实例化的变量(复用)
继承:父类:class A:
子类:class B(A): #从A继承而来

import 模块名1 [as 别名1], 模块名2 [as 别名2],…: (可以不用as后面的部分)使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。
from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…: 使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。

2020-3-4 python多线程

python之多线程

2020-3-4 python界面-Tkinter

python界面 | 实战Tkinter图形界面开发

涵盖库,查指令:菜鸟教程

Canvas语法格式

#创建画布
canvas = Canvas ( master, bg='white',
		width=200, height=200,
		option=value, ... )#master为self或tk( tk=Tk() )
#画线
line = canvas.create_line(x0, y0, x1, y1, ..., xn, yn, options)#option为长宽颜色等可选项
# 创建一个矩形,坐标为(10,10,110,110)
rectangle1=canvas.create_rectangle(10,10,110,110)
#插入图像
filename = PhotoImage(file = "sunshine.gif")
image = canvas.create_image(50, 50, anchor=NE, image=filename)

#更新画布
canvas.pack()
2020-3-15 python常规操作以及对文件的读取处理
常规操作

1.pyhton数据类型:元组(类似ROM,只能写一次)列表(类似数组,不过是一维的)np数组 字典(需要一个关键词去寻找,这个关键词为字符型,不可能用变量作为字典关键词
可以用print(type())去查看数据类型类型不同时,if等判断条件无效
set={1,2} #不支持索引
list=[1,‘2’]#支持索引,和一维数组差不多

2.定义list[1]表示只有一个元素,访问时只能用a=list[0](不能用1,计算机的第一个 都是从0开始的
numpy 定义的数组也一样
list[0]表第一个
list[0:6]表示第1-6个(6以前)
list[6:12]表示7-12个
list[1:]表示第1个-末尾所有

将list里的字符转换为int类型:(从txt里读入的数据都是str类型,需要转化)

  data=['1','2']
  data=list(map(int,data))#将列表的字符转化为int

但是如果txt里有回车,按行读取的话列表会有空格,转化失败(空格不是字符型),先去掉空格:

while ' ' in all_data:#除去空格,有空格下一步无法执行(比如某行为空的话)
    all_data.remove(' ')
all_data=list(map(int,all_data))#将列表的字符转化为int

先定义一个list的长度(全局),用list作为函数入口参数时,长度可能不一致(元素为空格不计入?不清楚),导致……报错

  1. cnt不搞好的话,死循环了。
	 while(cnt<10):
        if cnt==4:
            task_agent()
            continue#break直接跳出while
        else :  
            cnt += 1  # 不能只放if或else里

4.去除空格,不然把列表的值赋给np数组时 老是报错

temp_data=temp_data.strip()#除去空格
temp_data=int(temp_data)#list类型为str,存入np可能会有问题
Router_table[Router_ID,i]=temp_data #最后np还是把元素变成float类型了

5.伪静态变量。C有static,python没有。如果每次进函数的时候都cnt_r=0,肯定不行。那么把他当成全局变量,定义的时候初始化cnt_r=0,每次进入函数cnt_r就不会被重置了。

cnt_r=0#全局变量
def get_data(all_data,cnt):
    global cnt_r                     
    if((cnt-1)%5==0) and (cnt!=1) :#agent会跳过一个cnt不取值,cnt=5时又不会进入这个函数。只能cnt=6时-1
        cnt_r+=1
    CNT= cnt-cnt_r  #消除agent计算时浪费的1clk

6.python无&& 只有and

7.没事就上百度,print找找变量的问题。不过应该有更简单的方法(像MATLAB一样监控变量)

8.用元组构造列表,列表名是变量

g_list={}
 for i in range(Qsize):
     g_list["router_table"+str(Router_ID)]= table #构造不同的列表名
if backx  and backy and backz =='ok':#得不到正确的结果
if backx =='ok' and backy=='ok' and backz =='ok':
2020-3-17 python3D绘图
安装Matplotlib

pip是不可能了,老是报错(读超时)还是去网站上下载把。Matplotlib下载网址
cp37是Python版本3.7。

算了还是换源pip把,太慢了。换源后起飞,不过安装最后出了问题,不信任换的源,解决办法解决办法

操练

热力图

借鉴大佬代码
其中的直方图很nice。

将当前空间拆分建立新的子图,子图个数为四,按照2x2矩阵排列方式进行,当前子图为四个子图中的第一个:(以创建多个3D图)

ax = fig.add_subplot(2, 2, 1, projection='3d')
2020-3-18 python多个文件调用

如果已经有一个主main了,会调用模块1.py(1.py会调用main.py),
你又新写了一个模块2.py(需要调用1.py),那么会报错。因为2在运行的时候调了1,1调main,main又调1,关系复炸了。

中兴算法大赛

2020-4-22 python join,split()

最近在参加中兴算法大赛,选的迪杰斯特拉派,求网络均衡,题目太繁琐,望而生畏劝退一拨人。后来题目组的大佬们又是调整题目,又是分享题目思路,给很多测试例子。这不,群内从300=>700+。我一菜鸡。

咳,正传。

处理官方给的测试用例 test.txt,着实不容易,要读入站台人员信息,轨道信息,货物信息,一共5000行+,每一行得到之后都要处理,这离不开split()、replace()等等函数。

顺便学习了一波join。join和split相反,合成字符串

2020-4-23 慢慢学数据结构咯

数据结构也是硬伤啊,一共需要哪些东西,对事物建模,然后抽象出变量,变量名,整个系统如何运作。
迪杰斯特拉、ksp、贪心算法、启发式算法。

老老实实地搞吧,从0学class。突然发现这么大的数据量,有那么多相通的参数,不用面向对象,用单独的函数式编程,有点头大(虽然也能做,但是对于封装和以后的而调用。。。emmm)

2020-4-26 digraph画无向图

太难了,还是先看看题目的站台连接关系吧。想用A*算法,但是H函数不好预估,因为这并不是一个二维的平面,而且,得到的站台也是邻接矩阵的关系,并不是一张地图。
graph无向图、有向图作画

难受,graph不能只通过pip下载,还需要装软件,然后修改环境变量。

还是不行。。

最后重启电脑,就好了!???

conda里装digraph

2020-4-26 Python中的*使用

*是为了传递参数啦。
Python中的*使用

2020-4-26 A*算法再学习

之前了解过A但是没有具体去实现过,现在想用A+Qrouting来做中兴算法大赛。准确的说,大概的思路是,父类构建一个环境(站点人员,轨道车厢以及载重),子类构建一个货物(含货物的重量,轨道信息,车厢信息)。调度算法用Qlearning和dijkstra其实都可以,但是算的挺慢的,所以想用A*算法中的启发函数来减少寻找路径所需要的时间。

但是,一般的A*算法的地图都是2D的,而货物传输的地图并不是2D的,我目前能得到的只是一个站台与站台之间的邻接矩阵,这可怎么用启发函数(一般来说启发函数是 目的点和当前点之间的距离,如果不是2D地图。。)

欸,可以学习到这个启发函数嘛。先学一遍,把所有的边权重都设1,每次经过就衰减1,(最后取反,每个1代表1跳,也就是距离远近)这样得到了一个跳数表,也就是启发函数了。

这样每次规划货物路径的时候都能少去探索一些节点。毕竟只有60s的时间。不容易。

2020-4-27 继续学习
2020-4-27 class继承

python class的使用

Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

2020-4-27 贪心算法+Qlearning

这种组合能大幅地缩减学习的时间,暂时不用A了。(把A重新配置好,估计比赛都结束了)

贪心算法是取周围最大的值,这正好可以用在Q学习过程中,选取一个最大值作为跳转。不过始终觉得有点,浪费了一些跳数(换来的是更简单)

3维数据找某一列

2020-4-29 搬运class和文本处理代码合并,debug
2020-4-30 车厢载重考虑
2020-5-1 多个测试用例的验证、bat批处理

见我的另一篇博客:
window平台的bat批处理

2020-5-2 调bug
2020-5-2 bug:R0

仔细查证,因为算法未收敛,导致错误的下一个站台,故轨道ID=0.

2020-5-2 bug:站台人数超员

昨晚设计了一晚人员,居然还是超员了。我想法是这样的,先规划路径,然后根据选定的轨道,访问车厢,如果车厢有空间,考虑是上货,下货(对应位置人员-1),转移(来去是否有人员,如果没有就安排人员,当然前提是站台还有人),不转移。

开始对着test.txt进行狂改,测试代码问题在哪儿。

2020-5-2 终于突破0分了

目前得分2.9分,排名137,我太菜了。

2020-5-2 改进方向
如何加快规划速度
同源同宿

这个可以提高4倍以上的分数,因为有很多重叠的源目站台可以减少规划的次数。

人员规划(有余重但没有人的时候不能继续安排)

我发现减少迭代次数(以前是5050,现在是3030)能增加得分,2.9->4.7但是站台人员超标了。

上货(-1),下货,转移(-2),不转移(-0),汇聚(-2),分流(-2)。
原来规划的路径上,新上了货物,这种不叫上货叫汇聚,来的方向也要安排一个人。

R矩阵更新
提高python代码运行速度:说到底还是数据结构问题

numpy最快,比原生还快

提升Python程序运行效率的方法总结:

  1. 函数、局部变量运行速度更快!
  2. 字符串连接缓慢,不要在循环中执行。而是使用Python的join方法。
  3. 循环里不要有点操作 : .append()
  4. 每种编程语言都会强调需要优化循环。当使用Python的时候,可以依靠大量的技巧使得循环运行得更快。然而经常漏掉的一个方法是:避免在一个循环中使用点操作
  5. 使用if i is 0 比 if i ==0 快一倍
  6. Python2中while 1比while True更快,Python3中一样
  7. 使用**而不是pow : 快10倍

优雅地写python代码

有哪些问题可以通过python使用一句原生语句求得

numpy 高维变1维数组
lastIndex = TrackEnvir.MapPlanned[:, current_state, Carindex] == 1 #如果该行有1就返回True 否则返回false 的一维矩阵
lastAllstate = np.argwhere(lastIndex == True)#得到1的位置(2维)
lastAllstate = lastAllstate.flatten()  # 多维转1D 寻找方便
2020-5-6 总结中兴挑战赛(迪杰斯特拉派)

其实这次比赛算很仓促吧,原因如下:

  1. 没有做历年的题目(好像前两年题目也不沾边)
  2. 读题不够充分,虽然题目有7页word。没有很好的把握好题目的装货、卸货、汇聚、分流、转移、不转移几种动作对分拣人员的影响,前期建模不好(没有考虑过这几种动作的模型),导致后面越改越乱。
  3. 题目的思路方向有问题。一开始就布局到所有情况(但并不是都考虑正确了,比如一开始应该先不考虑货物转移,每次转移需要2个人员,而站点一般人数都不够用,所以前期不应该考虑货物转移)(最开始设计的货物转移,但是只能满足一部分情况)正确的思路是先同源同宿货物汇聚,然后路径规划,再考虑货物转移(有剩的人)。(汇聚货物能减少人员的使用,同时减少路径规划所需要的次数即时间)路径规划最好是启发式算法(这样更快,普通的迪杰斯特拉或者Q算法都慢了,对于A算法H函数不好设计)
  4. python的数据结构没有充分理解(包括面向对象class),不清楚如何优雅的写python代码(怎么写执行更快)
  5. 对python常用的numpy库的很多用法并不了解,现学现用;不会用其他的库比如digraph来绘制整个物流场所的地图。
  6. debug的能力不是很强,第一次写超过千行的python代码,维护和找bug的能力稍微欠缺了。
  7. 缺乏回退。对于规划失败的货物,要吐出来其资源(人员和重量),也就是需要一个temp。

不过,学到了挺多东西:
python技术(进一步锻炼)
面向对象、数据结构、情景建模
在找bug上,根据错误自己构建测试错误条件去测试(给定的测试例无序,很难发现问题之处,不利于查验是否改正了bug)

总结还是老老实实写硬件逻辑吧。软件作为辅助。该回去画版图,设计cpu了。(微处理器结构的老师说我们这些个缺乏软件的思维,的确,造了cpu就是给软件程序员用的,不了解程序员怎么写代码,这cpu设计出来干瞪眼?)

你可能感兴趣的:(AIIC)