小编ozs*_*ent的帖子

A*在AI游戏中找不到路径

我想问一个作业问题.我知道有些人对这类问题的答案犹豫不决,但请相信我,我花了很多时间完成这项工作,并尽我所能.如果可以,请帮忙.

问题是网格格式的流氓式AI游戏,其中一个测试用例是如下地图:

~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~
~~   g**   d *~~
~~   ** *   * ~~
~~   **  ***  ~~
~~   **  d    ~~
~~   **    <  ~~
~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

g =金,d =炸药,〜=水,*=墙,<是我们的代理人,朝左.

规则是代理人不能进入水中,也不能进入隔离墙.它只能移动到空方格或广场上以拾取炸药.然后它可以用炸药炸开墙壁.一旦使用炸药,就不能再使用它.最终目标是找到黄金并捡起它.代理只能上下或左右移动.没有对角线移动.

由于文本格式化,在对角线方向的墙壁之间可能会出现一些额外的空格,但没有任何空格.

到目前为止,我已经使用Depth First Search来探索地图.(这个示例地图非常小,有一些很大).我还使用A*搜索计划路径,曼哈顿距离作为启发式.

这张地图有点棘手的是,A*搜索无法找到通往目标的路径,唯一的解决方案是首先拿起代理附近的炸药,然后将第二堵墙炸到金的右边,然后向右走,拿起第二个炸药,然后回去炸掉金矿右边的最后一道墙,然后拿出金币.

我遇到了以下问题:

  1. 如果找到一个,*搜索只会给我一条通往目标的路径.它没有给出"几乎在那里"的路径.
  2. 我可以使用A*搜索黄金或炸药的路径,但不能同时搜索两者.看来,在这种情况下,我需要在一个例程中搜索获得炸药的最佳路径,然后是黄金.这听起来太难了.请告诉我,如果这是错误的方向.

如果有人有任何建议或好建议,请赐教.我已经睡了两天了......

谢谢阅读.

[编辑30/05]好吧,我设法使用一个技巧来解决上面的地图.基本上从黄金向后搜索,并假设第一层邻近墙壁是否清晰,看看代理商是否可以移动到那里,也可以从那里拿起任何炸药.如果两者都是,那么这是一条通路.

但是,看下面的地图,我无言以对.....有人能帮忙吗?

一个.

~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~
~g***       *** ~~
~***         d**~~
~**           *d~~
~*      ^      *~~
~**           **~~
~d**         **d~~
~ d**       **d ~~
~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

B.

~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~
~~                  ~~
~~     ^            ~~
~~    ***           ~~
~~ …
Run Code Online (Sandbox Code Playgroud)

artificial-intelligence a-star

7
推荐指数
1
解决办法
177
查看次数

单元测试Web Api 2模拟用户

我试图在我的Api控制器测试中模拟User.Identity.

这是我的api方法:

    [Route(Urls.CustInfo.GetCustomerManagers)]
    public HttpResponseMessage GetCustomerManagers([FromUri]int groupId = -1)
    {
        var user = User.Identity.Name;
        if (IsStaff(user) && groupId == -1)
        {
            return ErrorMissingQueryStringParameter;
        }
        ...
    }
Run Code Online (Sandbox Code Playgroud)

我按照这篇文章中的建议:在单元测试中设置ApiController的User属性来设置User属性.

这是我的测试:

    [TestMethod]
    public void User_Without_Group_Level_Access_Call_GetCustomerManagers_Should_Fail()
    {
        Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("Bob", "Passport"), new[] {"managers"}); 
        var response = m_controller.GetCustomerManagers();

        Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
    }
Run Code Online (Sandbox Code Playgroud)

但是在运行测试时,User属性始终为null.

我甚至尝试在调用User.Identity之前移动用于将CurrentPrincipal设置为api方法的行,但它仍然为null.

我究竟做错了什么?如果这种方法不适用于web api 2,那么模拟/模拟User属性的最佳方法是什么?

谢谢!

unit-testing mocking asp.net-web-api asp.net-web-api2

7
推荐指数
1
解决办法
4963
查看次数

Alpha beta搜索时间复杂度

我理解minimax和alpha-beta修剪的基础知识.在所有文献中,他们谈论最佳情况的时间复杂度是O(b ^(d/2)),其中b =分支因子,d =树的深度,基本情况是所有首选节点都是首先扩大.

在我的"最佳案例"的例子中,我有一个4级的二叉树,所以在16个终端节点中,我需要扩展最多7个节点.这与O(b ^(d/2))有何关系?

我不明白他们是怎么来到O(b ^(d/2)).

拜托,有人可以向我解释一下吗?吃了很多!

artificial-intelligence time-complexity alpha-beta-pruning

6
推荐指数
1
解决办法
8668
查看次数