遊戲程式設計中的人工智慧 補

2021-08-02 00:01:54 字數 3100 閱讀 4751

先抱怨下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.資料準備 現代的人工智慧技術,或者說...