@illuz
2015-01-13T08:11:25.000000Z
字数 4943
阅读 2369
复习
个人复习,一些仅是给自己的复习提示,具体请自己查书(=w=)。请勿乱传
移动
Bresenham,视线(略),拦截
// Bresenham
if (deltaCol > deltaRow) {
fraction = deltaRow * 2 - deltaCol;
while (nextCol != endCol) {
if (fraction >= 0) {
nextRow = nextRow + stepRow;
fraction = fraction - deltaCol;
}
nextCol = nextCol + stepCol;
fraction = fraction + deltaRow;
pathRow[currentStep] = nextRow;
pathCol[currentStep] = nextCol;
currentStep++;
}
} else {
fraction = deltaCol * 2 - deltaRow;
while (nextRow != endRow) {
if (fraction >= 0) {
nextCol = nextCol + stepCol;
fraction = fraction - deltaRow;
}
nextRow = nextRow + stepRow;
fraction = fraction + deltaCol;
pathRow[currentStep] = nextRow;
pathCol[currentStep] = nextCol;
currentStep++;
}
}
// 拦截,类似视线
void DoIntercept(void) {
Vector u, v;
Bool left = false;
Bool right = false;
Vector Vr, Sr, St;
Double tc;
Vr = Prey.vVelocity - Predator.vVelocity;
Sr = Prey.vPosition - Predator.vPosition;
tc = Sr.Magnitude() / Vr.Magnitude();
St = Prey.vPosition + (Prey.vVelocity * tc);
u = VRotate2D(-Predator.fOrientation, (St - Predator.vPosition));
u.Normalize();
if (u.x < -_TOL)
left = true;
else if (u.x > _TOL)
right = true;
Predator.SetThrusters(left, right);
}
U = - A / (r^n) + B / (r^m)
F = - nA / (r^(n+1)) + nB / (r^(m+1))
听说A*不考
概率论及贝叶斯技术
预测算法和诊断算法
预测算法
输入:给定贝叶斯网络B(包括网络结构m个节点以及某些节点间的连线、原因节点到中间节点的条件概率或联合条件概率),给定若干个原因节点发生与否的事实向量F(或者称为证据向量);给定待预测的某个节点t。
输出:节点t发生的概率。
(1)把证据向量输入到贝叶斯网络B中;
(2)对于B中的每一个没处理过的节点n,如果它具有发生的事实(证据),则标记它为已经处理过;否则继续下面的步骤;
(3)如果它的所有父节点中有一个没有处理过,则不处理这个节点;否则,继续下面的步骤;
(4)根据节点n的所有父节点的概率以及条件概率或联合条件概率计算节点n的概率分布,并把节点n标记为已处理;
(5)重复步骤(2)-(4)共m次。此时,节点t的概率分布就是它的发生/不发生的概率。算法结束。
诊断算法
输入:给定贝叶斯网络B(包括网络结构m个节点以及某些节点间的连线、原因节点到中间节点的条件概率或联合条件概率),给定若干个结果节点发生与否的事实向量F(或者称为证据向量);给定待诊断的某个节点t。
输出:节点t发生的概率。
(1)把证据向量输入到贝叶斯网络B中;
(2)对于B中的每一个没处理过的节点n,如果它具有发生的事实(证据),则标记它为已经处理过;否则继续下面的步骤;
(3)如果它的所有子节点中有一个没有处理过,则不处理这个节点;否则,继续下面的步骤;
(4)根据节点n所有子节点的概率以及条件概率或联合条件概率,根据条件概率公式,计算节点n的概率分布,并把节点n标记为已处理;
(5)重复步骤(2)-(4)共m次。此时,原因节点t的概率分布就是它的发生/不发生的概率。算法结束。
遗传算法
简单算法
轮盘赌算法
/* 按设定的概率,随机选中一个个体, P[i]表示第i个个体被选中的概率*/
int RWS() {
m = 0;
r = Random(0, 1); //r为0至1的随机数
for (i = 1; i <= N; i++) {
/* 产生的随机数在m~m+P[i]间则认为选中了i,因此i被选中的概率是P[i]*/
m = m + P[i];
if (r <= m) return i;
}
}
简单遗传算法-伪代码
/*Pc:交叉发生的概率, Pm:变异发生的概率, M:种群规模,G:终止进化的代数, Tf:进化产生的任何一个个体的适应度函数超过Tf,则可以终止进化过程*/
初始化Pm,Pc,M,G,Tf等参数。随机产生第一代种群Pop;
do {
计算种群Pop中每一个体的适应度F(i);
初始化空种群newPop;
do {
根据适应度以比例选择算法从种群Pop中选出2个个体;
if (random(0, 1) < Pc) {
对2个个体按交叉概率Pc执行交叉操作;
}
if (random(0, 1) < Pm) {
对2个个体按变异概率Pm执行变异操作;
}
将2个新个体加入种群newPop中;
} until(M个子代被创建);
用newPop取代Pop;
} until(任何染色体得分超过Tf, 或繁殖代数超过G);