感知器算法——二维优化

#include<stdio.h>
#include<time.h>
#define C 1
int main()
{
    //s[]用于记录各点坐标乘积;
    //arrey[]用于存放将输入点变换后的点
    int i,j,k,N1,N2,x[20][2],s[3],d[20],arrey[20][4],w[4];
    int count=1;
    printf("感知器算法(两类别2维问题)\n");
    printf("\n请输入第1类坐标点数N1:");
    scanf("%d",&N1);
    printf("请输入第1类各点的坐标:\n");
    for( i=0; i<N1 ; i++)
        scanf("%d,%d",&x[i][0],&x[i][1]);
    printf("\n请输入第二类坐标点数N2:");
    scanf("%d",&N2);
    printf("请输入第二类各点的坐标:\n");
    for( i=0; i<N2 ; i++)
        scanf("%d,%d",&x[i+N1][0],&x[i+N1][1]);
    printf("\n输入的第一类点为:\n");
    for( j=0 ; j< N1 ; j++)
    {
        arrey[j][0]=1;
        arrey[j][1]=x[j][0];
        arrey[j][2]=x[j][1];
        arrey[j][3]=1;
        printf("(%d,%d,%d)\n",arrey[j][1],arrey[j][2],arrey[j][3]);
    }
    printf("\n输入的第二类点为:\n");
    for( j=N1 ; j<(N1+N2) ; j++)
    {
        arrey[j][0]=2;
        arrey[j][1]=(-1)*x[j][0];
        arrey[j][2]=(-1)*x[j][1];
        arrey[j][3]=-1;
        printf("(%d,%d,%d)\n",arrey[j][1],arrey[j][2],arrey[j][3]);
    }
    printf("\n取参数C为:%d\n",C);
    printf("初始向量 w(1)=:");
    w[0]=1;
    w[1]=0;
    w[2]=0;
    w[3]=0;
    printf("(%d,%d,%d)\n\n",w[1],w[2],w[3]);
    printf("迭代过程如下:\n\n");
    do
    {
        for( i=0 ; i<(N1+N2) ; i++)
        {
            for( j=0; j<3 ; j++)
                s[j]=arrey[i][j+1]*w[j+1];
            printf("w(%d)*x(%d)=(%d,%d,%d)*(%d,%d,%d)t",count,count,w[1],w[2],w[3],arrey[i][1],arrey[i][2],arrey[i][3]);
            d[i]=s[0]+s[1]+s[2];
            printf("=%d\n",d[i]);
            if(d[i]<=0)//如果d[i]<=0, 则要惩罚
            {
                for(k=0; k<3 ; k++)
                    w[k+1]=C*arrey[i][k+1]+w[k+1];
                printf("w(%d)*x(%d)=%d<=0,要惩罚,惩罚后向量 w(%d)=:(",count,count,d[i],count+1);
                printf("%d,%d,%d",w[1],w[2],w[3]);
                printf(")\n");
            }
            else
            {
                printf("w(%d)*x(%d)=%d>0,向量 w(%d)=:(",count,count,d[i],count+1);
                printf("%d,%d,%d",w[1],w[2],w[3]);
                printf(")\n");
            }
            printf("\n");
            count++;
        }
        k=0;
        for(j=(N1+N2-1); j>=0 ; j--)
            if(d[j]>0)
                k++;
        if(k<N1+N2)
            printf("未能收敛,继续迭代\n\n");
    }
    while(k<N1+N2);
    printf("\n优化后的向量 w(%d)=:(",count);
    printf("%d,%d,%d",w[1],w[2],w[3]);
    printf(")\n");
    printf("判别函数为:d(x)=(%d)x1+(%d)x2+(%d)",w[1],w[2],w[3]);
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值