1. Homepage
  2. Programming
  3. COMPSCI 761 - Advanced Topics in Artificial Intelligence - 22S2 Assignment 1: Game of Fifteen and Search Algorithms

COMPSCI 761 - Advanced Topics in Artificial Intelligence - 22S2 Assignment 1: Game of Fifteen and Search Algorithms

Engage in a Conversation
AunklandCOMPSCI 761Advanced Topics in Artificial IntelligencePythonArtificial IntelligenceGame of FifteenEuclidean DistanceSearch algorithmsAStarSearcher

COMPSCI 761 22S2 Assignment 1 CourseNana.COM

  • Lecturer: Anna Trofimova
  • School of Computer Science, The Univerity of Auckland
  • Last update 29th of July at 18:00pm, 2022

Student: CourseNana.COM

Submission CourseNana.COM

This interactive notebook contains the instructions to complete assignment 1; You should submit this notebook with the code and answers in one single file in .ipybn format with name assignment1.ipybn. Write your name and UPI in the cell above (to edit the markdown text double-click the cell). CourseNana.COM

There is a maximum file size cap of 5MB, so make sure your submission does not exceed this size. The submitted notebook should contain all your source code and answers. You can add new cells and use markdown text to organise and explain your implementation/answer. CourseNana.COM

Submit your files using CANVAS upload function. CourseNana.COM

The submission deadline is 19th of August at 11.59pm, 2022. CourseNana.COM

Description CourseNana.COM

This assignment consists of two problems presented in a puzzle game context. For the first problem, you will be implementing a path search problem along with common search algorithms and evaluating their properties. For the second problem, you will be exploring how to define and solve a constraint satisfaction problem. To implement the solutions, you have to use AIPython code that provides you with many implemented classes and examples of their use. CourseNana.COM

When working with a Jupyter notebook, you can edit the *.py files either in the Jupyter interface (in your browser) or with your favorite editor (e.g., PyCharm). Whenever you save a *.py file, the notebook will reload their content directly. CourseNana.COM

The libraries that you can use (and need) in this assignment are the following (run the cell below to import the libraries): CourseNana.COM

In [2]: CourseNana.COM

import sys CourseNana.COM

sys.path.insert(0, "./aipython") CourseNana.COM

import time CourseNana.COM

import numpy as np CourseNana.COM

from aipython.searchGeneric import * CourseNana.COM

from aipython.searchProblem import * CourseNana.COM

from aipython.cspProblem import * CourseNana.COM

from aipython.cspSearch import * CourseNana.COM

import copy CourseNana.COM

import math CourseNana.COM

Tip: If you placed the notebook correctly it should not give you any errors. CourseNana.COM

If you think that there are other libraries you might need then send an email to anna.trofimova@auckland.ac.nz to confirm. CourseNana.COM

Part 1 - Heuristics [5 marks] CourseNana.COM

This part of the assignment is based on a popular puzzle, Game of Fifteen, also known as 15-puzzle. The game consists of 15 numbered tiles on a four by four grid where one tile is missing. To solve the puzzle, the tiles must be moved so that they are ordered from 1 to 15. The goal state of the puzzle is defined as a multidimensional array of digits#, where 0 represents the missing tile, as follow: CourseNana.COM

goal = [[1, 2, 3, 4], CourseNana.COM

        [5, 6, 7, 8], CourseNana.COM

        [9, 10, 11, 12], CourseNana.COM

        [13, 14, 15, 0]] CourseNana.COM

Task 1.1 CourseNana.COM

Edit the code below to implement a search problem class representing the Game of Fifteen that uses heuristic based on Manhattan Distance (h1). The class must be implemented by extending the class Search_problem. CourseNana.COM

Manhattan Distance between two points p1p1 at (x1,y1)(x1,y1) and p2p2 at (x2,y2)(x2,y2) is dM(p1,p2)=|x1−x2|+|y1−y2|dM(p1,p2)=|x1−x2|+|y1−y2| CourseNana.COM

  CourseNana.COM

Tip: If you have problems understanding how to overwrite methods take a look at the implementation of Search_problem_from_explicit_graph class in searchProblem.py CourseNana.COM

class GameFifteenProblem(Search_problem): CourseNana.COM

    CourseNana.COM

    def __init__(self, start, goal): CourseNana.COM

        self.start = start CourseNana.COM

        self.goals = goal CourseNana.COM

        self.repeat = () CourseNana.COM

        self.repeatr = () CourseNana.COM

        self.repeat1 = () CourseNana.COM

        return CourseNana.COM

    CourseNana.COM

    def start_node(self): CourseNana.COM

        """Returns the start node""" CourseNana.COM

        return self.start CourseNana.COM

    CourseNana.COM

    def is_goal(self, node): CourseNana.COM

  CourseNana.COM

        """Returns True if the node is the goal, otherwise False""" CourseNana.COM

        return node == self.goals CourseNana.COM

    CourseNana.COM

    def neighbors(self, node): CourseNana.COM

        #print(node) CourseNana.COM

  CourseNana.COM

  CourseNana.COM

        """Returns a list of the arcs for the neighbors of node, for example: CourseNana.COM

        return [Arc(node, to_neighbor_node1, cost1), Arc(node, to_neighbor_node2, cost2)]""" CourseNana.COM

        if node not in self.repeat: CourseNana.COM

  CourseNana.COM

            for i in range(1,3): CourseNana.COM

                for j in range(1,3): CourseNana.COM

                    if node[i][j] == 0: CourseNana.COM

                        nei1 = copy.deepcopy(node) CourseNana.COM

                        nei1[i][j] = node[i][j-1] CourseNana.COM

                        nei1[i][j-1] = 0 CourseNana.COM

                        nei2 = copy.deepcopy(node) CourseNana.COM

                        nei2[i][j] = node[i][j+1] CourseNana.COM

                        nei2[i][j+1] = 0 CourseNana.COM

                        nei3 = copy.deepcopy(node) CourseNana.COM

                        nei3[i][j] = node[i-1][j] CourseNana.COM

                        nei3[i-1][j] = 0 CourseNana.COM

                        nei4 = copy.deepcopy(node) CourseNana.COM

                        nei4[i][j] = node[i+1][j] CourseNana.COM

                        nei4[i+1][j] = 0 CourseNana.COM

                        result = [Arc(node, nei1,1),Arc(node, nei2,1), Arc(node, nei3,1), Arc(node, nei4,1)] CourseNana.COM

                        self.repeatr+=tuple(result) CourseNana.COM

                        self.repeat+=tuple(node) CourseNana.COM

                        return result CourseNana.COM

            if node[1][0] == 0: CourseNana.COM

                nei1 = copy.deepcopy(node) CourseNana.COM

                nei1[0][0] = node[1][0] CourseNana.COM

                nei1[1][0] = 0 CourseNana.COM

                nei2 = copy.deepcopy(node) CourseNana.COM

                nei2[2][0] = node[1][0] CourseNana.COM

                nei2[1][0] = 0 CourseNana.COM

                nei3 = copy.deepcopy(node) CourseNana.COM

                nei3[1][1] = node[1][0] CourseNana.COM

                nei3[1][0] = 0 CourseNana.COM

                result = [Arc(node, nei1,1),Arc(node, nei2,1), Arc(node, nei3,1)] CourseNana.COM

                self.repeatr+=tuple(result) CourseNana.COM

                self.repeat+=tuple(node) CourseNana.COM

                return result CourseNana.COM

            elif node[2][0] == 0: CourseNana.COM

                nei1 = copy.deepcopy(node) CourseNana.COM

                nei1[1][0] = 0 CourseNana.COM

                nei1[2][0] = node[1][0] CourseNana.COM

                return result CourseNana.COM

        else: CourseNana.COM

            print("debug") CourseNana.COM

            print(self.repeat.index(node)) CourseNana.COM

            return self.repeatr[self.repeat.index(node)] CourseNana.COM

    def heuristic(self, node): CourseNana.COM

        """Returns the heuristic value of the node CourseNana.COM

        based on the Manhattan distance""" CourseNana.COM

        #print(tuple(node)) CourseNana.COM

        # if tuple(node) not in self.repeat1.keys(): CourseNana.COM

        result = 0 CourseNana.COM

        for i in range(0, len(node)): CourseNana.COM

            for j in range(0, len(node[i])): CourseNana.COM

                for x in range(0, len(goal)): CourseNana.COM

                    for y in range(0, len(goal[x])): CourseNana.COM

                        if (goal[x][y] == node[i][j]): CourseNana.COM

                            result += abs(x-i)+abs(y-j) CourseNana.COM

        #self.repeat1[tuple(node)] = result CourseNana.COM

        return result CourseNana.COM

        # else: CourseNana.COM

        #     return self.repeat1[tuple(node)] CourseNana.COM

To validate the correctness of the problem class use the A* searcher algorithm (from searchGeneric.py) to find a solution. CourseNana.COM

Tip: The cost of the solution should be 9. CourseNana.COM

start = [[1, 2, 3, 4], CourseNana.COM

         [9, 5, 6, 7], CourseNana.COM

         [10, 11, 8, 0], CourseNana.COM

         [13, 14, 15, 12]] CourseNana.COM

  CourseNana.COM

puzzle = GameFifteenProblem(start, goal) CourseNana.COM

searcher = AStarSearcher(puzzle) CourseNana.COM

solution = searcher.search() CourseNana.COM

print('Cost: ',  solution.cost) CourseNana.COM

Task 1.2 CourseNana.COM

Implement search problem classes representing the Game of Fifteen that use heuristics based on Euclidean Distance (h2) and the number of the inversions of the permutation (h3). The classes must be implemented by extending the class GameFifteenProblem. CourseNana.COM

Euclidean distance between two points p1p1 at (x1,y1)(x1,y1) and p2p2 at (x2,y2)(x2,y2) is dE(p1,p2)=(x1−x2)2+(y1−y2)2dE(p1,p2)=(x1−x2)2+(y1−y2)2 CourseNana.COM

An inversion of a permutation (t1,t2,...,tn)(t1,t2,...,tn) of the elements in a finite n-element set of positive integers A={1,2,...,n}A={1,2,...,n} is the pair (tj,tk)(tj,tk), where j<kj<k and tj>tktj>tk. CourseNana.COM

Nj=1Nk=j{tj>tk:1,otherwise:0}∑j=1N∑k=jN{tj>tk:1,otherwise:0}, where NN is the total number of elements and titi is the value of i-th element. CourseNana.COM

In [49]: CourseNana.COM

class GameFifteenProblemEuclidean(GameFifteenProblem): CourseNana.COM

    def __init__(self, start, goal): CourseNana.COM

        (super().__init__(start, goal)) CourseNana.COM

  CourseNana.COM

    def heuristic(self, node): CourseNana.COM

        """Returns the heuristic value of the node CourseNana.COM

        based on the Euclidean distance""" CourseNana.COM

        result = 0 CourseNana.COM

        for i in range(0, len(node)): CourseNana.COM

            for j in range(0, len(node[i])): CourseNana.COM

                for x in range(0, len(goal)): CourseNana.COM

                    for y in range(0, len(goal[x])): CourseNana.COM

                        if (goal[x][y] == node[i][j]): CourseNana.COM

                            result += math.sqrt((x-i)**2+(y-j)**2) CourseNana.COM

        return result CourseNana.COM

In [47]: CourseNana.COM

class GameFifteenProblemInversions(GameFifteenProblem): CourseNana.COM

    def __init__(self, start, goal): CourseNana.COM

        (super().__init__(start, goal)) CourseNana.COM

  CourseNana.COM

    def heuristic(self, node): CourseNana.COM

        """Returns the heuristic value of the node CourseNana.COM

        based on the sum of the inversion number of a permutation""" CourseNana.COM

        return CourseNana.COM

Task 1.3 CourseNana.COM

Run A* Search algorithm with every heuristic for the following three start states: CourseNana.COM

In [53]: CourseNana.COM

# optimal path cost: 14 CourseNana.COM

start14 = [[1, 2, 8, 3], CourseNana.COM

           [5, 6, 7, 4], CourseNana.COM

           [9, 15, 14, 11], CourseNana.COM

           [13, 10, 12, 0]] CourseNana.COM

  CourseNana.COM

# optimal path cost: 17 CourseNana.COM

start17 = [[1, 3, 6, 4], CourseNana.COM

           [5, 2, 8, 14], CourseNana.COM

           [9, 15, 7, 0], CourseNana.COM

           [13, 10, 12, 11]] CourseNana.COM

  CourseNana.COM

# optimal path cost: 23 CourseNana.COM

start23 = [[1, 3, 6, 4], CourseNana.COM

           [5, 8, 15, 14], CourseNana.COM

           [9, 2, 7, 0], CourseNana.COM

           [13, 10, 12, 11]] CourseNana.COM

puzzle = GameFifteenProblemEuclidean(start23, goal) CourseNana.COM

searcher = AStarSearcher(puzzle) CourseNana.COM

solution = searcher.search() CourseNana.COM

print('Cost: ',  solution.cost) CourseNana.COM

24761 paths have been expanded and 46180 paths remain in the frontier CourseNana.COM

Cost:  23 CourseNana.COM

In each case record in the tables below the heuristic values for the start states, the number of the expanded nodes, and the costs of the solutions. CourseNana.COM

Heuristic CourseNana.COM

h-value: start14 CourseNana.COM

h-value: start17 CourseNana.COM

h-value: start23 CourseNana.COM

Manhattan CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

Euclidean CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

Inversions CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

CourseNana.COM

Heuristic CourseNana.COM

expanded: start14 CourseNana.COM

expanded: start17 CourseNana.COM

expanded: start23 CourseNana.COM

Manhattan CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

Euclidean CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

Inversions CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

CourseNana.COM

Heuristic CourseNana.COM

path cost: start14 CourseNana.COM

path cost: start17 CourseNana.COM

path cost: start23 CourseNana.COM

Manhattan CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

Euclidean CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

Inversions CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

Comment on the performance of the A* search algorithm with each heuristic based on the results in the tables. Explain which heuristic is better/worse and why. CourseNana.COM

# answer CourseNana.COM

Part 2: Search algorithms [7 marks] CourseNana.COM

Tip: If you have problems understanding how to overwrite methods take a look at the implementation of AStarSearcher and Searcher classes in searchGeneric.py CourseNana.COM

Tip: To initialize the frontier think of the type of structure used by the algorithm to store generated nodes. If it uses a priority queue use FrontierPQ from serachGeneric.py CourseNana.COM

Task 2.1 CourseNana.COM

Implement a class that performs Breadth First Search by extending class Searcher. CourseNana.COM

In [ ]: CourseNana.COM

class BreadthFirstSearcher(Searcher): CourseNana.COM

    CourseNana.COM

    def __init__(self,  problem): CourseNana.COM

        super().__init__(problem) CourseNana.COM

  CourseNana.COM

    """ Initializes the forontier """ CourseNana.COM

    def initialize_frontier(self): CourseNana.COM

        return CourseNana.COM

  CourseNana.COM

    """ Returns True if there are no more nodes to expand """ CourseNana.COM

    def empty_frontier(self): CourseNana.COM

        return CourseNana.COM

  CourseNana.COM

    """ Adds the path to the forontier """ CourseNana.COM

    def add_to_frontier(self, path): CourseNana.COM

        return CourseNana.COM

    CourseNana.COM

    """returns (next) path from the problem's start node CourseNana.COM

        to a goal node. """ CourseNana.COM

    def search(self): CourseNana.COM

        return CourseNana.COM

Task 2.2 CourseNana.COM

Implement a class that performs Iterative Deepening Search by extending class Searcher. CourseNana.COM

In [ ]: CourseNana.COM

class IterativeDeepeningSearcher(Searcher): CourseNana.COM

    def __init__(self, problem): CourseNana.COM

        super().__init__(problem) CourseNana.COM

  CourseNana.COM

    """ Initializes the forontier """ CourseNana.COM

    def initialize_frontier(self): CourseNana.COM

        return CourseNana.COM

  CourseNana.COM

    """ Returns True if there are no more nodes to expand """ CourseNana.COM

    def empty_frontier(self): CourseNana.COM

        return CourseNana.COM

  CourseNana.COM

    """ Adds the path to the forontier """ CourseNana.COM

    def add_to_frontier(self, path): CourseNana.COM

        return CourseNana.COM

    CourseNana.COM

    def search(self): CourseNana.COM

        return CourseNana.COM

Task 2.3 CourseNana.COM

Implement a class that performs Iterative Deepening A* Search by extending class Searcher. CourseNana.COM

In [ ]: CourseNana.COM

class IterativeDeepeningAStarSearcher(Searcher): CourseNana.COM

    """ Initializes the forontier """ CourseNana.COM

    def initialize_frontier(self): CourseNana.COM

        return CourseNana.COM

  CourseNana.COM

    """ Returns True if there are no more nodes to expand """ CourseNana.COM

    def empty_frontier(self): CourseNana.COM

        return CourseNana.COM

  CourseNana.COM

    """ Adds the path to the forontier """ CourseNana.COM

    def add_to_frontier(self, path): CourseNana.COM

        return CourseNana.COM

    CourseNana.COM

    def search(self): CourseNana.COM

        return CourseNana.COM

Task 2.4 CourseNana.COM

Implement a class that performs Uniform Cost Search by extending class Searcher. CourseNana.COM

In [ ]: CourseNana.COM

class UniformCostSearcher(Searcher): CourseNana.COM

    """ Initializes the forontier """ CourseNana.COM

    def initialize_frontier(self): CourseNana.COM

        return CourseNana.COM

  CourseNana.COM

    """ Returns True if there are no more nodes to expand """ CourseNana.COM

    def empty_frontier(self): CourseNana.COM

        return CourseNana.COM

  CourseNana.COM

    """ Adds the path to the forontier """ CourseNana.COM

    def add_to_frontier(self, path): CourseNana.COM

        return CourseNana.COM

Task 2.5 CourseNana.COM

Run Breadth First Search (BFS), Iterative Deepenining Search (IDS), Iterative Deepening A Search (IDA\S), and Uniform Cost Search (UCS) algorithms on each of the 5 start states: CourseNana.COM

In [25]: CourseNana.COM

# optimal path cost: 10 CourseNana.COM

start10 = [[2, 3, 7, 4], CourseNana.COM

           [1, 6, 11, 8], CourseNana.COM

           [5, 10, 0, 12], CourseNana.COM

           [9, 13, 14, 15]] CourseNana.COM

  CourseNana.COM

# optimal path cost: 24 CourseNana.COM

start24 = [[2, 7, 11, 4], CourseNana.COM

           [6, 3, 12, 0], CourseNana.COM

           [1, 5, 15, 8], CourseNana.COM

           [9, 10, 13, 14]] CourseNana.COM

  CourseNana.COM

# optimal path cost: 30 CourseNana.COM

start30 = [[2, 7, 11, 4], CourseNana.COM

           [6, 3, 12, 0], CourseNana.COM

           [1, 5, 15, 14], CourseNana.COM

           [9, 10, 8, 13]] CourseNana.COM

  CourseNana.COM

# optimal path cost: 36 CourseNana.COM

start36 = [[7, 11, 12, 4], CourseNana.COM

           [2, 3, 14, 1], CourseNana.COM

           [6, 5, 13, 8], CourseNana.COM

           [9, 10, 15, 0]] CourseNana.COM

  CourseNana.COM

# optimal path cost: 41 CourseNana.COM

start41 = [[7, 11, 12, 4], CourseNana.COM

           [2, 3, 8, 14], CourseNana.COM

           [10, 0, 5, 1], CourseNana.COM

           [6, 9, 13, 15]] CourseNana.COM

  CourseNana.COM

# your code CourseNana.COM

In each case, record in the table below the number of nodes generated during the search. If the algorithm runs out of memory or the number of nodes in the frontier exceeds 1 million items, just write “Mem” in your table. If the code runs for five minutes without producing output, terminate the process and write “Time” in your table. CourseNana.COM

Tip: To edit the table double click the cell below. CourseNana.COM

Algorithm CourseNana.COM

10 CourseNana.COM

24 CourseNana.COM

30 CourseNana.COM

36 CourseNana.COM

41 CourseNana.COM

BFS CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

A* CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

IDS CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

IDA*S CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

UCS CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

# CourseNana.COM

Discuss the time and space efficiency of these four algorithms, comment on the results in the table. CourseNana.COM

# your answer CourseNana.COM

Part 3: Deceptive Starting States [3 marks] CourseNana.COM

Task 3.1 CourseNana.COM

Run IDA* on the starting states below and report the number of the expanded nodes. CourseNana.COM

In [26]: CourseNana.COM

start37_1 = [[7, 11, 12, 4], CourseNana.COM

             [2, 3, 14, 1], CourseNana.COM

             [6, 5, 13, 0], CourseNana.COM

             [9, 10, 15, 8]] CourseNana.COM

  CourseNana.COM

start37_2 = [[7, 11, 12, 4], CourseNana.COM

             [2, 3, 8, 14], CourseNana.COM

             [6, 0, 1, 15], CourseNana.COM

             [9, 5, 10, 13]] CourseNana.COM

# your code CourseNana.COM

Task 3.2 CourseNana.COM

Explain why there is a difference between the number of the expanded nodes for these starting states if their costs of the optimal paths are the same. CourseNana.COM

# your answer CourseNana.COM

Part 4: Constraint Satisfaction Problem [5 marks] CourseNana.COM

This part of the assignment is based on another puzzle called Sudoku. The game consists of 9x9 grid with a few cells filled in with digits. The objective of the game is to fill the remaining cells so that each column, each row, and each of the nine 3×3 sub-grids contain all of the digits from 1 to 9. CourseNana.COM

The start state of the puzzle is defined as a multidimensional array of numbers, where 0 represents empty cells, for example: CourseNana.COM

grid = [[9, 5, 0, 8, 2, 7, 3, 0, 0], CourseNana.COM

        [0, 8, 0, 1, 4, 0, 0, 5, 0], CourseNana.COM

        [0, 1, 0, 5, 9, 0, 0, 0, 0], CourseNana.COM

        [8, 3, 0, 0, 0, 0, 0, 7, 5], CourseNana.COM

        [1, 6, 9, 7, 5, 2, 4, 3, 0], CourseNana.COM

        [0, 7, 0, 0, 8, 0, 0, 6, 0], CourseNana.COM

        [0, 9, 1, 0, 6, 0, 8, 4, 0], CourseNana.COM

        [7, 0, 8, 0, 3, 1, 0, 0, 6], CourseNana.COM

        [6, 2, 0, 4, 7, 8, 0, 9, 0]] CourseNana.COM

Tip: If you have problems with understanding how to implement constrains take a look at cspExamples.py and cspExamplesQueens.py CourseNana.COM

Task 4.1 CourseNana.COM

Write the code that defines constraint(s) and a function grid_to_csp that returns a CSP for a Sudoku puzzle: CourseNana.COM

# define constraint function(s) CourseNana.COM

  CourseNana.COM

# function that returns a csp CourseNana.COM

def grid_to_csp(grid): CourseNana.COM

    domains = {} CourseNana.COM

    constraints = [] CourseNana.COM

    return CSP(domains, constraints) CourseNana.COM

  CourseNana.COM

# csp CourseNana.COM

csp = grid_to_csp(grid) CourseNana.COM

Task 4.2 CourseNana.COM

Write the code that solves Sudoku csp using a search algorithms of your choice, print the solution. CourseNana.COM

Task 4.3 CourseNana.COM

Descibe what do nodes represent in the search tree. Explain your choice of the search algorithm and compare it with any other search algorithm implemented in this assignment. CourseNana.COM

  CourseNana.COM

Get in Touch with Our Experts

WeChat (微信) WeChat (微信)
Whatsapp WhatsApp
Aunkland代写,COMPSCI 761代写,Advanced Topics in Artificial Intelligence代写,Python代写,Artificial Intelligence代写,Game of Fifteen代写,Euclidean Distance代写,Search algorithms代写,AStarSearcher代写,Aunkland代编,COMPSCI 761代编,Advanced Topics in Artificial Intelligence代编,Python代编,Artificial Intelligence代编,Game of Fifteen代编,Euclidean Distance代编,Search algorithms代编,AStarSearcher代编,Aunkland代考,COMPSCI 761代考,Advanced Topics in Artificial Intelligence代考,Python代考,Artificial Intelligence代考,Game of Fifteen代考,Euclidean Distance代考,Search algorithms代考,AStarSearcher代考,Aunklandhelp,COMPSCI 761help,Advanced Topics in Artificial Intelligencehelp,Pythonhelp,Artificial Intelligencehelp,Game of Fifteenhelp,Euclidean Distancehelp,Search algorithmshelp,AStarSearcherhelp,Aunkland作业代写,COMPSCI 761作业代写,Advanced Topics in Artificial Intelligence作业代写,Python作业代写,Artificial Intelligence作业代写,Game of Fifteen作业代写,Euclidean Distance作业代写,Search algorithms作业代写,AStarSearcher作业代写,Aunkland编程代写,COMPSCI 761编程代写,Advanced Topics in Artificial Intelligence编程代写,Python编程代写,Artificial Intelligence编程代写,Game of Fifteen编程代写,Euclidean Distance编程代写,Search algorithms编程代写,AStarSearcher编程代写,Aunklandprogramming help,COMPSCI 761programming help,Advanced Topics in Artificial Intelligenceprogramming help,Pythonprogramming help,Artificial Intelligenceprogramming help,Game of Fifteenprogramming help,Euclidean Distanceprogramming help,Search algorithmsprogramming help,AStarSearcherprogramming help,Aunklandassignment help,COMPSCI 761assignment help,Advanced Topics in Artificial Intelligenceassignment help,Pythonassignment help,Artificial Intelligenceassignment help,Game of Fifteenassignment help,Euclidean Distanceassignment help,Search algorithmsassignment help,AStarSearcherassignment help,Aunklandsolution,COMPSCI 761solution,Advanced Topics in Artificial Intelligencesolution,Pythonsolution,Artificial Intelligencesolution,Game of Fifteensolution,Euclidean Distancesolution,Search algorithmssolution,AStarSearchersolution,