void RunAITest(void)
	{
		AI::Brain::Ptr brain(new AI::Brain);

		// 1. Note that parts are implicitly created.
		// 2. Set up actions.
		// Set up Move action. 
		// Post conditions are NOT required, because they are only used to 
			// add influence to an action based on the possibility that they will lead to a goal.
		// TODO: Passing the brain to the action suggests the brain should
			// control creating the action...
			
		Monkey_Action move("Move", brain);

		// For an action to be available, the current actor state must have the same values for the parts listed.
		move.pre("ToBox", "MonkeyAndBox", "Away"); // Pre-Condition -> Part, Value
		move.post("ToBox", "MonkeyAndBox", "NextTo"); // Post-Condition -> Part, Value

		move.pre("FromBox", "MonkeyAndBox", "NextTo");
		move.post("FromBox", "MonkeyAndBox", "Away");

		// Set up Push action
		Monkey_Action pushBox("PushBox", brain);
		
		pushBox.pre("UnderBannanas", "MonkeyAndBox", "NextTo"); // Pre-Condition -> Part, Value
		pushBox.pre("UnderBannanas", "BoxUnderBannanas", "F");	 //								-> Part, Value
		pushBox.post("UnderBannanas", "BoxUnderBannanas", "T");

		pushBox.pre("NotUnder", "MonkeyAndBox", "NextTo");
		pushBox.pre("NotUnder", "BoxUnderBannanas", "T");
		pushBox.post("NotUnder", "BoxUnderBannanas", "F");

		// Set up Climb action
		Monkey_Action climbBox( "ClimbBox", brain );
		climbBox.pre("Up", "MonkeyAndBox", "NextTo");
		climbBox.post("Up", "MonkeyAndBox", "OnBox");

		climbBox.pre("Down", "MonkeyAndBox", "OnBox" );
		climbBox.post("Down", "MonkeyAndBox", "NextTo" );

		// Set up Take action
		Monkey_Action takeBannanas( "TakeBannanas", brain );
		takeBannanas.pre("Yum", "MonkeyAndBox", "OnBox" );
		takeBannanas.pre("Yum", "BoxUnderBannanas","T");
		takeBannanas.post("Yum", "HasBannanas", "T");

		// 3. Setup an actor.
		AI::Actor monkey(brain);
		
		// Give the actor actions it can perform.
		monkey.addAction( &move );
		monkey.addAction( &pushBox );
		monkey.addAction( &climbBox );
		monkey.addAction( &takeBannanas );

		const int ITERATIONS = 1;

		float avg = 0.0f;
		for ( int i = 0; i < ITERATIONS; ++i )
		{
			// Set the actor's current state part values.
			monkey.currentValue("BoxUnderBannanas", "F");
			monkey.currentValue("HasBannanas", "F");
			monkey.currentValue("MonkeyAndBox", "Away");

			// Set the actor's current goal.
			AI::Actor::Goal getBannanas;
			getBannanas.influence(10.0f);
			getBannanas.state().setValue(brain->part("HasBannanas"), "T");

			monkey.addGoal(getBannanas);
			
			int actions = 0;
			AI::Action::Outcome outcome = AI::Action::Impossible;
			do 
			{
				actions ++;
				outcome = monkey.getAction()->perform(monkey);
			} while(outcome != AI::Action::Impossible && monkey.goalsSatisfied().size() == 0);

			assert(monkey.goalsSatisfied().size() == 1);
			avg += actions;
		}
		
		AI::Output::Out() << "Actions: " << avg / ITERATIONS << AI::Output::endl();
	}
Example #2
0
        void getCuts(const snowgoose::Box<FT>& box, std::vector<std::shared_ptr <Cut <FT> > >& v) const {
            const int n = mBox.mDim;
            snowgoose::Box<FT> nbox(n);
            snowgoose::BoxUtils::copy(box, nbox);
            FT r;
            auto comp = [&] () {
                snowgoose::BoxUtils::getCenter(nbox, (FT*) mX);
                r = snowgoose::BoxUtils::radius(nbox);
                mF.hess(mX, mH);
                mHessSupp.getLpzConst(box, mLH);
            };
            comp();
            std::vector< snowgoose::Box<FT> > boxv;
            boxv.push_back(nbox);
            bool savecut = false;
            for (int i = 0; i < n; i++) {
                int ii = i + i * n;
                FT lb = mH[ii] - r * mLH[ii];
                FT ub = mH[ii] + r * mLH[ii];
                if (ub < -mDelta) {
                    savecut = true;
                    std::vector< snowgoose::Box<FT> > nbx;
                    while (!boxv.empty()) {
                        snowgoose::Box<FT> bx = boxv.back();
                        boxv.pop_back();
                        if (bx.mA[i] == mBox.mA[i]) {
                            snowgoose::Box<FT> bxa(bx);
                            bxa.mB[i] = bxa.mA[i];
                            nbx.push_back(bxa);
                        } 
                        if (bx.mB[i] == mBox.mB[i]) {
                            snowgoose::Box<FT> bxb(bx);
                            bxb.mA[i] = bxb.mB[i];
                            nbx.push_back(bxb);
                        }
                    }
                    boxv = std::move(nbx);
                    
                } else {

                }
                if (boxv.empty()) {
                    auto tc = new TotalCut <FT> (box);
                    std::shared_ptr< Cut<FT> > pc(tc);
                    v.push_back(pc);
                    break;
                }
            }

            if (savecut) {
                auto savebox = new NUC::SaveBoxCut<double>(box);
                for (auto b : boxv) {
                    savebox->pushBox(b);
                }
                std::shared_ptr< NUC::Cut<FT> > pc(savebox);
                v.push_back(pc);
            }

            /*
            r = 0;
            for (int i = 0; i < n; i++) {
                FT nr = 0;
                if (mLH[i] == 0)
                    continue;
                if (mH[i] >= mDelta) {
                    nr = (mH[i] - mDelta) / mLH[i];
                } else if (mH[i] <= -mDelta) {
                    nr = -(mH[i] + mDelta) / mLH[i];
                }
                if (nr > r)
                    r = nr;
            }
            std::cout << "r = " << r << "\n";
             */
#if 0            
            if (r > 0) {
                auto exballcut = new NUC::ExcludeBallCut<FT>(nbox, r, mX);
                std::shared_ptr< NUC::Cut<FT> > pc(exballcut);
                v.push_back(pc);
            }
#endif            
        }