|
|
|
發(fā)新文章 |
|
|
2018年12月26日
摘要: 其實(shí)知識(shí)點(diǎn)沒什么困難的,就是編輯器中輸入這些公式稍微有點(diǎn)麻煩。卸載這邊可以給大家參考,我本地整理的不一定都會(huì)發(fā)上來。
線性代數(shù)中的矩陣是什么?
一般是指n元一次方程組,未知數(shù)和元相同。
row picture, 行圖像, 對(duì)于三維方程組來說,就是一個(gè)平面
column picture,列圖像, 對(duì)于三維方程組來說,就是一個(gè)向量(起... 閱讀全文
2017年7月15日
java開發(fā)搞了兩個(gè)月了,由于前后端都要打通,發(fā)現(xiàn)了一些以前沒注意的問題。
我自己的經(jīng)驗(yàn)是這些:
RPC+Model:采用grpc+protobuf的方案,在android和ios之間都很方便通信,比起傳統(tǒng)的HTTP(s)+JSON方式,開發(fā)效率和運(yùn)行效率都要高很多,不過門檻比較高一點(diǎn),工作兩年的程序員應(yīng)該能比較順暢的入門,主要是ios端配置方面稍微麻煩一些。
IPC:android多個(gè)應(yīng)用間的通信,測(cè)試過了aidl的方式,目前開發(fā)起來比較麻煩,報(bào)錯(cuò)系統(tǒng)做得太差了,沒有找到合適的插件工具處理在android studio中的問題。估計(jì)后面干脆改成grpc的方式看看效果如何。
長(zhǎng)鏈接:打算使用netty,還要看看開發(fā)的難易程度。
開發(fā)模式:看樣子MVC真的已經(jīng)過時(shí)了。
1. ios和android 都可以使用MVVM,比MVC解耦能力強(qiáng)得多。
2.服務(wù)器上,ESB容器外加OSGi組成SOA,也要方便很多。
3.linux客戶端,QT半殘廢,Xwindow主流包裝,已經(jīng)是gnome。
SQL:持久層和緩存層一般都是注冊(cè)和保存數(shù)據(jù)使用
1.注冊(cè)方案,鑒于zookeeper坑太多,偏向于選擇consul,consul不像zookeeper這么抽象,封裝了服務(wù)化的http api,非常方便調(diào)用,并且增加了對(duì)服務(wù)健康檢查。
2.為什么不選用redis?沒深入研究redis。個(gè)人認(rèn)為codis方案(豆瓣開發(fā)的分布式緩存)能夠滿足實(shí)際場(chǎng)景的需求。
2017年4月12日
@import url(http://www.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
買了這個(gè)板子有好久了,去年放著沒心思搞,今天覺得該干點(diǎn)事了。
我的目標(biāo)是要使用tx1上的攝像頭來抓取視頻幀并做識(shí)別。
首先,jetson tx-1的板載攝像頭是不提供默認(rèn)v4l2的驅(qū)動(dòng)的,所以我自己給它找了驅(qū)動(dòng),但是這個(gè)驅(qū)動(dòng)是基于gstreamer的。
所以,我整合了一套gstreamer的管道命令,如下:
export CLIENT_IP=127.0.0.1
gst-launch-1.0 nvcamerasrc fpsRange="30 30" intent=3 ! nvvidconv flip-method=6 ! 'video/x-raw(memory:NVMM), width=(int)960, height=(int)540, format=(string)I420, framerate=(fraction)30/1' ! omxh264enc control-rate=2 bitrate=4000000 ! 'video/x-h264, stream-format=(string)byte-stream' ! h264parse ! queue ! omxh264dec ! nvvidconv ! 'video/x-raw, format=(string)UYVY' ! videoconvert ! jpegenc quality=30 ! rtpjpegpay ! udpsink host=$CLIENT_IP port=5000 sync=false async=false
這段代碼把攝像頭上的內(nèi)容抓取并壓縮為960p的30幀的h264格式的視頻流,并通過udp協(xié)議丟出到板卡的5000號(hào)端口上。
以上是gstreamer的服務(wù)器端,接下來,可以將內(nèi)容抓取下來看看。
客戶端的命令我就不寫了,直接使用代碼。這段代碼是從youtube上的jetson的openCV教程組裝來的,自己找了一下opencv處理gstreamer的API,搭上就可以用。
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/calib3d/calib3d.hpp>
using namespace cv;
int main(int, char**)
{
VideoCapture input("./stream.sdp");
if(!input.isOpened()){ // check if we succeeded
std::cout<< "open failed" << std::endl;
return -1;
}
Mat img, img_gray;
OrbFeatureDetector detector(7000);
vector<KeyPoint> img_keypoints, car_keypoints;
Mat img_descriptors, car_descriptors;
input.read(img);
Mat car;
img(Rect(400, 320, 150, 100)).copyTo(car);
detector(car, Mat(), car_keypoints, car_descriptors);
drawKeypoints(car, car_keypoints, car);
for(;;)
{
if(!input.read(img))
break;
detector(img, Mat(), img_keypoints, img_descriptors);
drawKeypoints(img, img_keypoints, img);
BFMatcher matcher;
vector<DMatch> matches;
matcher.match(car_descriptors, img_descriptors, matches);
vector<Point2f> car_points, img_points;
for(int i=0; i < matches.size(); ++i){
car_points.push_back(car_keypoints[matches[i].queryIdx].pt);
img_points.push_back(img_keypoints[matches[i].queryIdx].pt);
}
std::cout<<"car points count = " << car_points.size() << std::endl;
if(car_points.size() >= 4){
Matx33f H = findHomography(car_points, img_points, CV_RANSAC);
vector<Point> car_border, img_border;
car_border.push_back(Point(0, 0));
car_border.push_back(Point(0, car.rows));
car_border.push_back(Point(car.cols, car.rows));
car_border.push_back(Point(car.cols, 0));
for (size_t i = 0; i < car_border.size(); ++i){
Vec3f p = H * Vec3f(car_border[i].x, car_border[i].y, 1);
img_border.push_back(Point(p[0]/p[2], p[1]/p[2]));
}
polylines(img, img_border, true, CV_RGB(255, 255, 0));
Mat img_matches;
drawMatches(car, car_keypoints, img, img_keypoints, matches, img_matches);
imshow("img_matches", img_matches);
}
// imshow("car", car);
// imshow("img", img);
if(waitKey(27) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
編譯的makefile會(huì)麻煩一點(diǎn):先寫一個(gè)cmake的配置文件CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(hello)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(cv_hello hello.cpp)
target_link_libraries(cv_hello ${OpenCV_LIBS})
執(zhí)行命令:cmake ./ && make
然后生成cv_hello,可以執(zhí)行。
關(guān)鍵配置文件是stream.sdp文件,這個(gè)文件幫我減少了命令行的麻煩。內(nèi)容如下:
[stream.sdp]
c=IN IP4 127.0.0.1
m=video 5000 RTP/AVP 96
a=rtpmap:96 JPEG/4000000
全部?jī)?nèi)容結(jié)束??梢钥吹綌z像頭的視頻內(nèi)容了
2017年3月13日
@import url(http://www.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
穩(wěn)定的分層:
數(shù)學(xué)家/物理學(xué)家常常會(huì)說:“c是個(gè)常量,p是個(gè)參量,v是個(gè)變量”。他們的意思是這三個(gè)都是可變的,但是存在一種可變的層次差別。c構(gòu)成全局條件,p構(gòu)成全局性更弱的一種條件---他可以在c固定時(shí)保持變動(dòng),最后v可以在c和p保持固定時(shí)變來變?nèi)サ摹?/div>
設(shè)想牙科醫(yī)生不可能讓病人的位置變來變?nèi)サ?,但是醫(yī)生自己變動(dòng)位置是有用的。其中的概念便是:c是病人,p是病人的牙齒,而v是醫(yī)生本人。
框架和嵌套:
在框架語言中,可以說情景的心智表示包含著彼此嵌套的框架。
設(shè)想有若干個(gè)柜子,每個(gè)柜子上可以裝若干個(gè)抽屜,這些抽屜可以放進(jìn)“子框架”,你可以把別的柜子壓縮后放進(jìn)去,這個(gè)過程可以遞歸。
在思想層面,我們會(huì)把“人”的概念扭曲壓縮。比如在羽毛球賽球場(chǎng)上,你會(huì)把人考慮成一個(gè)隊(duì)員,你已經(jīng)把“人”這個(gè)概念壓縮到“羽毛球賽”中去了。
用框架進(jìn)行知識(shí)表示的理論依賴于這樣一個(gè)想法:世界是由半封閉的子系統(tǒng)構(gòu)成的。
滑動(dòng):
我們會(huì)把想法進(jìn)行變形,我們必須要適時(shí)的產(chǎn)生使得概念變形的能力,沒有什么絕對(duì)不變的東西。也不能把事情弄得模凌兩可的,以至于根本喪失意義。
我們會(huì)把圓形“滑動(dòng)”為橢圓形,或者凹陷的圓形。但是不會(huì)把圓形“滑動(dòng)”成三角形,雖然他們都是閉環(huán)圖形。
跳躍性和全局后退:
設(shè)想有一條狗,目標(biāo)要獲得一塊骨頭,前方有一面柵欄,柵欄有門。
“新手”會(huì)直接沖向柵欄有骨頭的位置,然后碰到柵欄過不去了,就會(huì)“旺旺。。”。“老手”會(huì)先跑到門口,繞過門口然后再跑向骨頭。
這里有一個(gè)思維跳躍性的過程,曲線救國(guó)的方式,在多次直接方式取得不好的后果后,高級(jí)的思維需要跳出原有的思維,后退幾步來看待問題。這在深度學(xué)習(xí)上,是一種經(jīng)驗(yàn)演變。但是他應(yīng)該可以從思維的不同層次的滑動(dòng)中推演出來。
演員系統(tǒng):
框架+演員=符號(hào)。演員之間傳遞消息,但是消息的解釋取決于演員自己的特性,于是符號(hào)的內(nèi)容將由框架和演員共同決定.演員是信號(hào)的啟發(fā)器
多重表示:
副總統(tǒng)是政府這部汽車的備用輪胎。概念骨架不僅必須存在于不同的抽象層次上,還需要存在于不同概念“維度”上。
關(guān)于人工智能的幾個(gè)的問題:
1.程序能否寫出優(yōu)美的樂曲?
會(huì)的,但不是現(xiàn)在。音樂是情感的語言,精神世界不可低估。能有如此能力的“程序”必須得能自己走進(jìn)這個(gè)世界,在紛繁的世界中與生活抗?fàn)帲⒚繒r(shí)每刻體驗(yàn)到自己的感受。他必須懂得暗夜里涼風(fēng)帶來的喜悅與孤獨(dú),懂得對(duì)于帶來溫暖愛撫地手掌的渴望,還要能體驗(yàn)到一個(gè)人死去后引起的心碎與生活。明了放棄與厭世,悲傷與失望,決心與勝利,虔誠(chéng)與敬畏。能把希望/恐懼/煩惱/歡樂/寧?kù)o/不安等對(duì)立的情緒混合到一起。。。。
2.是否可以在低層次設(shè)置核心參數(shù)控制程序?
不能,如同人不會(huì)在意自己每天死掉幾千個(gè)神經(jīng)原一樣,我們幾乎沒事,除非你要給大腦做手術(shù)折騰的太厲害。但這已經(jīng)不屬于低層次控制
3.人工智能是否存在超智能?
可能和規(guī)模有關(guān),我們也許有一個(gè)臨界點(diǎn),也許人類已經(jīng)位于零界點(diǎn)之上。有一天會(huì)達(dá)到全能自我認(rèn)知,即笛卡爾的“我思故我在”將演變?yōu)?#8220;我在思我所思”。
也許人工智能有一天達(dá)到了人類的智能,但是他會(huì)進(jìn)入下一階段。我們可能還不知道那是什么樣的。
4.是否存在能擊敗任何人的下棋程序?
可能已經(jīng)有,但是現(xiàn)在還只是下棋。
跳出下棋,普遍的去看,真正的只能必然依賴于一種縱覽全局的能力---即可以說是在程序中編入了一種“跳出系統(tǒng)外”的能力。一旦實(shí)現(xiàn)了這一步,你就無法再完全控制這個(gè)程序了,他將超過一個(gè)特定的臨界點(diǎn),那時(shí)你不得不與你造出來的東西打交道。
智能的可抽取性
為闡明大腦中發(fā)生的思維過程,有兩個(gè)基本問題
一個(gè)是解釋低層次的神經(jīng)發(fā)射通訊是如何導(dǎo)致高層次的符號(hào)激活通訊的,
另一個(gè)是自足地解釋高層次的符號(hào)激活通訊——建立一個(gè)不涉及低層神經(jīng)事件的理論。
如果后者是可能的——這是目前進(jìn)行的所有人工智能研究的基礎(chǔ)中的一個(gè)關(guān)鍵假設(shè)——那么智能就可能實(shí)現(xiàn)于不同于大腦的其它硬件上。那將表明智能是一種可以從它所在的硬件中"抽取。出來的性質(zhì)——換句話說,智能將是一種軟件性質(zhì)。
這將意味著意識(shí)和智能這一現(xiàn)象的確和大多數(shù)極其復(fù)雜的自然現(xiàn)象一樣是高層次的它們有自身的高層規(guī)律,這些歸律依賴于低層,但又可以從低層中抽取出來。相反,如果沒有全部由神經(jīng)原(或模擬神經(jīng)原)組成的硬件就絕對(duì)無法實(shí)現(xiàn)符號(hào)觸發(fā)模式的話,這將意味著智能是一種局限于人腦的現(xiàn)象,比起那種可以用一個(gè)具有若干不同層次的規(guī)律體系來說明的現(xiàn)象,對(duì)它的
釋要困難得多。
2017年1月9日
find . -name *.swift | xargs perl -p -i -e '/NSIndexPath/IndexPath/g'
find . -name *.swift | xargs perl -p -i -e 's/NSIndexPath/IndexPath/g'
find . -name *.swift | xargs perl -p -i -e 's/heightForRowAtIndexPath/heightForRowAt/g'
#find . -name *.swift | xargs perl -p -i -e 's/CGRectMake/RectMake/g'
find . -name *.swift | xargs perl -p -i -e 's/cellForRowAtIndexPath/cellForRowAt/g'
find . -name *.swift | xargs perl -p -i -e 's/forRowAtIndexPath/forRowAt/g'
find . -name *.swift | xargs perl -p -i -e 's/didSelectRowAtIndexPath/didSelectRowAt/g'
find . -name *.swift | xargs perl -p -i -e 's/cellForItemAtIndexPath/cellForItemAt/g'
find . -name *.swift | xargs perl -p -i -e 's/shouldSelectItemAtIndexPath/shouldSelectItemAt/g'
find . -name *.swift | xargs perl -p -i -e 's/didSelectItemAtIndexPath/didSelectItemAt/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_\:NSURLSessionDataTask\!\, resp\:AnyObject\!\)/\(_, resp\) /g'
find . -name *.swift | xargs perl -p -i -e 's/\(_, rspObj:AnyObject!\)/\(_, resp\) /g'
find . -name *.swift | xargs perl -p -i -e 's/\(_, resp:AnyObject\!\)/\(_, resp\) /g'
find . -name *.swift | xargs perl -p -i -e 's/_:URLSessionDataTask!, responseObj:AnyObject!/_, responseObj/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_, error:NSError\!\)/\(_, error\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_:NSURLSessionDataTask!, error:NSError!\)/\(_, error\)/g'
find . -name *.swift | xargs perl -p -i -e 's/func doAction\(_ action: String, model: AnyObject\!, fromView: UIView\?\)/func doAction\(_ action: String, model: Any\!, fromView: UIView\?\)/g'
find . -name *.swift | xargs perl -p -i -e 's/CGPointZero/CGPoint.zero/g'
find . -name *.swift | xargs perl -p -i -e 's/CGFloat.max/\CGFloat\.greatestFiniteMagnitude/g'
find . -name *.swift | xargs perl -p -i -e 's/\.NoData/\.noData/g'
find . -name *.swift | xargs perl -p -i -e 's/\.Fail/\.fail/g'
find . -name *.swift | xargs perl -p -i -e 's/UIEdgeInsetsZero/UIEdgeInsets.zero/g'
#autoPinEdgeToSuperviewEdge
find . -name *.swift | xargs perl -p -i -e 's/\.autoPinEdgeToSuperviewEdge\(\.Leading/\.autoPinEdge\(toSuperviewEdge\: \.leading/g'
find . -name *.swift | xargs perl -p -i -e 's/\.autoPinEdgeToSuperviewEdge\(\.Trailing/\.autoPinEdge\(toSuperviewEdge\: \.trailing/g'
find . -name *.swift | xargs perl -p -i -e 's/\.autoPinEdgeToSuperviewEdge\(\.Bottom/\.autoPinEdge\(toSuperviewEdge\: \.bottom/g'
find . -name *.swift | xargs perl -p -i -e 's/\.autoPinEdgeToSuperviewEdge\(\.Top/\.autoPinEdge\(toSuperviewEdge\: \.top/g'
find . -name *.swift | xargs perl -p -i -e 's/codecToInstance\(/codec\(toInstance:/g'
find . -name *.swift | xargs perl -p -i -e 's/UIFont\.\.systemFont/UIFont\.systemFont/g'
#下面這兩句處理的是不同的函數(shù)
#find . -name *.swift | xargs perl -p -i -e 's/deselectRowAtIndexPath\(/deselectRow\(at:/g'
#find . -name *.swift | xargs perl -p -i -e 's/deselectRowAtIndexPath\(/deselect\(at:/g'
find . -name *.swift | xargs perl -p -i -e 's/\.locationInView\(/\.location\( in:/g'
find . -name *.swift | xargs perl -p -i -e 's/CGRectZero/CGRect.zero/g'
find . -name *.swift | xargs perl -p -i -e 's/\.dismissViewControllerAnimated\(/\.dismiss\(animated: /g'
find . -name *.swift | xargs perl -p -i -e 's/LocalCache\.sharedCache\(\)\.cachedObjectForKey\(/LocalCache\.shared\(\)\.cachedObject\(forKey/g'
find . -name *.swift | xargs perl -p -i -e 's/LocalCache\.shared\(\)\.cachedObject\(forKey/LocalCache\.shared\(\)\.cachedObject\(forKey\:/g'
find . -name *.swift | xargs perl -p -i -e 's/willDisplayCell/willDisplay/g'
find . -name *.swift | xargs perl -p -i -e 's/XRZPostLoadingView\.showSuccessfulWithTitle\(/XRZPostLoadingView\.showSuccessful\(withTitle\:/g'
#這個(gè)地方改了以后需要尾部添加括號(hào),需要手動(dòng)搜索NotificationCenter.default.post(name:NSNotification.Name(rawValue出來修改
find . -name *.swift | xargs perl -p -i -e 's/NSNotificationCenter\.defaultCenter\(\)\.postNotificationName\(/NotificationCenter\.default\.post\(name\:\ NSNotification.Name\(rawValue\: /g'
find . -name *.swift | xargs perl -p -i -e 's/\.showTextWithTitle\(/\.showText\(withTitle\:/g'
find . -name *.swift | xargs perl -p -i -e 's/\.showSuccessWithTitle\(/\.showSuccessful\(withTitle\:/g'
find . -name *.swift | xargs perl -p -i -e 's/\(task\:URLSessionDataTask\!\,\ respon\:AnyObject\!\)/\(_\,\ respon\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_,\ reponseObj\:AnyObject\!\)/\(_\,\ respon\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_\:URLSessionDataTask\!\,\ responseObj\:AnyObject\!\)/\(_\,\ respon\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_, responseObj:AnyObject!\)/\(_, responseObj\)/g'
find . -name *.swift | xargs perl -p -i -e 's/task:URLSessionDataTask!, error:NSError!/_, error/g'
find . -name *.swift | xargs perl -p -i -e 's/\(task:URLSessionDataTask!, responseObj:AnyObject!\)/\(_, responseObj\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_\:URLSessionDataTask\!\,\ error\:NSError\!\)/\(_\,\ error\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\.popToRootViewControllerAnimated\(/\.popToRootViewController\(animated: \/g'
find . -name *.swift | xargs perl -p -i -e 's/removeAlert\(/let _ = removeAlert\(/g'
find . -name *.swift | xargs perl -p -i -e 's/\.addObject\(/\.add\(/g'
find . -name *.swift | xargs perl -p -i -e 's/\.rac_newValueChannelWithNilValue\(/\.rac_newValueChannel\(withNilValue:/g'
find . -name *.swift | xargs perl -p -i -e 's/\.NotMore/\.notMore/g'
find . -name *.swift | xargs perl -p -i -e 's/\.ChatRoom/\.chatRoom/g'
find . -name *.swift | xargs perl -p -i -e 's/\.Normal/\.normal/g'
find . -name *.swift | xargs perl -p -i -e 's/MarkTableViewDD\.normal/MarkTableViewDD\.Normal/g'
find . -name *.swift | xargs perl -p -i -e 's/\.showFailWithTitle\(/\.showFail\(withTitle\:\ /g'
find . -name *.swift | xargs perl -p -i -e 's/\.heightFromHitModel\(/\.height\(fromModel\:\ /g'
find . -name *.swift | xargs perl -p -i -e 's/model\:AnyObject\!\,/model\:Any\!\,/g'
find . -name *.swift | xargs perl -p -i -e 's/func\ heightForModel\(_\ model\:AnyObject\!\)->CGFloat/func\ heightForModel\(_\ model\:Any\!\)->CGFloat/g'
find . -name *.swift | xargs perl -p -i -e 's/\.showSuccessfulWithTitle\(/\.showSuccessful\(withTitle\:\ /g'
find . -name *.swift | xargs perl -p -i -e 's/\.TouchUpInside\.touchUpInside/g'
find . -name *.swift | xargs perl -p -i -e 's/\.rac_signalForControlEvents\(/\.rac_signal\(for\:\ /g'
find . -name *.swift | xargs perl -p -i -e 's/\UIEdgeInsetsZero/\UIEdgeInsets.zero/g'
find . -name *.swift | xargs perl -p -i -e 's/\.systemFontOfSize\(/\..systemFont(ofSize:\ /g'
#find . -name *.swift | xargs perl -p -i -e 's/\.Normal/\.normal/g'
@import url(http://www.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
2016年7月12日
摘要: 這個(gè)有科學(xué)和政治意義哦 閱讀全文
2016年7月11日
A 左手摸墻算法的描述。
- 當(dāng)左手邊沒有墻時(shí),左轉(zhuǎn)前進(jìn)一步;
- 當(dāng)左手邊有墻且前方?jīng)]有墻時(shí),前進(jìn)一步;
- 當(dāng)左手邊有墻且前方也有墻時(shí),右轉(zhuǎn)前進(jìn)一步;
右手摸墻算法,只需將上面的“左”換作“右”,“右”換作“左”。
B 摸墻算法存在的問題,路徑冗余度搞高
比如在一個(gè)封閉房間中,左手摸墻算法和右手摸墻算法,使用的總能耗差異很大。
這個(gè)問題需要用用遺傳算法的思想剞劂。
多次使用左手和右手摸墻算法,依靠積累經(jīng)驗(yàn)來得到概率結(jié)論,然后根據(jù)不同條件進(jìn)行學(xué)習(xí)之后得知下一次采取哪種摸墻。
C 摸墻算法的性能改善
這個(gè)策略只是用與多次重復(fù)走一個(gè)迷宮的情況,對(duì)于走陌生的迷宮,不適用。
當(dāng)作出一次移動(dòng)時(shí),在路徑中查找先前是否經(jīng)過相同的點(diǎn),如果有那么就說明到這一步為止完成了一個(gè)圈子,在遺傳算法中,把它從路徑中除去。
多次行動(dòng)測(cè)試后,將會(huì)改善能耗效果,得到一點(diǎn)經(jīng)驗(yàn)概率結(jié)果。
去除圈子的算法是:
假設(shè)左手摸墻走,取得所有已經(jīng)過路徑記為dimension[all]
遍歷dimension all to 0, 碰見重復(fù)的路徑節(jié)點(diǎn),證明,這個(gè)點(diǎn)所經(jīng)歷的左手摸墻路徑是一個(gè)圈
將這個(gè)點(diǎn)標(biāo)記,以后在這里跳過這個(gè)位置的左手摸墻而采用直走跳過這個(gè)節(jié)點(diǎn)。
思考:如何給小車在開放空間中,做環(huán)形路徑點(diǎn)的標(biāo)記?
D 深度優(yōu)先搜索算法:
程序運(yùn)行時(shí)將按照從上到下,從左到右的順序遍歷整棵樹。
對(duì)于真實(shí)環(huán)境的物理小車,需要為小車安裝指南針或者陀螺儀才行。理論上加速度傳感器也能做到,但是算法上也許要稍微復(fù)雜一點(diǎn)。
深度優(yōu)先算法按以下規(guī)則執(zhí)行遍歷:
- 1,判斷當(dāng)前節(jié)點(diǎn)是否為目標(biāo)節(jié)點(diǎn),如是,返回成功。
- 2,檢查當(dāng)前節(jié)點(diǎn)是否還有未訪問過的子節(jié)點(diǎn),若否goto 4。 => 4,檢查當(dāng)前節(jié)點(diǎn)是否有上層節(jié)點(diǎn),若有訪問上層節(jié)點(diǎn),設(shè)為當(dāng)前節(jié)點(diǎn)。goto 1。
- 3,訪問子節(jié)點(diǎn),設(shè)為當(dāng)前節(jié)點(diǎn),設(shè)已訪問。goto 1。
- 5,返回失敗。
E 廣度優(yōu)先搜索算法:
-
1、從圖中某個(gè)頂點(diǎn)V0出發(fā),并訪問此頂點(diǎn);
2、從V0出發(fā),訪問V0的各個(gè)未曾訪問的鄰接點(diǎn)W1,W2,…,Wk;然后,依次從W1,W2,…,Wk出發(fā)訪問各自未被訪問的鄰接點(diǎn);
3、重復(fù)步驟2,直到全部頂點(diǎn)都被訪問為止。
廣度優(yōu)先的好處在于,如果有多個(gè)出口,那么第一個(gè)被找到的出口消耗時(shí)間最短,廣度最小,也即路勁最短。
另一個(gè)額外的好處是,可以知道所有的出口。得到一個(gè)統(tǒng)計(jì)結(jié)果。
2016年3月18日
摘要: 寫了太多tableView,發(fā)現(xiàn)每次都要實(shí)現(xiàn)TableView的兩個(gè)代理太麻煩。我在swift層面做了一次封裝。
我想要每個(gè)使用tableView的地方,都不在需要單獨(dú)實(shí)現(xiàn)一份tableViewDataSource和TableViewDelegate.
下面是理想的使用實(shí)例:
Code highlighting produced by Actipro CodeHighlighte... 閱讀全文
2015年10月9日
沒查到相關(guān)資料 ,說起來其實(shí)也挺簡(jiǎn)單的,就是使用UIImage的初始化函數(shù)重新初始化 - (UIImage *)imageWithScale:(CGFloat)scale{ return [UIImage imageWithData:UIImageJPEGRepresentation(self, 1) scale:scale]; } //swift的代碼就不寫了
//獲得的UIImage能夠適應(yīng)UIButton的無鋸齒縮放
2015年6月11日
@import url(http://www.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
直接給一段調(diào)用實(shí)例:@import url(http://www.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
var str = " \n \r \r\n \t Hello, \n playground \n \t \t \n \n\r \n "
let length = (str as NSString).length
let a = str.escapeHeadTailSpace()
let b = str.stringEscapeHeadTail(strs:["\r", "\n", "\t", "\r\n", " "])
對(duì)應(yīng)結(jié)果:
a::\t Hello, \n playground \n
b::Hello, \n playground
處理原理是:針對(duì)一個(gè)字符串,每次按一個(gè)字節(jié)跳過給定的字符串,并返回新得到的字符串,反復(fù)迭代,直到原字符串中已經(jīng)找不到給定的字符串。這樣,包含在中間的字符是不去除的。
將得到的新字符串反轉(zhuǎn),同樣在處理一遍。這樣頭尾部的排除字符串集都可以了。然后再將結(jié)果反轉(zhuǎn),得到原來順序的字符串,即我們需要的結(jié)果.
單純?nèi)コ渲兴械哪硞€(gè)字符集,有原生方法,不再次考慮
這是針對(duì)String的擴(kuò)展:
extension String{
func escapeSpaceTillCahractor()->String{
return self.stringEscapeHeadTail(strs:["\r", " ", "\n"])
}
func escapeHeadStr(str:String)->(String, Bool){
var result = self as NSString
var findAtleastOne = false
while( true ){
var range = result.rangeOfString(str)
if range.location == 0 && range.length == 1 {
result = result.substringFromIndex(range.length)
findAtleastOne = true
}else{
break
}
}
return (result as String, findAtleastOne)
}
func escapeSpaceTillCahractor(#strs:[String])->String{
var result = self
while( true ){
var findAtleastOne = false
for str in strs {
var found:Bool = false
(result, found) = result.escapeHeadStr(str)
if found {
findAtleastOne = true
break //for循環(huán)
}
}
if findAtleastOne == false {
break
}
}
return result as String
}
func reverse()->String{
var inReverse = ""
for letter in self {
println(letter)
inReverse = "\(letter)" + inReverse
}
return inReverse
}
func escapeHeadTailSpace()->String{
return self.escapeSpaceTillCahractor().reverse().escapeSpaceTillCahractor().reverse()
}
func stringEscapeHeadTail(#strs:[String])->String{
return self.escapeSpaceTillCahractor(strs:strs).reverse().escapeSpaceTillCahractor(strs:strs).reverse()
}
}
|