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(); }
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 }