⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gaussian.c

📁 这个代码是policy iteration算法关于强化学习的. 请您用winzip 解压缩
💻 C
字号:


#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <float.h>
#include "misc.h"


#include "gaussian.h"

double evaluate_gauss(int dim, double *s, double *center, double *var)
{
	int i;
	double t1,t2;
	t1 = 0.0;
	for ( i = 0; i < dim; i++ )
	{
		t2 = s[i] - center[i];
		t1 = t1 + (t2 * t2 / var[i]);
	}
	return(exp(-t1));
}

void avaluate_total_gradient(int dim, double *s, double *center, 
					   double *var, double **dpdc, double **dpdv, double *wrk, int mode,
					   double *g, int num_g, double g_tot)
{
	int i,j;
	double den, num_tot, num,t1;

	
	
	num_tot = 0.0;
	for ( i = 0; i < dim; i++ )
	{
		t1 = s[i] - center[i];
		wrk[i] = (t1 * t1 / var[i]);
		num_tot = num_tot + wrk[i];
	}

	for ( i = 0; i < dim; i++ )
	{
		num = num_tot - wrk[i];
		for ( j = 0; j < num_g; j++ )
		{
			den = g_tot - g[j];
			if ( mode == j )
			{
				gradient1(num, den, s[i], center[i], var[i], &(dpdc[i][j]), &(dpdv[i][j]));
			}
			else
			{
				gradient2(num, den, s[i], center[i], var[i], &(dpdc[i][j]), &(dpdv[i][j]), g[j]);
			}
		}
	}
}

void gradient1(double num, double den, double s, double c, double v, double *dpdc, double *dpdv)
{
	double t1, t2, t3, t4, t7, t8, t10, t12, t13, t15, t18, t20;

	t1 = s-c;
	t2 = 1/v;
	t3 = t1*t2;
	t4 = t1*t1;
	t7 = exp(-t4*t2-num);
	t8 = t7+den;
	t10 = t7/t8;
	t12 = t7*t7;
	t13 = t8*t8;
	t15 = t12/t13;
	t18 = v*v;
	t20 = t4/t18;
	*dpdc = 2.0*t3*t10-2.0*t15*t3;
	*dpdv = t20*t10-t15*t20;
	if ( _isnan(*dpdc))
	{
		My_Error("Not a Number!");
	}
	if ( !_finite(*dpdc))
	{
		My_Error("Not a finite Number!");
	}
	if ( _isnan(*dpdv))
	{
		My_Error("Not a Number!");
	}
	if ( !_finite(*dpdv))
	{
		My_Error("Not a finite Number!");
	}
}

void gradient2(double num, double den, double s, double c, double v, double *dpdc, double *dpdv, double top)
{
	double t1, t2, t3, t6, t8, t10, t15;
	t1 = s-c;
	t2 = t1*t1;
	t3 = 1/v;
	t6 = exp(-t2*t3-num);
	t8 = pow(t6+den,2.0);
	t10 = top/t8;
	t15 = v*v;
	*dpdc = -2.0*t10*t1*t3*t6;
	*dpdv = -t10*t2/t15*t6;
	if ( _isnan(*dpdc))
	{
		My_Error("Not a Number!");
	}
	if ( !_finite(*dpdc))
	{
		My_Error("Not a finite Number!");
	}
	if ( _isnan(*dpdv))
	{
		My_Error("Not a Number!");
	}
	if ( !_finite(*dpdv))
	{
		My_Error("Not a finite Number!");
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -