动态规划算法实验报告

动态规划算法实验报告
动态规划算法实验报告

实验标题

1、矩阵连乘

2、最长公共子序列

3、最大子段和

4、凸多边形最优三角剖分

5、流水作业调度

6、0-1背包问题

7、最优二叉搜索树

实验目的掌握动态规划法的基本思想和算法设计的基本步骤。

实验内容与源码1、矩阵连乘

#include

#include

using namespace std;

const int size=4;

//ra,ca和rb,cb分别表示矩阵A和B的行数和列数

void matriMultiply(int a[][4],int b[][4],int c[][4],int ra ,int ca,int rb ,int cb ) {

if(ca!=rb) cerr<<"矩阵不可乘";

for(int i=0;i

for(int j=0;j

{

int sum=a[i][0]*b[0][j];

for(int k=1;k

sum+=a[i][k]*b[k][j];

c[i][j]=sum;

}

}

void MatrixChain(int *p,int n,int m[][4],int s[][4])

{

for(int i=1;i<=n;i++) m[i][i]=0;//对角线

for(int r=2;r<=n;r++)//外维

for(int i=1;i<=n-r+1;i++)//上三角

{

int j=i+r-1;

m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];

s[i][j]=i;

for(int k=i+1;k

{

int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];

if(t

{

m[i][j]=t;

s[i][j]=k;

}

}

}

}

void Traceback(int i,int j,int s[][4])

{

if(i == j)

{

cout<<"A"<

}

else if(i+1 == j)

{

cout<<"(A"<

}

else

{

cout<<"(";

Traceback(i,s[i][j],s);

Traceback(s[i][j]+1,j,s);

cout<<")";

}

}

int main()

{

int w;

cout<<"矩阵个数:";

cin>>w;

int p[w],s[w][w];

cout<<"输入矩阵A1维数:";

cin>>p[0]>>p[1];

for(int i=2 ; i<=w ; i++)

{

int m = p[i-1];

cout<<"输入矩阵A"<

cin>>p[i-1]>>p[i];

if(p[i-1] != m)

{

cout<

exit(1);

}

}

Traceback(1,w,s);

return 0;

}

运行结果

2、最长公共子序列

#include

#include

#define N 100

using namespace std;

//str1存储字符串x,str2存储字符串y

char str1[N],str2[N];

//lcs存储最长公共子序列

char lcs[N];

//c[i][j]存储str1[1...i]与str2[1...j]的最长公共子序列的长度int c[N][N];

//flag[i][j]==0为str1[i]==str2[j]

//flag[i][j]==1为c[i-1][j]>=s[i][j-1]

//flag[i][j]==-1为c[i-1][j]

int flag[N][N];

//求长度

int LCSLength(char *x, char *y)

{

int i,j;

//分别取得x,y的长度

int m = strlen(x);

int n = strlen(y);

for(i=1;i<=m;i++)

c[i][0] = 0;

for(i=0;i<=n;i++)

c[0][i] = 0;

for(i=1;i<=m;i++)

for(j=1;j<=n;j++)

{

if(x[i-1]==y[j-1])

{

c[i][j] = c[i-1][j-1] +1;

flag[i][j] = 0;

}

else if(c[i-1][j]>=c[i][j-1])

{

c[i][j] = c[i-1][j];

flag[i][j] = 1;

}

else

{

c[i][j] = c[i][j-1];

flag[i][j] = -1;

}

}

return c[m][n];

}

//求出最长公共子序列

char* getLCS(char *x, char *y,int len,char *lcs) {

int i = strlen(x);

int j = strlen(y);

while(i&&j)

{

if(flag[i][j]==0)

{

lcs[--len] = x[i-1];

i--;

j--;

}

else if(flag[i][j]==1)

i--;

else

j--;

}

return lcs;

}

int main()

{

int i;

cout<<"请输入字符串x:"<

cin>>str1;

cout<<"请输入字符串y:"<

cin>>str2;

int lcsLen = LCSLength(str1,str2);

cout<<"最长公共子序列长度:"<

char *p = getLCS(str1,str2,lcsLen,lcs);

cout<<"最长公共子序列为:";

for(i=0;i

cout<

return 0;

}

运行结果

3、最大子段和

//分治法求最大子段和

#include

using namespace std;

int MaxSubSum(int *a,int left,int right)

{

int sum=0;

if(left==right) sum=a[left]>0?a[left]:0;

else

{

int center = (left+right)/2;

//最大子段和在左边

int leftsum=MaxSubSum(a,left,center);

//最大子段和在右边

int rightsum=MaxSubSum(a,center+1,right);

//最大子段和在中间

int s1=0;

int lefts=0;

for(int i=center;i>=left;i--)

{

lefts+=a[i];

if(lefts>s1) s1=lefts;

}

int s2=0;

int rights=0;

for(int i=center+1;i<=right;i++)

{

rights+=a[i];

if(rights>s2) s2=rights;

}

sum=s1+s2;//前后子段和相加

//判断最大子段和

if(sum>leftsum)sum=leftsum;

if(sum>rightsum) sum=rightsum;

}

return sum;

}

int MaxSum(int *a,int n)

{

return MaxSubSum(a,1,n-1);

}

int main()

{

int a[8]={2,-3,-5,4,1,7,1,-5};

cout<<"最大子段和为:"<

return 0;

}

//动态规划法

#include

using namespace std;

int MaxSum(int *a,int n)

{

int sum=0,b=0;

for(int i=1;i

{

if(b>0) b+=a[i];

else b=a[i];

if(b>sum) sum=b;

}

return sum;

}

int main()

{

int a[8]={2,-3,-5,4,1,7,1,-5};

cout<<"最大子段和为:"<

return 0;

}

运行结果

4、凸多边形最优三角剖分

#include

#include

#include

#define N 50

using namespace std;

struct point

{

int x;

int y;

};

int distance(point X, point Y)//两点距离

{

int dis = (Y.x-X.x)*(Y.x-X.x) + (Y.y-X.y)*(Y.y-X.y);

return (int)sqrt(dis);

}

int w(point a, point b, point c)//权值

{

return distance(a,b) + distance(b,c) + distance(a,c);

}

bool JudgeInput()//判断是否能构成凸多边形

{

point *v; //记录凸多边形各顶点坐标

int *total; //记录坐标在直线方程中的值int m,a,b,c;

cout<<"请输入凸多边形顶点个数:";

cin>>m;

int M = m-1;

for(int i=0 ; i

{

cout<<"输入顶点v"<

cin>>v[i].x>>v[i].y;

}

//根据顶点坐标判断是否能构成一个凸多边形

for(int j=0 ; j

{

int p = 0;

int q = 0;

if(m-1 == j)

{

a = v[m-1].y - v[0].y;

b = v[m-1].x - v[0].y;

c = b * v[m-1].y - a * v[m-1].x;

}

else

{

a = v[j].y - v[j+1].y;

b = v[j].x - v[j+1].x;

c = b * v[j].y - a * v[j].x;

}

for(int k=0 ; k

{

total[k] = a * v[k].x - b * v[k].y + c;

if(total[k] > 0)

{

p = p+1;

}

else if(total[k] < 0)

{

q = q+1;

}

}

if((p>0 && q>0) || (p==0 && q==0))

{

cout<<"无法构成凸多边形!"<

exit(1);

}

}

}

bool minWeightTriangulation()//计算最优值算法

{

int M;

int **t, **s;

point *v;

for(int i=1 ; i<=M ; i++)

t[i][i] = 0;

for(int r=2 ; r<=M ; r++)

for(int i=1 ; i<=M-r+1 ; i++)

{

int j = i+r-1;

t[i][j] = t[i+1][j] + w(v[i-1],v[i],v[j]);

s[i][j] = i;

for(int k=i+1 ; k

{

int u = t[i][k] + t[k+1][j] + w(v[i-1],v[k],v[j]);

if(u < t[i][j])

{

t[i][j] = u;

s[i][j] = k;

}

}

}

return true;

}

void Traceback(int i, int j, int **s)

{

if(i == j)

return;

Traceback(i,s[i][j],s);

Traceback(s[i][j]+1,j,s);

cout<<"三角形:v"<

}

int main()

{

int **s; //记录最优三角剖分中所有三角形信息int **t; //记录最优三角剖分所对应的权函数值point *v; //记录凸多边形各顶点坐标

int *total; //记录坐标在直线方程中的值

int M=0;

t = new int *[N];

s = new int *[N];

for(int i=0 ; i

{

t[i] = new int[N];

s[i] = new int[N];

}

v = new point[N];

total = new int[N];

if(JudgeInput())

{

if(minWeightTriangulation())

{

Traceback(1,M,s);

cout<

cout<<"最优权值之和为:"<

}

}

return 0;

}

运行结果:

5、流水作业调度

#include

#define N 100

using namespace std;

class Jobtype

{

public:

/* int operator<=(Jobtype a)const

{

return(key<=a.key);

}*/

int key;

int index;

bool job;

};

void sort(Jobtype *d,int n)

{

int i,j;

Jobtype temp;

bool exchange; //交换标志

for(i = 0;i < n;i ++){ //最多做n-1趟排序

exchange = false; //本趟排序开始前,交换标志应为假

for(j = n - 1;j >= i;j --)

if(d[j+1].key < d[j].key){

temp = d[j+1];

d[j+1] = d[j];

d[j] = temp;

exchange=true; //发生了交换,故将交换标志置为真}

if(!exchange) //本趟排序未发生交换,提前终止算法

return;

}

}

int FlowShop(int n,int *a,int *b,int *c)

{

Jobtype *d = new Jobtype[n];

for(int i=0;i

{

d[i].key=a[i]>b[i]?b[i]:a[i];// 执行时间

d[i].job=a[i]<=b[i];// 作业组

d[i].index=i;//作业序号

}

sort(d,n);;

int j=0;

int k=n-1;

for(int i=0;i

{

if(d[i].job)

{

c[j++]=d[i].index;

}

else

{

c[k--]=d[i].index;

}

}

j=a[c[0]];

k=j+b[c[0]];

for(int i=1;i

{

j+=a[c[i]];

k=j

}

delete d;//回收空间

return k;//返回调度时间

}

int main()

{

int n,*a,*b,*c;

cout<<"作业数:";

cin>>n;

Jobtype *d = new Jobtype[N];

a=new int[N];

b=new int[N];

c=new int[N];

cout<<"请输入作业号和时间:";

for(int i=0;i

{

cin>>d[i].index>>d[i].key;

}

cout << endl;

int k=FlowShop(n,a,b,c);

cout<<"\n调度时间:"<

cout<<"最优调度序列:";

for (int i = 0; i < n; i++) // 输出最优调度序列{

cout << c[i] << " ";

}

return 0;

}

运行结果:

6、0-1背包问题

#include

#include

using namespace std;

const int C=10;//容量

const int N=5;//个数

int max(const int a,const int b)

{

return a>b?a:b;

}

int min(const int a,const int b)

{

return a

}

/*

m为记录数组m[i][j]代表在剩有j容量的条件下,从i开始往后的物品中可以取得的最大价值

w为重量数组,v为价值数组

n为物品个数,c为开始容量

则m[1][c]即此背包能剩下的最大价值

*/

void knapsack(int **m,int n, int c,int *w, int *v)

{

int jMax = min(w[n]-1,c);//前n-1个物品

for(int j=0;j<=jMax;j++)

m[n][j]=0;

for(int j=w[n];j<=c;j++)

m[n][j]=v[n];

for(int i=n-1;i>1;i--)

{

jMax=min(w[i]-1,c);

for(int j=0;j<=jMax;j++)

m[i][j] = m[i+1][j];

for(int j=w[i];j<=c;j++)

m[i][j] = max(m[i+1][j],m[i+1][j-w[i]]+v[i]);

}

m[1][c]=m[2][c];

if(c>=w[1])

m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);

}

//找出最优解,0表示不能装,1表示能装

void traceback(int **m,int n,int c,int *x,int *w)

{

for(int i=1;i

{

if(m[i][c]==m[i+1][c]) x[i]=0;

else

{

x[i]=1;

c-=w[i];

}

}

x[n]=(m[n][c]==0)?0:1;

}

int main()

{

int *v=new int[N+1];

int *w=new int[N+1];

int **m=new int* [N+1];

int *x=new int [N+1];

for(int i=0;i

{

m[i]=new int[C+1];

}

cout<<"输入重量序列,"<

for(int i=1;i<=N;i++)

cin>>w[i];

cout<<"输入价值序列,"<

for(int i=1;i<=N;i++)

cin>>v[i];

knapsack(m,N,C,w,v);

traceback(m,N,C,x,w);

cout<<"最优值:"<

cout<<"是否装入背包的情况:";

for(int i=1;i<=N;i++)

{

cout<

}

for(int i=0;i

{

delete m[i];

}

delete []m;

return 0;

}

运行结果

7、最优二叉搜索树

#include

#include

#include

#define N 100

using namespace std;

const double MAX = numeric_limits::max(); //double的最大值

//a[i]为结点i被访问的概率

//b[i]为“虚结点”i被访问的概率

//m[i][j]用来存放子树(i,j)的期望代价

//w[i][j]用来存放子树(i,j)的所有结点(包括虚结点)的a,b概率之和//s[i][j]用来跟踪root的

void OptimalBinarySearchTree(double *a,double *b,int n)

{

int s[N][N];

double m[N][N];

double w[N][N];

int i,j,l,r;

for(i=1; i<=n+1; i++)

{

m[i][i-1] = b[i-1];

w[i][i-1] = b[i-1];

}

for(l=1; l<=n; l++)

{

for(i=1; i<=n-l+1; i++)

{

j = l+i-1;

m[i][j] = MAX;

w[i][j] = w[i][j-1] + a[j] +b[j];

for(r=i; r<=j; r++)

{

double k = m[i][r-1] + w[i][j] + m[r+1][j];

if(k

{

m[i][j] = k;

s[i][j] = k;

}

}

}

}

cout<

}

int main()

{

double a[N],b[N];

int n;

double sum = 0;

int i,j,l;

cout<<"请输入关键字的个数:"<

cin>>n;

cout<<"请输入每个关键字的概率:"<

for(i=1; i<=n; i++)

{

cin>>a[i];

sum += a[i];

}

cout<<"请输入每个虚拟键的概率:"<

for(i=0; i<=n; i++)

{

cin>>b[i];

sum += b[i];

}

if(abs(sum-1)>0.01)

{

cout<<"输入的概率和不为1,请重新输入"<

}

cout<<"最优二叉查找树的期望搜索代价为:";

OptimalBinarySearchTree(a,b,n);

return 0;

}

运行结果:

实验总结

通过实现动态规划的这个题目,对动态规划算法有了进一步的了解。先分析问题,判断是否具有最优子结果和重叠字问题的性质。

动态规划算法原理与的应用

动态规划算法原理及其应用研究 系别:x x x 姓名:x x x 指导教员: x x x 2012年5月20日

摘要:动态规划是解决最优化问题的基本方法,本文介绍了动态规划的基本思想和基本步骤,并通过几个实例的分析,研究了利用动态规划设计算法的具体途径。关键词:动态规划多阶段决策 1.引言 规划问题的最终目的就是确定各决策变量的取值,以使目标函数达到极大或极小。在线性规划和非线性规划中,决策变量都是以集合的形式被一次性处理的;然而,有时我们也会面对决策变量需分期、分批处理的多阶段决策问题。所谓多阶段决策问题是指这样一类活动过程:它可以分解为若干个互相联系的阶段,在每一阶段分别对应着一组可供选取的决策集合;即构成过程的每个阶段都需要进行一次决策的决策问题。将各个阶段的决策综合起来构成一个决策序列,称为一个策略。显然,由于各个阶段选取的决策不同,对应整个过程可以有一系列不同的策略。当过程采取某个具体策略时,相应可以得到一个确定的效果,采取不同的策略,就会得到不同的效果。多阶段的决策问题,就是要在所有可能采取的策略中选取一个最优的策略,以便得到最佳的效果。动态规划是一种求解多阶段决策问题的系统技术,可以说它横跨整个规划领域(线性规划和非线性规划)。在多阶段决策问题中,有些问题对阶段的划分具有明显的时序性,动态规划的“动态”二字也由此而得名。动态规划的主要创始人是美国数学家贝尔曼(Bellman)。20世纪40年代末50年代初,当时在兰德公司(Rand Corporation)从事研究工作的贝尔曼首先提出了动态规划的概念。1957年贝尔曼发表了数篇研究论文,并出版了他的第一部著作《动态规划》。该著作成为了当时唯一的进一步研究和应用动态规划的理论源泉。在贝尔曼及其助手们致力于发展和推广这一技术的同时,其他一些学者也对动态规划的发展做出了重大的贡献,其中最值得一提的是爱尔思(Aris)和梅特顿(Mitten)。爱尔思先后于1961年和1964年出版了两部关于动态规划的著作,并于1964年同尼母霍思尔(Nemhauser)、威尔德(Wild)一道创建了处理分枝、循环性多阶段决策系统的一般性理论。梅特顿提出了许多对动态规划后来发展有着重要意义的基础性观点,并且对明晰动态规划路径的数

动态规划实验报告

华东师范大学计算机科学技术系上机实践报告 一、 内容与设计思想 1.对于以下5 个矩阵: M 1: 2?3, M 2: 3?6, M 3: 6?4, M 4: 4?2, M 5: 2?7 , (a) 找出这5个矩阵相乘需要的最小数量乘法的次数。 (b) 请给出一个括号化表达式,使在这种次序下达到乘法的次数最少。 输入: 第一行为正整数N,表示有N 组测试数据; 每组测试数据的第一行为n,表示有n 个矩阵,2<=n<=50; 接下去的n 行,每行有两个整数x 和y,表示第ni 个矩阵是x*y 的。 输出: 对行每组数据,输出一行,每行一个整数,最小的矩阵连乘积。 我们保证输出的结果在2^64之内。 基本思想: 对于n 个矩阵的连乘积,设其不同的计算次序为P(n)。 由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下: 2.定义0/1/2背包问题为:}x p max{n 1i i i ∑=。限制条件为:c x w n 1i i i ≤∑=,且 n i 1},2,1,0{x i ≤≤∈。设f(i , y)表示剩余容量为y ,剩余物品为:i ,i+1,…,n 时的最优解的值。 1.)给出f(i , y)的递推表达式; 2.)请设计求解f(i , y)的算法,并实现你的算法; 3.)设W=[10,20,15,30],P=[6,10,15,18],c=48,请用你的算法求解。 输入: 第一行为一个正整数N ,表示有几组测试数据。 每组测试数据的第一行为两个整数n 和M ,0=-=∑-=

完整word版,SPSS聚类分析实验报告.docx

SPSS 聚类分析实验报告 一.实验目的: 1、理解聚类分析的相关理论与应用 2、熟悉运用聚类分析对经济、社会问题进行分析、 3、熟练 SPSS软件相关操作 4、熟悉实验报告的书写 二.实验要求: 1、生成新变量总消费支出=各变量之和 2、对变量食品支出和居住支出进行配对样本T 检验,并说明检验结果 3、对各省的总消费支出做出条形图(用EXCEL做图也行) 4、利用 K-Mean法把 31 省分成 3 类 5、对聚类分析结果进行解释说明 6、完成实验报告 三.实验方法与步骤 准备工作:把实验所用数据从 Word文档复制到 Excel ,并进一步导入到 SPSS数据文件中。 分析:由于本实验中要对 31 个个案进行分类,数量比较大,用系统聚类法当然也 可以得出结果,但是相比之下在数据量较大时, K 均值聚类法更快速高效,而且准确性更高。 四、实验结果与数据处理: 1.用系统聚类法对所有个案进行聚类:

生成新变量总消费支出 =各变量之和如图所示: 2.对变量食品支出和居住支出进行配对样本 T 检验,如图所示:

得出结论: 3.对各省的总消费支出做出条形图,如图所示: 4.对聚类分析结果进行解释说明: K均值分析将这样的城市分为三类: 第一类北京、上海、广东 第二类除第一类第三类以外的 第三类天津、福建、内蒙古、辽宁、山东 第一类经济发展水平高,各项支出占总支出比重高,人民生活水平高。第二类城市位于中西部地区,经济落后,人民消费水平低。第三类城市位于中东部地区,经济发展较好。

初始聚类中心 聚类 123 食品支出7776.983052.575790.72衣着支出1794.061205.891281.25居住支出2166.221245.001606.27家庭设备及服务支出1800.19612.59972.24医疗保健支出1005.54774.89617.36交通和通信支出4076.461340.902196.88文化与娱乐服务支出3363.251229.681786.00其它商品和服务支出1217.70331.14499.30总消费支出23200.409792.6614750.02 迭代历史记录a 聚类中心内的更改 迭代123 11250.5921698.8651216.114 2416.86470.786173.731 3138.955 2.94924.819 446.318.123 3.546 5849.114319.1791362.411 6805.00415.199606.915 7161.001.72475.864 832.200.0349.483 9 6.440.002 1.185 10 1.2887.815E-5.148

动态规划算法实验

一、实验目的 (2) 二、实验内容 (2) 三、实验步骤 (3) 四.程序调试及运行结果分析 (5) 附录:程序清单(程序过长,可附主要部分) (7)

实验四动态规划算法的应用 一、实验目的 1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。 2.熟练掌握分阶段的和递推的最优子结构分析方法。 3.学会利用动态规划算法解决实际问题。 二、实验内容 1.问题描述: 题目一:数塔问题 给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。 输入样例(数塔): 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 输出样例(最大路径和): 59 题目二:最长单调递增子序列问题(课本184页例28) 设有由n个不相同的整数组成的数列,记为:a(1)、a(2)、……、a(n)且a(i)<>a(j) (i<>j) 若存在i1

题目三 0-1背包问题 给定n种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为c,。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品只有两个选择:装入或不装入,且不能重复装入。输入数据的第一行分别为:背包的容量c,,物品的个数n。接下来的n 行表示n个物品的重量和价值。输出为最大的总价值。 输入样例: 20 3 11 9 9 10 7 5 输出样例 19 2.数据输入:个人设定,由键盘输入。 3.要求: 1)上述题目任选一做。上机前,完成程序代码的编写 2)独立完成实验及实验报告 三、实验步骤 1.理解算法思想和问题要求; 2.编程实现题目要求; 3.上机输入和调试自己所编的程序; 4.验证分析实验结果; 5.整理出实验报告。

动态规划算法的应用实验报告

实验二动态规划算法的应用 一、实验目的 1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。 2.熟练掌握分阶段的和递推的最优子结构分析方法。 3.学会利用动态规划算法解决实际问题。 二、实验内容 1.问题描述: 题目一:数塔问题 给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。 输入样例(数塔): 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 输出样例(最大路径和): 59 三、算法设计 void main() { 申明一个5*5的二维数组; for(int i=0;i<5;i++) { for(int j=0;j<=i;j++) { 输入数组元素p[i][j]; }

} for(int k=0;k<5;k++) { for(int w=0;w<=k;w++) { 输出数组元素p[k][w]; } } for(int a=4;a>0;a--) { for(int s=0;s<=a;s++) { if(p[a][s]大于p[a][s+1]) p[a-1][s]等于p[a-1][s]加p[a][s]; else p[a-1][s] 等于p[a-1][s] 加p[a][s+1]; } } 输出p[0][0] }

四.程序调试及运行结果分析 五.实验总结 虽然这个实验比较简单,但是通过这次实验使我更加了解的动态规划法的好处和、,在解决问题时要尝试使用动态规划,这样就有可能得到一种即简单复杂性有不高的算法。

对数据进行聚类分析实验报告

对数据进行聚类分析实验报告 1.方法背景 聚类分析又称群分析,是多元统计分析中研究样本或指标的一种主要的分类方法,在古老的分类学中,人们主要靠经验和专业知识,很少利用数学方法。随着生产技术和科学的发展,分类越来越细,以致有时仅凭经验和专业知识还不能进行确切分类,于是数学这个有用的工具逐渐被引进到分类学中,形成了数值分类学。近些年来,数理统计的多元分析方法有了迅速的发展,多元分析的技术自然被引用到分类学中,于是从数值分类学中逐渐的分离出聚类分析这个新的分支。结合了更为强大的数学工具的聚类分析方法已经越来越多应用到经济分析和社会工作分析中。在经济领域中,主要是根据影响国家、地区及至单个企业的经济效益、发展水平的各项指标进行聚类分析,然后很据分析结果进行综合评价,以便得出科学的结论。 2.基本要求 用FAMALE.TXT、MALE.TXT和/或test2.txt的数据作为本次实验使用的样本集,利用C均值和分级聚类方法对样本集进行聚类分析,对结果进行分析,从而加深对所学内容的理解和感性认识。 3.实验要求 (1)把FAMALE.TXT和MALE.TXT两个文件合并成一个,同时采用身高和体重数据作为特征,设类别数为2,利用C均值聚类方法对数据进行聚类,并将聚类结果表示在二维平面上。尝试不同初始值对此数据集是否会造成不同的结果。 (2)对1中的数据利用C均值聚类方法分别进行两类、三类、四类、五类聚类,画出聚类指标与类别数之间的关系曲线,探讨是否可以确定出合理的类别数目。 (3)对1中的数据利用分级聚类方法进行聚类,分析聚类结果,体会分级聚类方法。。(4)利用test2.txt数据或者把test2.txt的数据与上述1中的数据合并在一起,重复上述实验,考察结果是否有变化,对观察到的现象进行分析,写出体会 4.实验步骤及流程图 根据以上实验要求,本次试验我们将分为两组:一、首先对FEMALE 与MALE中数据组成的样本按照上面要求用C均值法进行聚类分析,然后对FEMALE、MALE、test2中数据组成的样本集用C均值法进行聚类分析,比较二者结果。二、将上述两个样本用分即聚类方法进行聚类,观察聚类结果。并将两种聚类结果进行比较。 (1)、C均值算法思想

南京邮电大学算法设计实验报告——动态规划法

实验报告 (2009/2010学年第一学期) 课程名称算法分析与设计A 实验名称动态规划法 实验时间2009 年11 月20 日指导单位计算机学院软件工程系 指导教师张怡婷 学生姓名丁力琪班级学号B07030907 学院(系) 计算机学院专业软件工程

实验报告 实验名称动态规划法指导教师张怡婷实验类型验证实验学时2×2实验时间2009-11-20一、实验目的和任务 目的:加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的最长公共子序列问题。 任务:用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较、文章比较等多个领域。 要求:掌握动态规划法的思想,及动态规划法在实际中的应用;分析最长公共子序列的问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较,并输出它们的最长公共子序列。 二、实验环境(实验设备) 硬件:计算机 软件:Visual C++

三、实验原理及内容(包括操作过程、结果分析等) 1、最长公共子序列(LCS)问题是:给定两个字符序列X={x1,x2,……,x m}和Y={y1,y2,……,y n},要求找出X和Y的一个最长公共子序列。 例如:X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a}。它们的最长公共子序列LSC={b,c,d,a}。 通过“穷举法”列出所有X的所有子序列,检查其是否为Y的子序列并记录最长公共子序列并记录最长公共子序列的长度这种方法,求解时间为指数级别的,因此不可取。 2、分析LCS问题特征可知,如果Z={z1,z2,……,z k}为它们的最长公共子序列,则它们一定具有以下性质: (1)若x m=y n,则z k=x m=y n,且Z k-1是X m-1和Y n-1的最长公共子序列; (2)若x m≠y n且x m≠z k,则Z是X m-1和Y的最长公共子序列; (3)若x m≠y n且z k≠y n,则Z是X和Y的最长公共子序列。 这样就将求X和Y的最长公共子序列问题,分解为求解较小规模的问题: 若x m=y m,则进一步分解为求解两个(前缀)子字符序列X m-1和Y n-1的最长公共子序列问题; 如果x m≠y n,则原问题转化为求解两个子问题,即找出X m-1和Y的最长公共子序列与找出X 和Y n-1的最长公共子序列,取两者中较长者作为X和Y的最长公共子序列。 由此可见,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列,具有最优子结构性质。 3、令c[i][j]保存字符序列X i={x1,x2,……,x i}和Y j={y1,y2,……,y j}的最长公共子序列的长度,由上述分析可得如下递推式: 0 i=0或j=0 c[i][j]= c[i-1][j-1]+1 i,j>0且x i=y j max{c[i][j-1],c[i-1][j]} i,j>0且x i≠y j 由此可见,最长公共子序列的求解具有重叠子问题性质,如果采用递归算法实现,会得到一个指数时间算法,因此需要采用动态规划法自底向上求解,并保存子问题的解,这样可以避免重复计算子问题,在多项式时间内完成计算。 4、为了能由最优解值进一步得到最优解(即最长公共子序列),还需要一个二维数组s[][],数组中的元素s[i][j]记录c[i][j]的值是由三个子问题c[i-1][j-1]+1,c[i][j-1]和c[i-1][j]中的哪一个计算得到,从而可以得到最优解的当前解分量(即最长公共子序列中的当前字符),最终构造出最长公共子序列自身。

SPSS的聚类分析实验报告

实验报告 姓名学号专业班级 课程名 统计分析SPSS软件实验室 称 成绩指导教师 实验名称SPSS的聚类分析 1、实验目的: 掌握层次聚类分析和K-Means聚类分析的基本思想和具体,并能够对分析结果进行解释。 二、实验题目: 1.、现要对一个班同学的语文水平进行聚类,拟聚为三类,聚类依据是 两次语文考试的成绩。数据如下表所示。试用系统聚类法和K-均值法进 行聚类分析。 人名第一次语文成绩第二次语文成绩 张三9998 王五8889 赵四7980 小杨8978 蓝天7578 小白6065 李之7987 马武7576 郭炎6056 刘小100100

3、实验步骤(最好有截图): 1.先打开常用软件里的SPSS 11.5 for Windows.exe,在Variable View 中根据题目输入相关数据,如下图所示 2.在Data View中先输入数据,结果如下图所示 3. 首先试用系统聚类法对相关数据进行聚类 4. 选择菜单:【Analyze】→【Classify】→【Hierarchical Cluster】,然后选择参与层次聚类分析的变量两次语文考试的成绩到【Variable(s)】框中,再选择一个字符型变量“人名”作为标记变量到【Label Cases by】框中。

5.按“Plots”后进行选择 6.按“Statistics”后进行选择

7.按“Method”后进行选择

8.对第一个表格进行保存,并且命名为“语文水平.sav”,同时保存输出结果 4、实验结果及分析(最好有截图): 第一题: 1. 首先试用系统聚类法对相关数据进行聚类

聚类分析实验报告记录

聚类分析实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

《应用多元统计分析》 课程实验报告 实验名称:用聚类分析的方法研究山东省17个市的产业类型 的差异化 学生班级:统计0901 学生姓名:贾绪顺杜春霖陈维民张鹏 指导老师:____________张艳丽_____________________ 完成日期:2011.12.12

一,实验内容 根据聚类分析的原理,使用系统聚类分析的COMplete linkage (最长距离法)和WARD(离差平方和法),运用SPSS软件对2009年山东省17个城市生产总值的数据进行Q型聚类,将17个城市分为5类,发现不同城市产业类型的差异化,并解释造成这种差异的原因 二,实验目的 希望通过实验研究山东省17个市的生产总值的差异化,并分析造成这种差异化的原因,可以更深刻的掌握聚类分析的原理;进一步熟悉聚类分析问题的提出、解决问题的思路、方法和技能;达到能综合运用所学基本理论和专业知识;锻炼收集、整理、运用资料的能力的目的;希望能会调用SPSS软件聚类分析有关过程命令,并且可以对数据处理结果进行正确判断分析,作出综合评价。 三,实验方法背景与原理 3.1方法背景 聚类分析又称群分析,是多元统计分析中研究样本或指标的一种主要的分类方法,在古老的分类学中,人们主要靠经验和专业知识,很少利用数学方法。随着生产技术和科学的发展,分类越来越细,以致有时仅凭经验和专业知识还不能进行确切分类,于是数学这个有用的工具逐渐被引进到分类学中,形成了数值分类学。近些年来,数理统计的多元分析方法有了迅速的发展,多元分析的技术自然被引用到分类学中,于是从数值分类学中逐渐的分离出聚类分析这个新的分支。结合了更为强大的数学工具的聚类分析方法已经越来越多应用到经济分析和社会工作分析中。在经济领域中,主要是根据影响国家、地区及至单个企业的经济效益、发展水平的各项指标进行聚类分析,然后很据分析结果进行综合评价,以便得出科学的结论。 聚类分析源于很多领域,包括数学,计算机科学,统计学,生物学和经济学。在不同的应用领域,很多聚类技术都得到了发展,这些技术方法被用作描述数据,衡量不同数据源间的相似性,以及把数据源分类到不同的簇中。聚类分析的主要应用,在商业方面,最常见的就是客户群的细分问题,可以从客户人口特征、消费行为和喜好方面的数据,对客户进行特征分析,充分利用数据进行客户的客观分组,使诸多特征有相似性的客户能被分在同一组内,而不相似的客户能被区分到另一些组中。在生物方面,聚类分析可以用来对动植物进行分类,对基因进行分类等,从而获取对动植物种群固有结构的认识,对物种进行很好的分类。在电子商务方面,聚类分析在电子商务中网站建设数据挖掘中也是很重要的一个方面,通过对客户的浏览行为、浏览网站、客户的年龄等,对客户进行分析,找出不同客户的共同特征,通过共同特征对客户进行分类,可以帮助电子商户更好的了解他们的客户,并向客户提供更合适的服务。在保险行业上,根据产、寿险进行分类,不同类别的公司进行分类,对保险投资比例进行分类管理,从而提高保险投资的效率。 3.2实验的方法与原理 聚类分析是研究“物以类聚”的一种科学有效的方法。做聚类分析时,出于不同的目的和要求,可以选择不同的统计量和聚类方法。 聚类分析方法中最常用的一种是系统聚类法,其基本思想是:先将待聚类的n个样品(或者变量)各自看成一类,共有n类;然后按照选定的方法计算每两类之间的聚类统计量,即某种距离(或者相似系数),将关系最为密切的两类合为一类,其余不变,即得到n-1类;再按照前面的计算方法计算新类与其他类之间的距离(或相似系数),再将关系最为密切的

算法设计动态规划(编辑距离)

《算法设计与分析》课程报告 课题名称:动态规划——编辑距离问题 课题负责人名(学号): 同组成员名单(角色):无 指导教师:左劼 评阅成绩: 评阅意见: 提交报告时间:2010年 6 月 23 日

动态规划——编辑距离问题 计算机科学与技术专业 学生指导老师左劼 [摘要]动态规划的基本思想与分治法类似,也是将待求解的问题分解成若干份的子问题,先分别解决好子问题,然后从子问题中得到最终解。但动态规划中的子问题往往不是相互独立的,而是彼此之间有影响,因为有些子问题可能要重复计算多次,所以利用动态规划使这些子问题只计算一次。将字符串A变换为字符串所用的最少字符操作数称为字符串A到B的编辑距离。 关键词:动态规划矩阵字符串操作数编辑距离

一、问题描述 1、基本概念:设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。字符串操作包括: (1) 删除一个字符; (2) 插入一个字符; (3) 将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A 到B的编辑距离,记为d(A,B)。 2、算法设计:设计一个有效算法,对于给定的任意两个字符串A 和B,计算其编辑距离d(A,B)。 3、数据输入:输入数据由文件名为input.txt的文本文件提供。文件的第1行为字符串A,第二行为字符串B。 4、结果输出:将编辑距离d(A,B)输出到文件ouput.txt的第一行。 输入文件示例输出文件示例 input.txt output.txt fxpimu 5 xwrs 二、分析 对于本问题,大体思路为:把求解编辑距离分为字符串A从0个字符逐渐增加到全部字符分别想要变为字符串B该如何变化以及变化的最短距离。 具体来说,首先选用数组a1存储字符串A(设长度为n),a2存储字符串B(设长度为m),d矩阵来进行具体的运算;这里有两个特殊情况比较简单可以单独考虑,即A的长度为0而B不为0还有A不为0B为0,这两种情况最后的编辑距离分别为m和n;讨论一般情况,d矩阵为d[n][m],假定我们从d[0][0]开始一直进行以下操作到了d[i][j]的位置,其中删除操作肯定是A比B长,同理,插入字符操作一定是A比B短,更改字符操作说明一样长,我们所要做的是对d[i][j-1]

数据挖掘实验报告三

实验三 一、实验原理 K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。 在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。 算法原理: (1) 随机选取k个中心点; (2) 在第j次迭代中,对于每个样本点,选取最近的中心点,归为该类; (3) 更新中心点为每类的均值; (4) j<-j+1 ,重复(2)(3)迭代更新,直至误差小到某个值或者到达一定的迭代步 数,误差不变. 空间复杂度o(N) 时间复杂度o(I*K*N) 其中N为样本点个数,K为中心点个数,I为迭代次数 二、实验目的: 1、利用R实现数据标准化。 2、利用R实现K-Meams聚类过程。 3、了解K-Means聚类算法在客户价值分析实例中的应用。 三、实验内容 依据航空公司客户价值分析的LRFMC模型提取客户信息的LRFMC指标。对其进行标准差标准化并保存后,采用k-means算法完成客户的聚类,分析每类的客户特征,从而获得每类客户的价值。编写R程序,完成客户的k-means聚类,获得聚类中心与类标号,并统计每个类别的客户数

四、实验步骤 1、依据航空公司客户价值分析的LRFMC模型提取客户信息的LRFMC指标。

2、确定要探索分析的变量 3、利用R实现数据标准化。 4、采用k-means算法完成客户的聚类,分析每类的客户特征,从而获得每类客户的价值。

五、实验结果 客户的k-means聚类,获得聚类中心与类标号,并统计每个类别的客户数 六、思考与分析 使用不同的预处理对数据进行变化,在使用k-means算法进行聚类,对比聚类的结果。 kmenas算法首先选择K个初始质心,其中K是用户指定的参数,即所期望的簇的个数。 这样做的前提是我们已经知道数据集中包含多少个簇. 1.与层次聚类结合 经常会产生较好的聚类结果的一个有趣策略是,首先采用层次凝聚算法决定结果

算法实验动态规划----矩阵连乘

实验三:动态规划法 【实验目的】 深入理解动态规划算法的算法思想,应用动态规划算法解决实际的算法问题。 【实验性质】 验证性实验。 【实验要求】 对于下列所描述的问题,给出相应的算法描述,并完成程序实现与时间复杂度的分析。该问题描述为:一般地,考虑矩阵A1,A2,…,An的连乘积,它们的维数分别为d0,d1,…,dn,即Ai的维数为di-1×di (1≤i≤n)。确定这n个矩阵的乘积结合次序,使所需的总乘法次数最少。对应于乘法次数最少的乘积结合次序为这n个矩阵的最优连乘积次序。按给定的一组测试数据对根据算法设计的程序进行调试:6个矩阵连乘积A=A1×A2×A3×A4×A5×A6,各矩阵的维数分别为:A1:10×20,A2:20×25,A3:25×15,A4:15×5,A5:5×10,A6:10×25。完成测试。 【算法思想及处理过程】

【程序代码】

printf ("\n\n矩阵连乘次数的最优值为:\n"); printf ("-----------------------------------------------\n"); print2 (0, 6-1, s); printf ("\n-----------------------------------------------\n\n"); return 0; } void MatrixChain (int p[], int m[][6], int s[][6], int n) { int i, j, k, z, t; for (i=0; i

算法设计与分析实验报告

本科实验报告 课程名称:算法设计与分析 实验项目:递归与分治算法 实验地点:计算机系实验楼110 专业班级:物联网1601 学号:2016002105 学生姓名:俞梦真 指导教师:郝晓丽 2018年05月04 日

实验一递归与分治算法 1.1 实验目的与要求 1.进一步熟悉C/C++语言的集成开发环境; 2.通过本实验加深对递归与分治策略的理解和运用。 1.2 实验课时 2学时 1.3 实验原理 分治(Divide-and-Conquer)的思想:一个规模为n的复杂问题的求解,可以划分成若干个规模小于n的子问题,再将子问题的解合并成原问题的解。 需要注意的是,分治法使用递归的思想。划分后的每一个子问题与原问题的性质相同,可用相同的求解方法。最后,当子问题规模足够小时,可以直接求解,然后逆求原问题的解。 1.4 实验题目 1.上机题目:格雷码构造问题 Gray码是一个长度为2n的序列。序列无相同元素,每个元素都是长度为n的串,相邻元素恰好只有一位不同。试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)。 对于给定的正整数n,格雷码为满足如下条件的一个编码序列。 (1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。 (2)序列中无相同的编码。 (3)序列中位置相邻的两个编码恰有一位不同。 2.设计思想: 根据格雷码的性质,找到他的规律,可发现,1位是0 1。两位是00 01 11 10。三位是000 001 011

010 110 111 101 100。n位是前n-1位的2倍个。N-1个位前面加0,N-2为倒转再前面再加1。 3.代码设计:

聚类分析实验报告

聚类分析实验报告 姓名: 学号: 班级: 一:实验目的 1.了解聚类分析的基本原理及在spss中的实现过程。 2.通过对指标进行聚类,体会降维的处理过程。 3.通过不同性质指标对样本进行聚类,体会归类的思想。 二:实验原理 聚类分析就是根据事物本身的特性来定量研究分类问题的一种多元统计分析方法。其基本思想就是同一类中的个体有较大的相似性,不同类中的个体差异较大,于就是根据一批根据一批样品的多个观察指标,找出能够度量样品(或变量)之间相似度的统计量,并以此为依据,采用某种聚类法,将所有的样品(或变量)分别聚合到不同的类中。 三:实验过程 本实验就是通过对上市公司分析所得。由基本经济知识知道评价一个上市公司的业绩主要从以下四个方面:盈利能力,偿债能力,成长能力,经营能力。所以我分别从这四个方面共选取了19个指标来对上市公司的业绩进行评价。具体数据请见EXCEL。 由上面的分析我们知道评定一个上市公司业绩的指标有四类,但我们瞧EXCEL可知,每一类下面有4-5个指标,每类指标有较强相关性,存在多重共线性与维数过高而不易分析得影响。所以首先采用系统聚类法对每类指标进行聚类,再采用比较复相关系数得出每类最具代表的指标,达到降维的目的。(注:以下对指标分析均采用主间连接法,度量标准为person相关性) 以下就是实验截图: (1):对盈利能力指标

从上表分析我们可将盈利能力的4个指标分为两类,即“毛利率”为一类,“销售净利率”、“成本费用利润率”与“资产净利润”为一类。所以“毛利率”为一类,另外再对“销售净利润”、“成本费用利润率”与“资产净利润”分别作对另3个指标的复相关系数,结果如下: ①、以“销售净利润”为因变量,其余为自变量得: 模型汇总 模型R R 方调整 R 方标准估计的误 差 1 、980a、960 、957 、20721755 a、预测变量: (常量), Zscore: 资产净利率(%), Zscore: 毛利率(%), Zscore: 成本费用利润率(%)。 ②、以“成本费用利润率”为因变量,其余为自变量得: 模型汇总 模型R R 方调整 R 方标准估计的误 差 1 、978a、957 、953 、21603919 a、预测变量: (常量), Zscore: 销售净利率(%), Zscore: 毛利率(%), Zscore: 资产净利率(%)。 ③、以“资产净利润”为因变量,其余为自变量得: 模型汇总 模型R R 方调整 R 方标准估计的误 差

动态规划算法的应用

动态规划算法的应用 一、实验目的 1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。 2.熟练掌握分阶段的和递推的最优子结构分析方法。 3.学会利用动态规划算法解决实际问题。 二、实验内容 题目一:数塔问题 给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。 输入样例(数塔): 9 15 10 6 8 2 18 9 5 19 7 10 4 16 输出样例(最大路径和): 59 三、实验步骤 (1)需求分析 通过动态规划法解决数塔问题。从顶部出发,在每一节点可以选择向下或者向右走,一直走到底层,以找出一条数值最大的路径。 (2)概要设计 本次实验程序主要用到二维数组,以及通过动态规划法进行比较每个数的大小。主要运用两个for循环语句实现动态规划。

(3)详细设计 第一步,输入给定的二维数组并打印出相应的数组: int array[5][5]={{9}, /* */{12,15}, /* */{10,6,8}, /* */{2,18,9,5}, /* */{19,7,10,4,6}}; int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) cout<0;j--) { for(i=0;i<=4;i++) { if(array[j][i]>array[j][i+1]) array[j-1][i]=array[j][i]+array[j-1][i]; else array[j-1][i]=array[j][i+1]+array[j-1][i]; } } 第三步,输出最大路径的值。 cout<

对数据进行聚类分析实验报告

对数据进行聚类分析实验报告 徐远东 任争刚 权荣 一、 基本要求 用FAMALE.TXT 、MALE.TXT 和/或test2.txt 的数据作为本次实验使用的样本集,利用C 均值和分级聚类方法对样本集进行聚类分析,对结果进行分析,从而加深对所学内容的理解和感性认识。 二、 实验要求 1、 把FAMALE.TXT 和MALE.TXT 两个文件合并成一个,同时采用身高 和体重数据作为特征,设类别数为2,利用C 均值聚类方法对数据进行聚类,并将聚类结果表示在二维平面上。尝试不同初始值对此数据集是否会造成不同的结果。 2、 对1中的数据利用C 均值聚类方法分别进行两类、三类、四类、五类聚类,画出聚类指标与类别数之间的关系曲线,探讨是否可以确定出合理的类别数目。 3、 对1中的数据利用分级聚类方法进行聚类,分析聚类结果,体会分级聚类方法。。 4、 利用test2.txt 数据或者把test2.txt 的数据与上述1中的数据合并在一起,重复上述实验,考察结果是否有变化,对观察到的现象进行分析,写出体会 三、 实验步骤及流程图 根据以上实验要求,本次试验我们将分为两组:一、首先对FEMALE 与MALE 中数据组成的样本按照上面要求用C 均值法进行聚类分析,然后对FEMALE 、MALE 、test2中数据组成的样本集用C 均值法进行聚类分析,比较二者结果。二、将上述两个样本用分即聚类方法进行聚类,观察聚类结果。并将两种聚类结果进行比较。 一、(1)、C 均值算法思想 C 均值算法首先取定C 个类别和选取C 个初始聚类中心,按最小距离原则将各模式分配到C 类中的某一类,之后不断地计算类心和调整各模式的类别,最终使各模式到其判属类别中心的距离平方之和最小 (2)、实验步骤 第一步:确定类别数C ,并选择C 个初始聚类中心。本次试验,我们分别将C 的值取为2和3。用的是凭经验选择代表点的方法。比如:在样本数为N 时,分为两类时,取第一个点和第()12/+N INT 个点作为代表点;分为三类时,取第一、

算法设计与分析---动态规划实验

《算法设计与分析》实验报告实验二递归与分治策略

Module 1: 免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 59327 Accepted Submission(s): 20813 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼。现在给这条小径如图标上坐标: 为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼) Input 输入数据有多组。每组数据的第一行为以正整数n(0

动态规划算法实验报告

实验标题 1、矩阵连乘 2、最长公共子序列 3、最大子段和 4、凸多边形最优三角剖分 5、流水作业调度 6、0-1背包问题 7、最优二叉搜索树 实验目的掌握动态规划法的基本思想和算法设计的基本步骤。 实验内容与源码1、矩阵连乘 #include #include using namespace std; const int size=4; //ra,ca和rb,cb分别表示矩阵A和B的行数和列数 void matriMultiply(int a[][4],int b[][4],int c[][4],int ra ,int ca,int rb ,int cb ) { if(ca!=rb) cerr<<"矩阵不可乘"; for(int i=0;i

实验三K均值聚类算法实验报告

实验三 K-Means聚类算法 一、实验目的 1) 加深对非监督学习的理解和认识 2) 掌握动态聚类方法K-Means 算法的设计方法 二、实验环境 1) 具有相关编程软件的PC机 三、实验原理 1) 非监督学习的理论基础 2) 动态聚类分析的思想和理论依据 3) 聚类算法的评价指标 四、算法思想 K-均值算法的主要思想是先在需要分类的数据中寻找K组数据作为初始聚类中心,然后计算其他数据距离这三个聚类中心的距离,将数据归入与其距离最近的聚类中心,之后再对这K个聚类的数据计算均值,作为新的聚类中心,继续以上步骤,直到新的聚类中心与上一次的聚类中心值相等时结束算法。 实验代码 function km(k,A)%函数名里不要出现“-” warning off [n,p]=size(A);%输入数据有n个样本,p个属性 cid=ones(k,p+1);%聚类中心组成k行p列的矩阵,k表示第几类,p是属性 %A(:,p+1)=100; A(:,p+1)=0; for i=1:k %cid(i,:)=A(i,:); %直接取前三个元祖作为聚类中心 m=i*floor(n/k)-floor(rand(1,1)*(n/k)) cid(i,:)=A(m,:); cid; end Asum=0; Csum2=NaN; flags=1; times=1; while flags flags=0; times=times+1; %计算每个向量到聚类中心的欧氏距离 for i=1:n

for j=1:k dist(i,j)=sqrt(sum((A(i,:)-cid(j,:)).^2));%欧氏距离 end %A(i,p+1)=min(dist(i,:));%与中心的最小距离 [x,y]=find(dist(i,:)==min(dist(i,:))); [c,d]=size(find(y==A(i,p+1))); if c==0 %说明聚类中心变了 flags=flags+1; A(i,p+1)=y(1,1); else continue; end end i flags for j=1:k Asum=0; [r,c]=find(A(:,p+1)==j); cid(j,:)=mean(A(r,:),1); for m=1:length(r) Asum=Asum+sqrt(sum((A(r(m),:)-cid(j,:)).^2)); end Csum(1,j)=Asum; end sum(Csum(1,:)) %if sum(Csum(1,:))>Csum2 % break; %end Csum2=sum(Csum(1,:)); Csum; cid; %得到新的聚类中心 end times display('A矩阵,最后一列是所属类别'); A for j=1:k [a,b]=size(find(A(:,p+1)==j)); numK(j)=a; end numK times xlswrite('data.xls',A);

相关文档
最新文档