예제 #1
0
파일: cNN.c 프로젝트: arturo393/IRMA
int cConceptualNN::evaluateSOM()
{
    pnnLayer  tempLayer;

    pnnStruct tempNN;
    pnnStruct tempPrevNN;

    pnnWeight tempWgt;

    double sum;
    double firstInput;

    //cuidado con este for... revisar
//    printf("peso1 %f", layerList->nn->wgth->wgth);
//    getchar();
    tempLayer = layerList;             //inicialización

//        printf("peso1 %f", tempLayer->nn->wgth->wgth);
//    getchar();
    for( tempNN  = tempLayer->nn; //inicialización
         tempNN != NULL;         //mientras la capa tenga neuronas
         tempNN  = tempNN->nn )   //avanza una neurona
    {
         sum = 0.0;

        if( tempLayer->idLayer == 0 )
        {
            //poner procedimiento caso primera capa neurona
            //this->loadImg2NN(i);   //se carga el input en la primera capa de neuronas

            firstInput = (tempNN->input)*(tempNN->wgth->wgth);
            tempNN->output = sigmoide(firstInput);      //se calcula el output en base al input

        }
        else
        {
            for( tempPrevNN = tempLayer->prevLayer->nn, //tempPrevNN = la primera neurona de la capa previa (l-1)
                 tempWgt    =  tempNN->wgth;              // se inicializa además el puntero al peso de la neurona
                                                              //correspondiente a la capa (l)
                 tempPrevNN != NULL;                       //mientras haya neuronas en la capa previa

                 tempWgt    = tempWgt->nextwgth,         //se avanza un peso
                 tempPrevNN = tempPrevNN->nn )            //y se avanza una neurona
            {
                sum += (tempWgt->wgth)*(tempPrevNN->output);
            }
            tempNN->input  = sum;
            tempNN->output = sigmoide(tempNN->input);      //se calcula el output en base al input
            //poner procedimiento resto de las neuronas
            //falta poner el resultado que entrega la capa de neuronas Nº 7

            if( tempLayer->idLayer == 6 ) printf("%f ", tempNN->output);
        }

    }

    return 1;
}
예제 #2
0
fmat predict(const fmat& X_test, const fmat& Theta) {
    fmat resultado = sigmoide(X_test * Theta);
    return resultado;
}
예제 #3
0
fmat gdStep(const fmat& Theta, const fmat& X, const fmat& Y, double alpha, double lambda) {
    fmat gradient = (alpha / X.n_rows) * X.t() * (sigmoide(X * Theta) - Y);
    fmat reg = (lambda / X.n_rows) * Theta;
    reg.row(0) = zeros<frowvec>(Y.n_cols);
    return Theta - gradient - reg;
}
예제 #4
0
void SpecificWorker::compute()
{
    RoboCompDifferentialRobot::TBaseState bState;
    differentialrobot_proxy->getBaseState ( bState );
    RoboCompLaser::TLaserData datosLaser;
    datosLaser= laser_proxy->getLaserData();//Obtenemos datos del Laser
    inner->updateTransformValues ( "robot",bState.x,0,bState.z,0,bState.alpha,0 );
    // datosLaser= laser_proxy->getLaserData();//Obtenemos datos del Laser
    std::sort ( datosLaser.begin() +20, datosLaser.end()-20,[] ( auto a, auto b )
    {
        return a.dist< b.dist;
    } ); //Ordenamos las distancias del frente
    tR = inner->transform ( "robot" ,QVec::vec3 ( parxz.first, 0, parxz.second ),"world" );
    d = tR.norm2(); // distancia del robot al punto marcado
    float vRot = atan2 ( tR.x(),tR.z() ); //devuelve radianes del angulo q forma donde apunta el robot con el punto destino.

    //Refresca el estado
     if ( target.isEmpty() == false && target.haCambiado())
        {
            //Calcular punto inicial,punto final,y trayectoria entre ellos
            // parIni = //Falta el punto inicial
            parxz = target.get();//Punto final
            tR = inner->transform ( "robot" ,QVec::vec3 ( parxz.first, 0, parxz.second ),"world" );
            d = tR.norm2(); // distancia del robot al punto marcado
            estado= Estado::AVANZANDO;
            target.setCambiado(false);

        }
    
    
    switch ( estado )
    {
    case Estado::PARADO:
        qDebug() << "PARADO";
	     if ( target.isEmpty() == false)
        {
            //Calcular punto inicial,punto final,y trayectoria entre ellos
            // parIni = //Falta el punto inicial
            parxz = target.get();//Punto final
            tR = inner->transform ( "robot" ,QVec::vec3 ( parxz.first, 0, parxz.second ),"world" );
            d = tR.norm2(); // distancia del robot al punto marcado
            estado= Estado::AVANZANDO;
            target.setCambiado(false);

        }
       
        break;

    case Estado::AVANZANDO:
         qDebug() << "AVANZANDO";

        if ( datosLaser[20].dist < UMBRAL ) //Si hay obstaculo
        {
            //Pasa a estado de Giro
            estado = Estado::GIRANDO;
            break ;

        }

        if ( d > 50 )
        {

            //Si no ha llegado
            float velAvance = d;// version antigua
            if ( vRot > MAX_ROT )
            {
                vRot = MAX_ROT;
            }

            velAvance=MAX_ADV*sigmoide ( d ) *gauss ( vRot,0.3,0.5 );


            differentialrobot_proxy->setSpeedBase ( velAvance,vRot );
        }
        else
        {
            //Si ha llegado al sitio
            estado = Estado::LLEGADO;
        }


        break;


    case Estado::GIRANDO:
	 qDebug() << "GIRANDO";

        if ( datosLaser[20].dist>UMBRAL )
        {
            estado=Estado::BORDEANDO;
        }
        else
        {
            //float d= rand()%1000000+100000;
            differentialrobot_proxy->setSpeedBase ( 0,0.75 );
            //usleep(d);
        }



        break;

    case Estado::BORDEANDO:
        qDebug() << "BORDEANDO";
        if ( datosLaser[20].dist>UMBRAL && ( vRot<ANGULO_VISION && vRot > -(ANGULO_VISION) )) //Que no haya obstaculos en el frente y vaya hacia el objetivo
        {
            estado=Estado::AVANZANDO;
        }
        if ( datosLaser[20].dist<UMBRAL ) //Si hay dos obstaculos en L, debe volver a girar para no tener obstaculo en frente
        {
            estado=Estado::GIRANDO;
        }
        if ( d < 280 )
        {
            estado=Estado::LLEGADO;
        }
        //Condicion 2 para llegar al objetivo
        //if (
        //Ordenar los 20 primeros
        std::sort ( datosLaser.end()-19, datosLaser.end()-10,[] ( auto a, auto b )
        {
            return a.dist< b.dist;
        } ); //Valores de la izda

        //Evaluamos distancia izda
        //qDebug() <<  "Distancia:" <<datosLaser[81].dist;
        if ( datosLaser[81].dist < 400 ) //Que la distancia izda sea esa
        {
            //Avanzar
            differentialrobot_proxy->setSpeedBase ( 100,0 );
        }
        else
        {
            differentialrobot_proxy->setSpeedBase ( 0,-0.75 );

        }
        break;

    case Estado::LLEGADO:
         qDebug() << "LLEGADO";

        differentialrobot_proxy->setSpeedBase ( 0,0 );
        target.setEmpty();
        estado=Estado::PARADO;

        break;

    }
}