Z
zzhhhuc
Unregistered / Unconfirmed
GUEST, unregistred user!
C程序
//中心点搜索过程的算法
//有150的点,初始时,分别属于3类,1-50第一类,51-100第二类,101-150第三类;
//初始化三个4维的中心点C1,C2,C3
//1/计算每个中心点与要求计算的150个样本之间的距离,
//2/把样本分别归属于3类点中.
//3/更新中心点
//4/判断是否结束,不可以结束的话,重复1,2,3,4这几个步骤
#include<iostream>
#include<fstream>//用于文件操作的头文件
#include<math.h>
#include<windows.h>
#include<stdlib.h>//exit()函数的头文件
#include<iomanip>//setw()函数的头文件
using namespace std;//标准类库,使用std这个名字空间
//
#define MAX 150 //数据的总个数是150个,即初始时是3类数据,每类是50个
#define MIN 4 //4维数据//
#define jingdu 0.0001//定义了初始化的精度
//
double Data[MAX][MIN];//用以表示Iris数据
int T_1[MAX],T_2[MAX],T_3[MAX];//3个桶用来装同类数据
double C1[MIN],C2[MIN],C3[MIN];
int type1,type2,type3;
double avg[MIN];
double JK,JK_1=0;
//
void ComputeCentralPoint(void)//计算中心点:即为求桶内数据样本的平均值
{
ZeroMemory(C1,0);
ZeroMemory(C2,0);
ZeroMemory(C3,0);
for(int i=0;i<type1;i++)
for(int j=0;j<MIN;j++)
C1[j]+=Data[T_1][j];
for(i=0;i<type2;i++)
for(int j=0;j<MIN;j++)
C2[j]+=Data[T_2][j];
for(i=0;i<type3;i++)
for(int j=0;j<MIN;j++)
C3[j]+=Data[T_3][j];
for(i=0;i<MIN;i++)
{
C1=C1/type1;
C2=C2/type2;
C3=C3/type3;
}
}
//
void ComputeDistance(void)//计算距离
{
double d1=0,d2=0,d3=0;
type1=type2=type3=0;
for(int i=0;i<MAX;i++)
{
for(int j=0;j<MIN;j++)//计算di(距离)
{
d1+=pow((Data[j]-C1[j]),2);
d2+=pow((Data[j]-C2[j]),2);
d3+=pow((Data[j]-C3[j]),2);
}
//看数据属于的类别,即di最小的就是第i类的
if(d1<d2 && d1<d3)
{
T_1[type1]=i;
type1++;
}
if(d2<d1 && d2<d3)
{
T_2[type2]=i;
type2++;
}
if(d3<d2 && d3<d1)
{
T_3[type3]=i;
type3++;
}
d1=d2=d3=0;
}
}
//
void InitPoint(void)//初始化中心点
{
ZeroMemory(Data,0);
double temp;
ifstream infile;
infile.open("Iris.txt"//从文件夹中读入信息
if(!infile)
{
cout<<"不能打开文件!"<<endl;
exit(0);
}
else
{
int i=0,j=0; //游标
while(infile>>temp) //第一列数据序号不保存
{
while( infile>>temp && j<4 ) //最后一列数据种类不保存
{
Data[j]=temp;
j++;
}
j=0;
i++;
}
}
type1=type2=type3=50;
for(int i=0;i<MAX/3;i++)
{
T_1=i;
T_2=i+type1;
T_3=i+type2+type1;
}
ComputeCentralPoint();//计算中心点
}
//
int J(void)//目标函数,判断程序什么时候结束的
{
JK=0;
for(int i=0;i<type1;i++)
for(int j=0 ;j<MIN;j++)
JK+=pow((Data[T_1][j]-C1[j]),2);
for(i=0;i<type2;i++)
for(int j=0 ;j<MIN;j++)
JK+=pow((Data[T_2][j]-C2[j]),2);
for(i=0;i<type3;i++)
for(int j=0 ;j<MIN;j++)
JK+=pow((Data[T_3][j]-C3[j]),2);
if(fabs(JK-JK_1)>jingdu)
{
JK_1=JK;
return 0;
}
else
return 1;
}
//主函数
void main()
{
InitPoint();//初始化中心点
int IsEnd=J();// 结束标志
ComputeDistance();
while(! IsEnd)
{
ComputeCentralPoint();
ComputeDistance();
IsEnd=J();
}
cout<<"--------------程序执行结果---------------"<<endl;
cout<<"第 1 类统计个数: "<<type1<<endl;
cout<<"第 2 类统计个数: "<<type2<<endl;
cout<<"第 3 类统计个数: "<<type3<<endl;
cout<<"-----------------------------------"<<endl;
int tempcount=1;
for(int i=0;i<type1;i++,tempcount++)
{
cout<<setw(4)<<tempcount<<" ";
for(int j=0;j<4;j++)
cout<<setw(4)<<Data[T_1][j];
cout<<setw(5)<<"1";
cout<<endl;
}
cout<<endl;
for( i=0;i<type2;i++,tempcount++)
{
cout<<setw(4)<< tempcount<<" ";
for(int j=0;j<4;j++)
cout<<setw(4)<<Data[T_2][j];
cout<<setw(5)<<"2";
cout<<endl;
}
cout<<endl;
for( i=0;i<type3;i++,tempcount++)
{
cout<<setw(3)<<tempcount<<" ";
for(int j=0;j<4;j++)
cout<<setw(4)<<Data[T_3][j];
cout<<setw(5)<<"3";
cout<<endl;
}
cout<<endl;
}
转成delphi后的
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,math;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure InitPoint();
procedure ComputeDistance();
procedure ComputeCentralPoint();
function IsEnd():integer;
end;
var
Form1: TForm1;
Data:array[0..149,0..3] of double;
Temp_Data:array[0..4] of double;
T_1:array[0..149] of integer;
T_2:array[0..149] of integer;
T_3:array[0..149] of integer;
C1:array[0..4] of double;
C2:array[0..4] of double;
C3:array[0..4] of double;
type1:integer;
type2:integer;
type3:integer;
avg:array[0..4] of double;
JK:double;
JK_1:double;
ReadFile:text;
WriteFile:text;
implementation
{$R *.dfm}
procedure tform1.ComputeCentralPoint();
var
i,j,k:integer;
begin
for i:=0 to 4 do
begin
C1:=0;
C2:=0;
C3:=0;
end;
for i:=0 to 49 do
begin
for j:=0 to 3 do
begin
C1[j]:=C1[j]+Data[T_1][j];
C2[j]:=C1[j]+Data[T_2][j];
C3[j]:=C1[j]+Data[T_3][j];
end;
for k:=0 to 3 do
begin
C1[k]:=C1[k]/type1;
C2[k]:=C2[k]/type2;
C3[k]:=C3[k]/type3;
end;
end;
end;
procedure tform1.ComputeDistance();
var
d1:double;
d2:double;
d3:double;
i,j:integer;
begin
d1:=0;
d2:=0;
d3:=0;
type1:=0;
type2:=0;
type3:=0;
for i:=0 to 149 do
begin
for j:=0 to 3 do
begin
d1:=d1+power((Data[j]-C1[j]),2);
d2:=d2+power((Data[j]-C2[j]),2);
d3:=d3+power((Data[j]-C3[j]),2);
end;
if (d1<d2) and (d1<d3) then
begin
T_1[type1]:=i;
type1:=type1+1;
end;
if(d2<d1) and (d2<d3) then
begin
T_2[type2]:=i;
type2:=type2+1;
end;
if(d3<d2) and (d3<d1) then
begin
T_3[type3]:=i;
type3:=type3+1;
end;
d1:=0;
d2:=0;
d3:=0;
end;
end;
procedure Tform1.InitPoint();
var
i:integer;
j:integer;
Temp:double;
begin
//--------------------清零DATA数组
for i:=0 to 149 do
begin
for j:=0 to 3 do
begin
Data[j]:=0;
end;
end;
//---------------------------------读取book.txt内的数据到DATA数组
i:=0;
assignfile(ReadFile,'C:/Data.txt'); //打开book.txt这个文本文件
reset(ReadFile); //设为读取方式
try
While not Eof(ReadFile) do //当没有读到文件尾
begin
Readln(ReadFile,Temp_Data[0],Temp_Data[1],Temp_Data[2],Temp_Data[3],Temp_Data[4]); //读取文件行
Data[0]:= Temp_Data[1];
Data[1]:= Temp_Data[2];
Data[2]:= Temp_Data[3];
Data[3]:= Temp_Data[4];
i:=i+1;
end;
finally
closefile(ReadFile); //关闭文件
end;
type1:=50;
type2:=50;
type3:=50;
for i:=0 to 49 do
begin
T_1:=i;
T_2:=i+type1;
T_3:=i+type2+type1;
end;
ComputeCentralPoint();//计算中心点
end;
function tform1.IsEnd():integer;
var
i,j:integer;
t:double;
begin
JK:=0;
jk_1:=0;
for i:=0 to 49 do
begin
for j:=0 to 3 do
begin
JK:=JK+power((Data[T_1][j]-C1[j]),2);
JK:=JK+power((Data[T_2][j]-C2[j]),2);
JK:=JK+power((Data[T_3][j]-C3[j]),2);
end;
end;
t:=JK-JK_1;
IF(t<0) THEN
t:=-t;
if(t>0.0001 ) then
begin
JK_1:=JK;
Result:=0;
end
else
Result:=1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Flag:integer;
tempcount:integer;
i:integer;
Space:string;
begin
InitPoint();//初始化中心点
Flag:=IsEnd();// 结束标志
// showmessage(inttostr(Flag));
ComputeDistance();
while Flag<>1 do
begin
InitPoint();//初始化中心点
Flag:=IsEnd();// 结束标志
//showmessage(inttostr(Flag));
ComputeDistance();
end;
self.Label4.Caption:=inttostr(type1);
self.Label5.Caption:=inttostr(type2);
self.Label6.Caption:=inttostr(type3);
Space:='---';
tempcount:=1;
AssignFile(WriteFile, 'c:/result.txt'); // 将C:/MyFile.txt文件与F变量建立连接,后面可以使用F变量对文件进行操作。
Rewrite(WriteFile); // 创建新文件
for i:=0 to 49 do
begin
writeln(WriteFile,'第一类');
writeln(WriteFile,tempcount,Data[T_1][0],Data[T_1][1],Data[T_1][2],Data[T_1][3]);
tempcount:=tempcount+1;
end;
for i:=0 to 49 do
begin
writeln(WriteFile,'第二类');
writeln(WriteFile,tempcount,Data[T_2][0],Data[T_2][1],Data[T_2][2],Data[T_2][3]);
tempcount:=tempcount+1;
end;
for i:=0 to 49 do
begin
writeln(WriteFile,'第三类');
writeln(WriteFile,tempcount,Data[T_3][0],Data[T_3][1],Data[T_3][2],Data[T_3][3]);
tempcount:=tempcount+1;
end;
end;
end.
//中心点搜索过程的算法
//有150的点,初始时,分别属于3类,1-50第一类,51-100第二类,101-150第三类;
//初始化三个4维的中心点C1,C2,C3
//1/计算每个中心点与要求计算的150个样本之间的距离,
//2/把样本分别归属于3类点中.
//3/更新中心点
//4/判断是否结束,不可以结束的话,重复1,2,3,4这几个步骤
#include<iostream>
#include<fstream>//用于文件操作的头文件
#include<math.h>
#include<windows.h>
#include<stdlib.h>//exit()函数的头文件
#include<iomanip>//setw()函数的头文件
using namespace std;//标准类库,使用std这个名字空间
//
#define MAX 150 //数据的总个数是150个,即初始时是3类数据,每类是50个
#define MIN 4 //4维数据//
#define jingdu 0.0001//定义了初始化的精度
//
double Data[MAX][MIN];//用以表示Iris数据
int T_1[MAX],T_2[MAX],T_3[MAX];//3个桶用来装同类数据
double C1[MIN],C2[MIN],C3[MIN];
int type1,type2,type3;
double avg[MIN];
double JK,JK_1=0;
//
void ComputeCentralPoint(void)//计算中心点:即为求桶内数据样本的平均值
{
ZeroMemory(C1,0);
ZeroMemory(C2,0);
ZeroMemory(C3,0);
for(int i=0;i<type1;i++)
for(int j=0;j<MIN;j++)
C1[j]+=Data[T_1][j];
for(i=0;i<type2;i++)
for(int j=0;j<MIN;j++)
C2[j]+=Data[T_2][j];
for(i=0;i<type3;i++)
for(int j=0;j<MIN;j++)
C3[j]+=Data[T_3][j];
for(i=0;i<MIN;i++)
{
C1=C1/type1;
C2=C2/type2;
C3=C3/type3;
}
}
//
void ComputeDistance(void)//计算距离
{
double d1=0,d2=0,d3=0;
type1=type2=type3=0;
for(int i=0;i<MAX;i++)
{
for(int j=0;j<MIN;j++)//计算di(距离)
{
d1+=pow((Data[j]-C1[j]),2);
d2+=pow((Data[j]-C2[j]),2);
d3+=pow((Data[j]-C3[j]),2);
}
//看数据属于的类别,即di最小的就是第i类的
if(d1<d2 && d1<d3)
{
T_1[type1]=i;
type1++;
}
if(d2<d1 && d2<d3)
{
T_2[type2]=i;
type2++;
}
if(d3<d2 && d3<d1)
{
T_3[type3]=i;
type3++;
}
d1=d2=d3=0;
}
}
//
void InitPoint(void)//初始化中心点
{
ZeroMemory(Data,0);
double temp;
ifstream infile;
infile.open("Iris.txt"//从文件夹中读入信息
if(!infile)
{
cout<<"不能打开文件!"<<endl;
exit(0);
}
else
{
int i=0,j=0; //游标
while(infile>>temp) //第一列数据序号不保存
{
while( infile>>temp && j<4 ) //最后一列数据种类不保存
{
Data[j]=temp;
j++;
}
j=0;
i++;
}
}
type1=type2=type3=50;
for(int i=0;i<MAX/3;i++)
{
T_1=i;
T_2=i+type1;
T_3=i+type2+type1;
}
ComputeCentralPoint();//计算中心点
}
//
int J(void)//目标函数,判断程序什么时候结束的
{
JK=0;
for(int i=0;i<type1;i++)
for(int j=0 ;j<MIN;j++)
JK+=pow((Data[T_1][j]-C1[j]),2);
for(i=0;i<type2;i++)
for(int j=0 ;j<MIN;j++)
JK+=pow((Data[T_2][j]-C2[j]),2);
for(i=0;i<type3;i++)
for(int j=0 ;j<MIN;j++)
JK+=pow((Data[T_3][j]-C3[j]),2);
if(fabs(JK-JK_1)>jingdu)
{
JK_1=JK;
return 0;
}
else
return 1;
}
//主函数
void main()
{
InitPoint();//初始化中心点
int IsEnd=J();// 结束标志
ComputeDistance();
while(! IsEnd)
{
ComputeCentralPoint();
ComputeDistance();
IsEnd=J();
}
cout<<"--------------程序执行结果---------------"<<endl;
cout<<"第 1 类统计个数: "<<type1<<endl;
cout<<"第 2 类统计个数: "<<type2<<endl;
cout<<"第 3 类统计个数: "<<type3<<endl;
cout<<"-----------------------------------"<<endl;
int tempcount=1;
for(int i=0;i<type1;i++,tempcount++)
{
cout<<setw(4)<<tempcount<<" ";
for(int j=0;j<4;j++)
cout<<setw(4)<<Data[T_1][j];
cout<<setw(5)<<"1";
cout<<endl;
}
cout<<endl;
for( i=0;i<type2;i++,tempcount++)
{
cout<<setw(4)<< tempcount<<" ";
for(int j=0;j<4;j++)
cout<<setw(4)<<Data[T_2][j];
cout<<setw(5)<<"2";
cout<<endl;
}
cout<<endl;
for( i=0;i<type3;i++,tempcount++)
{
cout<<setw(3)<<tempcount<<" ";
for(int j=0;j<4;j++)
cout<<setw(4)<<Data[T_3][j];
cout<<setw(5)<<"3";
cout<<endl;
}
cout<<endl;
}
转成delphi后的
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,math;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure InitPoint();
procedure ComputeDistance();
procedure ComputeCentralPoint();
function IsEnd():integer;
end;
var
Form1: TForm1;
Data:array[0..149,0..3] of double;
Temp_Data:array[0..4] of double;
T_1:array[0..149] of integer;
T_2:array[0..149] of integer;
T_3:array[0..149] of integer;
C1:array[0..4] of double;
C2:array[0..4] of double;
C3:array[0..4] of double;
type1:integer;
type2:integer;
type3:integer;
avg:array[0..4] of double;
JK:double;
JK_1:double;
ReadFile:text;
WriteFile:text;
implementation
{$R *.dfm}
procedure tform1.ComputeCentralPoint();
var
i,j,k:integer;
begin
for i:=0 to 4 do
begin
C1:=0;
C2:=0;
C3:=0;
end;
for i:=0 to 49 do
begin
for j:=0 to 3 do
begin
C1[j]:=C1[j]+Data[T_1][j];
C2[j]:=C1[j]+Data[T_2][j];
C3[j]:=C1[j]+Data[T_3][j];
end;
for k:=0 to 3 do
begin
C1[k]:=C1[k]/type1;
C2[k]:=C2[k]/type2;
C3[k]:=C3[k]/type3;
end;
end;
end;
procedure tform1.ComputeDistance();
var
d1:double;
d2:double;
d3:double;
i,j:integer;
begin
d1:=0;
d2:=0;
d3:=0;
type1:=0;
type2:=0;
type3:=0;
for i:=0 to 149 do
begin
for j:=0 to 3 do
begin
d1:=d1+power((Data[j]-C1[j]),2);
d2:=d2+power((Data[j]-C2[j]),2);
d3:=d3+power((Data[j]-C3[j]),2);
end;
if (d1<d2) and (d1<d3) then
begin
T_1[type1]:=i;
type1:=type1+1;
end;
if(d2<d1) and (d2<d3) then
begin
T_2[type2]:=i;
type2:=type2+1;
end;
if(d3<d2) and (d3<d1) then
begin
T_3[type3]:=i;
type3:=type3+1;
end;
d1:=0;
d2:=0;
d3:=0;
end;
end;
procedure Tform1.InitPoint();
var
i:integer;
j:integer;
Temp:double;
begin
//--------------------清零DATA数组
for i:=0 to 149 do
begin
for j:=0 to 3 do
begin
Data[j]:=0;
end;
end;
//---------------------------------读取book.txt内的数据到DATA数组
i:=0;
assignfile(ReadFile,'C:/Data.txt'); //打开book.txt这个文本文件
reset(ReadFile); //设为读取方式
try
While not Eof(ReadFile) do //当没有读到文件尾
begin
Readln(ReadFile,Temp_Data[0],Temp_Data[1],Temp_Data[2],Temp_Data[3],Temp_Data[4]); //读取文件行
Data[0]:= Temp_Data[1];
Data[1]:= Temp_Data[2];
Data[2]:= Temp_Data[3];
Data[3]:= Temp_Data[4];
i:=i+1;
end;
finally
closefile(ReadFile); //关闭文件
end;
type1:=50;
type2:=50;
type3:=50;
for i:=0 to 49 do
begin
T_1:=i;
T_2:=i+type1;
T_3:=i+type2+type1;
end;
ComputeCentralPoint();//计算中心点
end;
function tform1.IsEnd():integer;
var
i,j:integer;
t:double;
begin
JK:=0;
jk_1:=0;
for i:=0 to 49 do
begin
for j:=0 to 3 do
begin
JK:=JK+power((Data[T_1][j]-C1[j]),2);
JK:=JK+power((Data[T_2][j]-C2[j]),2);
JK:=JK+power((Data[T_3][j]-C3[j]),2);
end;
end;
t:=JK-JK_1;
IF(t<0) THEN
t:=-t;
if(t>0.0001 ) then
begin
JK_1:=JK;
Result:=0;
end
else
Result:=1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Flag:integer;
tempcount:integer;
i:integer;
Space:string;
begin
InitPoint();//初始化中心点
Flag:=IsEnd();// 结束标志
// showmessage(inttostr(Flag));
ComputeDistance();
while Flag<>1 do
begin
InitPoint();//初始化中心点
Flag:=IsEnd();// 结束标志
//showmessage(inttostr(Flag));
ComputeDistance();
end;
self.Label4.Caption:=inttostr(type1);
self.Label5.Caption:=inttostr(type2);
self.Label6.Caption:=inttostr(type3);
Space:='---';
tempcount:=1;
AssignFile(WriteFile, 'c:/result.txt'); // 将C:/MyFile.txt文件与F变量建立连接,后面可以使用F变量对文件进行操作。
Rewrite(WriteFile); // 创建新文件
for i:=0 to 49 do
begin
writeln(WriteFile,'第一类');
writeln(WriteFile,tempcount,Data[T_1][0],Data[T_1][1],Data[T_1][2],Data[T_1][3]);
tempcount:=tempcount+1;
end;
for i:=0 to 49 do
begin
writeln(WriteFile,'第二类');
writeln(WriteFile,tempcount,Data[T_2][0],Data[T_2][1],Data[T_2][2],Data[T_2][3]);
tempcount:=tempcount+1;
end;
for i:=0 to 49 do
begin
writeln(WriteFile,'第三类');
writeln(WriteFile,tempcount,Data[T_3][0],Data[T_3][1],Data[T_3][2],Data[T_3][3]);
tempcount:=tempcount+1;
end;
end;
end.