小编use*_*040的帖子

改进我的扫雷解决算法

我用Python实现了一个解决游戏"扫雷"的算法.该计划的工作原理如下:

假设求解器单击名为"a"的正方形.为了举例,让这样揭示的数字等于2.尚未被点击的正方形的邻居(再次作为示例)被命名为"b"和"c".程序然后将正方形与表达式[2,{'b','c'}]相关联,并从所有其他表达式中删除'a'.在两种情况下,通过成对简化这些表达式来推断哪些正方形是地雷并且不进行收益.

然后,对于某些表达式X,如果X[0] == 0,我们可以自由地点击命名的所有正方形X[1],如果X[0] == len(X[1]),那么我们可以标记它们.

但是,我正在努力确定哪些表达式试图简化.我目前的做法是保持一堆正方形; 无论何时单击一个正方形,或者已成功简化其表达式,都会将其添加到堆栈中(如果它尚未存在).当方从堆栈中弹出,简化尝试其表达(之间X),以及任何其他表达式Y,使得X[1] & Y[1] != set().当堆栈耗尽时,算法终止.然而,目前虽然这很有效,但它无法正确解决所有明确的配置,如果我用队列替换堆栈,或者使用某种算法确定要弹出哪个方块,它在给定板上的执行情况会有显着变化!

对于我的方法的先例或潜在探索的途径,我将非常感激.

python artificial-intelligence minesweeper

13
推荐指数
2
解决办法
2793
查看次数

在伊德里斯挣扎着改写策略

我正在阅读Terry Tao的真实分析教科书,它从自然数字中建立起基础数学.通过尽可能多地形式化证明,我希望能够熟悉Idris和依赖类型.

我已经定义了以下数据类型:

data GE: Nat -> Nat -> Type where
    Ge : (n: Nat) -> (m: Nat) -> GE n (n + m)
Run Code Online (Sandbox Code Playgroud)

表示一个自然数大于或等于另一个自然数的命题.

我目前正在努力证明这种关系的反身性,即用签名来构建证明

geRefl : GE n n
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试就是尝试geRefl {n} = Ge n Z,但这种类型Ge n (add n Z).为了使这与所需的签名统一起来,我们显然必须进行某种重写,可能涉及引理

plusZeroRightNeutral : (left : Nat) -> left + fromInteger 0 = left
Run Code Online (Sandbox Code Playgroud)

我最好的尝试如下:

geRefl : GE n n                                                                 
geRefl {n} = x                                                                  
    where x : GE n (n + Z)                                                      
          x = rewrite plusZeroRightNeutral n …
Run Code Online (Sandbox Code Playgroud)

theorem-proving dependent-type idris

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

Rust借用指针和生命周期

在我的代码中,我有一个相互递归的树结构,如下所示:

enum Child<'r> {
    A(&'r Node<'r>),
    B, 
    C
}

struct Node<'r> {
    children : [&'r Child<'r>,..25]
}

impl <'r>Node<'r> {
    fn new() -> Node {
        Node {
            children : [&B,..25]
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不按原样编译.修改它的最佳方法是什么?

rust

5
推荐指数
1
解决办法
1214
查看次数

查找满足特定约束的子集

我有一组变量S,并在S上定义了一个布尔函数f,如下所示:

˚F(X 1,X 2,... X Ñ)= TRUE当且仅当˚F(X ,X Ĵ)= TRUE∀1≤I≤ Ñ ∀1≤Ĵ≤ Ñ,Ñ > 1,否则为False.

f(a,b)是已知的,f(a,a)是S中的真∀a,b .

我很感激在设计快速算法方面提供了一些帮助,该算法可以返回S的所有子集,其中f返回True.

例如,令S = [a,b,c]和f(a,b)= f(b,c)= f(a,c)= True.然后该算法应返回[[a,b],[a,c],[b,c],[a,b,c]].

我想到了四种改进强力搜索的策略:

1)f的参数顺序无关紧要.

2)使用f(a,a)为真且f(x i,x j)= f(x j,x i)的事实,因此只有i <j需要检查.

2)使用f(x 1,x 2 …

python boolean subset discrete-mathematics

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