先抱怨下windows 64bit下的交叉編譯簡直折磨死人,倒騰了幾天之後決定還是切到linux下算了。虛擬機器雖然不給力,但是好歹能看出來優化後的結果。本文沒什麼講的,只是將上文說到的掃雷機的進化過程中耗時最長的函式用c重新寫一遍後比較下執行速度,廢話不多說,直接貼**,看結果。
原來判斷兩條直線ab和cd的python**是長下面這樣的,原理不再贅述。
def
lineintersection2d
(ax, ay, bx, by, cx, cy, dx, dy):
bx_ax = bx-ax
dy_cy = dy-cy
by_ay = by-ay
dx_cx = dx-cx
ay_cy = ay-cy
dx_cx = dx-cx
ax_cx = ax-cx
dy_cy = dy-cy
denominator = float(bx_ax*dy_cy - by_ay*dx_cx)
if -0.000005
0.000005: # rdenominator == sdenominator
# lines are parallel
return -1.0
rnumerator = ay_cy*dx_cx - ax_cx*dy_cy
snumerator = ay_cy*bx_ax - ax_cx*by_ay
r = rnumerator / denominator
s = snumerator / denominator
#print rnumerator, snumerator, denominator, r, sif0
<=r<=1.0
and0
<=s<=1.0:
return r
else:
return -1.0
再重複下python的**的執行效率如下:
lineintersection2d用python來執行實在是太慢了,用c改寫後的**如下,可以看到邏輯上是完全一樣的:
float lineintersection2d(float ax, float ay, float bx, float by, float cx, float cy, float dx, float dy)
float rnumerator = ay_cy*dx_cx - ax_cx*dy_cy;
float snumerator = ay_cy*bx_ax - ax_cx*by_ay;
float r = rnumerator / denominator;
float s = snumerator / denominator;
//printf("%f, %f, %f, %f\n", rnumerator, snumerator, r, s);
if(0
<=r && r<=1.0 && 0
<=s && s<=1.0)
return retval;
}
用c重寫後的速度如下:
區域性的函式速度提高了非常多,但是**中還有很多其他需要優化的地方,總體速度只提公升了大概60%。不過本系列只討論遺傳演算法和神經網路,就不再深究python**的瓶頸在哪兒了。(其實是水平太差又懶,不知道也懶得深究 >_
附上c**的完整**湊湊字數. :)
ccollision.c
#include
#include
#include
#include "python.h"
float lineintersection2d(float ax, float ay, float bx, float by, float cx, float cy, float dx, float dy)
float rnumerator = ay_cy*dx_cx - ax_cx*dy_cy;
float snumerator = ay_cy*bx_ax - ax_cx*by_ay;
float r = rnumerator / denominator;
float s = snumerator / denominator;
//printf("%f, %f, %f, %f\n", rnumerator, snumerator, r, s);
if(0
<=r && r<=1.0 && 0
<=s && s<=1.0)
return retval;
}static pyobject *
ccollision_lineintersection2d(pyobject *self, pyobject *args)
//呼叫c函式進行實際操作
returnv = lineintersection2d(ax, ay, bx, by, cx, cy, dx, dy);
//將結果轉換成乙個python物件返回
retval= (pyobject *)py_buildvalue("f", returnv);
return retval;
}static pymethoddef
ccollisionmethods = ,
,};void initccollision()
setup.py
#!/usr/bin/env python
from distutils.core import setup, extension
mod = 'ccollision'
setup(name=mod, ext_modules=[extension(mod, sources=['ccollision.c'])])
編譯安裝ccollision的命令是:
python setup.py install
遊戲開發中的人工智慧
今天非常開心,cocos官方直播居然在幾千人中中獎,可以買彩票了。言歸正傳,所謂的人工智慧,也就是大家常說的ai artificial intelligence 一說到ai可能就會讓人覺得比較深奧,其實也就是非玩家角色思考和行為的綜合。比如,在什麼樣的條件下,觸發什麼樣的行為。其實我們在遊戲開發中的...
Forecast的人工智慧
forecast智慧型專案管理軟體 人工智慧 英語 artificial intelligence,ai 亦稱機器智慧型,是指由人工製造出來的系統所表現出來的智慧型。通常人工智慧是指通過普通電腦實現的智慧型。人工智慧的研究可以分為幾個技術問題。其分支領域主要集中在解決具體問題,其中之一是,如何使用各...
資料蔣堂 人工智慧中的「人工」
自從alphago贏了之後,人工智慧就變得非常熱門了。不過,大家在關注 智慧型 時,卻很少把注意力放在 人工 上,似乎感覺上了人工智慧之後,一切都能自動化了。其實,這份智慧型的背後有著大量的 人工 還有相當多不能自動化的事情。這裡的 人工 主要體現在兩個方面 1.資料準備 現代的人工智慧技術,或者說...