本文介绍了传教士和食人族,有A *的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用A *来实现传教士和食人族?
我的启发式函数是(InitialSide/BoatCapacity上的人数)= 3/2
这是我的州立课程(.cs)

how can I implement missionary and cannibals with A*?
My huristic function is (Number Of People On InitialSide/BoatCapacity)=3/2
this is my state class(.cs)

using System;
//using System.Collections.Generic;
//using System.Text;

namespace MissinaryandCannibal
{
   
    class State
    {
        // Instance fields
        public int MCount, CCount;
        public bool Side;
        private int firstN = 3;
        private String Name;
        private State PrevState;
        private int stateTL = 0;
        /////////////////////////////////////////////////////////////////////////////////////////////////
        public State(String Name, int MCount, int CCount, bool Side,
                State PrevState, int stateTL)
        {
            //Assign parameters to local instance fields
            this.Name = Name;
            this.MCount = MCount;
            this.CCount = CCount;
            this.Side = Side;
            this.PrevState = PrevState;
            this.stateTL = stateTL;
        }
        //State Constructer (1), Use this for the root state 
        //Simply creates a new State with the name, number of Missionaries,
        //number of Cannibals and side to match the values supplied by
        //the formal parameters. In this case there will be no PrevState as this
        //is the 1st state
        //
        //param : Name is the name for this State
        //param : MCount the number on Missionaries for this state
        //param : CCount the number on Cannibals for this state
        //param : Side the side of the river that the boat is now on
        //param : stateTL the level this state is on, 0=root / 1st layer, 1 = 2nd layer, 2 = 3rd layer
        public State(String Name, int MCount, int CCount, bool Side, int stateTL) : this(Name, MCount, CCount, Side, null, stateTL)
        {
            //Call the overloaded constructor with the formal parameters
            //provided, but make PrevState=null, as the 1st State does not
            //have a PrevState to point to
            //this(Name, MCount, CCount, Side, null, stateTL);
        }

        //State Constructer (2), Use this to create States based upon other States
        //Simply creates a new State with the name, number of Missionaries,
        //number of Cannibals,side and PrevState to match the values supplied by
        //the formal parameters. In this case PrevState will be a pointer to this
        //nodes parent node
        //
        // Name is the name for this State
        //
        // MCount the number on Missionaries for this state
        //
        / CCount the number on Cannibals for this state
        //
        //Side the side of the river that the boat is now on
        //
        //PrevState a pointer to this State's PrevState (parent)
        //
        // stateTL the level this state is on, 0=root / 1st layer, 1 = 2nd layer, 2 = 3rd layer
       

        public int getstateTL() 
        {
            return this.stateTL;
        }

       
        public String getName()
        {
            return this.Name;
        }

        //Prints a full search path of how this state came to be at the
        //goal state.
        public void Print() 
        {

            //Check that there is a PrevState, Root node will not have one, so
            //that is when all states from Goal - to start have been printed
            if (PrevState != null) {
                //Use recursion to allow Previous state to print its own data paths
                PrevState.Print();
            }

            String whichSide = Side ? "~~~~~|_Boat_|~~~~~>" : "<~~~~|_Boat_| ~~~~~";

            //Print the current state.
            Console.WriteLine(MCount + "Missionary & " + CCount + " Cannibal " + whichSide + " " +
                         (firstN - MCount) + " Missionary &" +
                         (firstN - CCount) + " Cannibal");
        }

        public bool okChecked(State StateToCheck) 
        {
            return (MCount == StateToCheck.MCount &&
                CCount == StateToCheck.CCount &&
                Side == StateToCheck.Side);
        }

        public bool wrongState() 
        {
            int projType1 = 0;
            int projType2 = 0;

            //Check to see if the user requested that there be more Cannibals than
            //Missionaries. If this is the case set projType variables for this
            //situation
            if (mainclass.projType)
            {
                projType1 = CCount;
                projType2 = MCount;
            }
            //Otherwise set the siutation to be that there be more Missionaries than
            //Cannibals
            else 
            {
                projType1 = MCount;
                projType2 = CCount;
            }
            // Check for < 0, which could actually happen unless it is checked for here
            if (MCount < 0 || CCount < 0 ||
                MCount > firstN ||
                CCount > firstN)
                return true;
            //Do projType2 outnumbers projType1(only worry when there is at least
            //one projType1) one Side1
            if (projType1 < projType2 && projType1 > 0)
                return true;
            //Do projType2 outnumbers projType1(only worry when there is at least
            //one projType1) one Side2
            if ( (firstN - projType1 <
                  firstN - projType2) &&
                (firstN - projType1 > 0))
                return true;
            //At this point the State must be valid
            return false;
        }

    } //End of State class
    //#endregion
}

推荐答案


这篇关于传教士和食人族,有A *的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-18 17:52