Exemplo n.º 1
0
 public Assignment(Variable var,OverFloorType val)
 {
     this.variable = var;
     this.value = val;
     this.nConflicts = 0;
     domainPrune = new Dictionary<Vector2, List<OverFloorType>> ();
 }
Exemplo n.º 2
0
    /// <summary>
    /// Instantiate a tile with data provided
    /// </summary>
    /// <param name="pos">Position to instantiate the object</param>
    /// <param name="over">Type of object to be instantiated</param>
    private void CreateTile(Vector3 pos, OverFloorType over)
    {
        var        cell = matrix[(int)pos.x, (int)pos.y];
        GameObject tile = (GameObject)GameObject.Instantiate(this.Tile, pos, Quaternion.identity);

        cellInstances[cell.Id] = tile;

        tile.transform.SetParent(boardHolder);
        GameObject toInstantiate = null;

        switch (over)
        {
        case OverFloorType.Mud:
            toInstantiate = this.Mud;
            break;

        case OverFloorType.Wall:
            toInstantiate = this.Wall;
            break;

        default:
            break;
        }

        if (toInstantiate != null)
        {
            GameObject overObject = (GameObject)GameObject.Instantiate(toInstantiate, pos, Quaternion.identity);
            overObject.transform.SetParent(tile.transform);
        }
    }
Exemplo n.º 3
0
        /// <summary>
        /// Creates the assignment and prunes other variables
        /// </summary>
        /// <param name="var">Variable.</param>
        /// <param name="val">Value.</param>
        /// <returns>True if the assignment is legal</returns>
        public bool AssignValue(Variable var, OverFloorType val, bool inference = true)
        {
            //Create a new assignment
            Assignment assign = new Assignment(var, val);
            //Get current domain before MAC3 to store posible values to prune
            List <OverFloorType> domainBeformMAC = var.remDomain.ToList();
            //Get variable prunes
            var validAssignment = true;

            if (inference)
            {
                validAssignment = Search.MAC3(ref assign, new CSP(this));
            }
            if (validAssignment)
            {
                //Prune all values that are not a variable
                assign.domainPrune.Add(var.pos, domainBeformMAC.Where(r => r != val).ToList());
                //Go over variable domain prunes to remove from variables
                foreach (var varPrune in assign.domainPrune.Keys)
                {
                    List <OverFloorType> valuesToPrune = assign.domainPrune[varPrune];
                    Variable             varToPrune    = vars.First(v => v.pos == varPrune);
                    foreach (var vPrune in valuesToPrune)
                    {
                        varToPrune.removeDomainElement(vPrune);
                    }
                }
                //Save the assignment
                assignments.Add(assign);
            }
            return(validAssignment);
        }
Exemplo n.º 4
0
 public Assignment(Variable var, OverFloorType val)
 {
     this.variable   = var;
     this.value      = val;
     this.nConflicts = 0;
     domainPrune     = new Dictionary <Vector2, List <OverFloorType> > ();
 }
Exemplo n.º 5
0
 /// <summary>
 /// Add a prune of a value to a variable
 /// </summary>
 /// <param name="var">Variable to be pruned</param>
 /// <param name="val">Value that will be pruned</param>
 public void AddDomainPrune(Vector2 var, OverFloorType val)
 {
     if (!domainPrune.ContainsKey(var))
     {
         domainPrune [var] = new List <OverFloorType> ();
     }
     domainPrune [var].Add(val);
 }
Exemplo n.º 6
0
    /// <summary>
    /// Generates a random number of tiles using CSP constraint validaton
    /// </summary>
    /// <param name="matrix">Cell matrix to be filled</param>
    /// <returns>Cell matrix with random values generated</returns>
    private Cell[,] GenerateRandomTiles(Cell[,] matrix)
    {
        //Initialize a new random generator
        System.Random random = new System.Random();

        //Get number of tiles
        var totalNumberOfTiles  = this.numTiles * this.numTiles;
        var numberOfRandomTiles = totalNumberOfTiles * randomGeneratedTilesRate / 100;
        //List with all possible values
        List <OverFloorType> values = Enum.GetValues(typeof(OverFloorType)).OfType <OverFloorType>().Where(o => Convert.ToInt32(o) >= 0).ToList();

        for (int i = 0; i < numberOfRandomTiles; i++)
        {
            bool generatedValue = false;
            //Loop until a valid random generated value has been created for this turn
            while (!generatedValue)
            {
                //Generate a random number for x and y
                var x = random.Next(numTiles);
                var y = random.Next(numTiles);
                //Only assign value to unassigned
                if (matrix[x, y].overFloor == OverFloorType.NONE)
                {
                    //Generate a random value
                    Array         overfloortypes = Enum.GetValues(typeof(OverFloorType));
                    OverFloorType randomType     = OverFloorType.NONE;
                    while (randomType == OverFloorType.NONE)
                    {
                        randomType = (OverFloorType)overfloortypes.GetValue(random.Next(0, overfloortypes.Length));
                    }
                    //Assign the value
                    matrix[x, y].overFloor = randomType;
                    List <Variable> vars    = ConvertMatrixToVars(matrix);
                    CSP             problem = new CSP(vars, values, toleranceFW, toleranceFM);
                    if (problem.ValidateConstraints())
                    {
                        generatedValue = true;
                        Debug.Log(string.Format("Position assigned:[{0},{1}] Value: {2}", x.ToString(), y.ToString(), randomType.ToString()));
                    }
                    else
                    {
                        matrix[x, y].overFloor = OverFloorType.NONE;
                    }
                }
            }
        }

        return(matrix);
    }
Exemplo n.º 7
0
 /// <summary>
 /// Removes a value from the domain
 /// </summary>
 /// <param name="elem">Value to be removed</param>
 public void removeDomainElement(OverFloorType elem)
 {
     remDomain.Remove (elem);
 }
Exemplo n.º 8
0
 /// <summary>
 /// Add a prune of a value to a variable
 /// </summary>
 /// <param name="var">Variable to be pruned</param>
 /// <param name="val">Value that will be pruned</param>
 public void AddDomainPrune(Vector2 var,OverFloorType val)
 {
     if (!domainPrune.ContainsKey (var))
         domainPrune [var] = new List<OverFloorType> ();
     domainPrune [var].Add (val);
 }
Exemplo n.º 9
0
 /// <summary>
 /// Add a value to the domain
 /// </summary>
 /// <param name="elem">Value to be added to the domain</param>
 public void addDomainElement(OverFloorType elem)
 {
     remDomain.Add (elem);
 }
Exemplo n.º 10
0
 public Variable(Vector2 posVar, OverFloorType? val, List<OverFloorType> remDomain)
 {
     this.pos = posVar;
     this.val = val;
     this.remDomain = new List<OverFloorType>();
     remDomain.ForEach(d => this.remDomain.Add(d));
 }
Exemplo n.º 11
0
 public Variable(Vector2 posVar,OverFloorType val)
 {
     this.pos = posVar;
     this.val = val;
 }
Exemplo n.º 12
0
 /// <summary>
 /// Removes a available value from a variable
 /// </summary>
 /// <param name="var"></param>
 /// <param name="value"></param>
 public void RemoveDomainElementFromVariable(Variable var, OverFloorType value)
 {
     this.vars.First(v=>v.pos == var.pos).removeDomainElement(value);
 }
Exemplo n.º 13
0
 /// <summary>
 /// Removes a available value from a variable
 /// </summary>
 /// <param name="var"></param>
 /// <param name="value"></param>
 public void RemoveDomainElementFromVariable(Variable var, OverFloorType value)
 {
     this.vars.First(v => v.pos == var.pos).removeDomainElement(value);
 }
Exemplo n.º 14
0
 /// <summary>
 /// Creates the assignment and prunes other variables
 /// </summary>
 /// <param name="var">Variable.</param>
 /// <param name="val">Value.</param>
 /// <returns>True if the assignment is legal</returns>
 public bool AssignValue(Variable var,OverFloorType val, bool inference = true)
 {
     //Create a new assignment
     Assignment assign = new Assignment (var, val);
     //Get current domain before MAC3 to store posible values to prune
     List<OverFloorType> domainBeformMAC = var.remDomain.ToList();
     //Get variable prunes
     var validAssignment = true;
     if (inference)
         validAssignment = Search.MAC3(ref assign, new CSP(this) );
     if (validAssignment)
     {
         //Prune all values that are not a variable
         assign.domainPrune.Add(var.pos, domainBeformMAC.Where(r => r != val).ToList());
         //Go over variable domain prunes to remove from variables
         foreach (var varPrune in assign.domainPrune.Keys)
         {
             List<OverFloorType> valuesToPrune = assign.domainPrune[varPrune];
             Variable varToPrune = vars.First(v => v.pos == varPrune);
             foreach (var vPrune in valuesToPrune)
             {
                 varToPrune.removeDomainElement(vPrune);
             }
         }
         //Save the assignment
         assignments.Add(assign);
     }
     return validAssignment;
 }
Exemplo n.º 15
0
    /// <summary>
    /// Instantiate a tile with data provided 
    /// </summary>
    /// <param name="pos">Position to instantiate the object</param>
    /// <param name="over">Type of object to be instantiated</param>
    private void CreateTile(Vector3 pos,OverFloorType over)
    {
        var cell = matrix[(int)pos.x, (int)pos.y];
        GameObject tile = (GameObject)GameObject.Instantiate (this.Tile, pos, Quaternion.identity);
        cellInstances[cell.Id] = tile;

        tile.transform.SetParent (boardHolder);
        GameObject toInstantiate = null;
        switch (over) {
        case OverFloorType.Mud:
                toInstantiate = this.Mud;
            break;
        case OverFloorType.Wall:
            toInstantiate = this.Wall;
            break;
        default:
            break;
        }

        if (toInstantiate != null) {
            GameObject overObject = (GameObject)GameObject.Instantiate (toInstantiate, pos, Quaternion.identity);
            overObject.transform.SetParent(tile.transform);
        }
    }
Exemplo n.º 16
0
 /// <summary>
 /// Add a value to the domain
 /// </summary>
 /// <param name="elem">Value to be added to the domain</param>
 public void addDomainElement(OverFloorType elem)
 {
     remDomain.Add(elem);
 }
Exemplo n.º 17
0
 /// <summary>
 /// Removes a value from the domain
 /// </summary>
 /// <param name="elem">Value to be removed</param>
 public void removeDomainElement(OverFloorType elem)
 {
     remDomain.Remove(elem);
 }
Exemplo n.º 18
0
 public Variable(Vector2 posVar, OverFloorType val)
 {
     this.pos = posVar;
     this.val = val;
 }