eight-queen problem les veges probability algorithm

本文介绍了一种结合随机放置与回溯法解决八皇后问题的算法,并通过实验对比了不同随机放置数量对运行时间和成功率的影响。
package csm.work;

import java.util.Random;

public class Question_9 {
    /*
     * 题目:Ex. 对8皇后问题,写一算法,求n=12~20时最优的StepVegas值(lasvegas Algorithm)。
     * 思路:求解规模为15的八皇后问题,随机放置k个八皇后,对余下的20-k个皇后用回溯法放置,找出一个解则结束 结果如下:
     *
            规模为15,随机放置0个,平均运行时间为:3506690ns
            找到解的成功率为1.0,随机算法的超时率为0.0
            
            规模为15,随机放置1个,平均运行时间为:2808510ns
            找到解的成功率为1.0,随机算法的超时率为0.0
            
            规模为15,随机放置2个,平均运行时间为:1695070ns
            找到解的成功率为1.0,随机算法的超时率为0.0
            
            规模为15,随机放置3个,平均运行时间为:1229860ns
            找到解的成功率为1.0,随机算法的超时率为0.0
            
            规模为15,随机放置4个,平均运行时间为:978460ns
            找到解的成功率为1.0,随机算法的超时率为0.0
            
            规模为15,随机放置5个,平均运行时间为:708120ns
            找到解的成功率为0.988,随机算法的超时率为0.0
            
            规模为15,随机放置6个,平均运行时间为:464840ns
            找到解的成功率为0.755,随机算法的超时率为0.0
            
            规模为15,随机放置7个,平均运行时间为:201980ns
            找到解的成功率为0.356,随机算法的超时率为0.0
            
            规模为15,随机放置8个,平均运行时间为:82830ns
            找到解的成功率为0.105,随机算法的超时率为0.0
            
            规模为15,随机放置9个,平均运行时间为:46240ns
            找到解的成功率为0.039,随机算法的超时率为0.0
            
            规模为15,随机放置10个,平均运行时间为:40850ns
            找到解的成功率为0.025,随机算法的超时率为0.0
            
            规模为15,随机放置11个,平均运行时间为:50650ns
            找到解的成功率为0.011,随机算法的超时率为0.01
            
            规模为15,随机放置12个,平均运行时间为:156030ns
            找到解的成功率为0.0060,随机算法的超时率为0.19
            
            规模为15,随机放置13个,平均运行时间为:1221120ns
            找到解的成功率为0.0040,随机算法的超时率为2.85
            
            规模为15,随机放置14个,平均运行时间为:3344020ns
            找到解的成功率为0.0030,随机算法的超时率为8.09
            
            从数据可以看出,放置5-6个时性能较优
     */
    public static Random r = new Random();
    public static int size = 15;
    // 放置20个皇后的坐标
    public int x[] = new int[size];
    public int y[] = new int[size];
    public int num = 0;
    public int k;

    // 检测两皇后是否符合规则
    static boolean check(int x1, int y1, int x2, int y2) {
        if (x1 != x2 && y1 != y2 && (x1 + y1) != (x2 + y2)
                && (x1 - y1) != (x2 - y2))
            return true;
        return false;
    }

    // 判断某点是否可放
    boolean isValid(int x1, int y1) {
        for (int i = 0; i < num; i++) {
            if (!check(x1, y1, x[i], y[i])) {
                return false;
            }
        }
        return true;
    }

    public boolean stepVegas(int k1) {
        k = k1;
        int limit = 10000;
        while (k1 != 0 && limit != 0) {
            int x1 = r.nextInt(size);
            int y1 = r.nextInt(size);

            /*
             * x1 = 0; y1 = 2; if(k1==1) { x1 = 3; y1 = 0; }
             */

            if (isValid(x1, y1)) {
                // System.out.println(x1+","+y1);
                x[num] = x1;
                y[num] = y1;
                num++;
                k1--;
            }

            limit--;
        }
        if (limit == 0)
            return false;
        return true;
    }

    // 回溯
    public boolean backTrace() {
        int validx[] = new int[size - k];
        int validy[] = new int[size - k];
        int flag[] = new int[size];
        for (int i = 0; i < k; i++) {
            flag[x[i]] = 1;
        }
        int index = 0;
        for (int i = 0; i < size; i++) {
            if (flag[i] == 0) {
                validx[index] = i;
                validy[index] = -1;
                index++;
            }
        }
        // show();
        for (int i = 0; i < index; i++) {
            int j;
            for (j = validy[i] + 1; j < size; j++) {
                if (isValid(validx[i], j)) {
                    x[num] = validx[i];
                    y[num] = j;
                    num++;
                    if (num == size)
                        return true;
                    validy[i] = j;
                    for (int m = i + 1; m < size - k; m++) {
                        validy[m] = -1;
                    }
                    // show();
                    break;
                }
            }
            if (j == size) {
                if (num == k)
                    return false;
                num--;
                i -= 2;
                // show();
            }
        }
        return false;
    }

    public void show() {
        System.out.println("****************************");
        int flag[][] = new int[size][size];
        for (int i = 0; i < num; i++) {
            flag[x[i]][y[i]] = 1;
        }
        for (int i = 0; i < size; i++) {

            for (int j = 0; j < size; j++) {
                System.out.print(flag[i][j]);
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        // 规模为15,随机放置3、6、9个八皇后的性能比较,每个运行100次。
        long begin, end;
        int success, failed, timeout;
        int testCount = 1000;

        for (int j = 0; j < Question_9.size; j++) {
            success = 0;
            failed = 0;
            timeout = 0;
            begin = System.nanoTime();
            for (int i = 0; i < testCount; i++) {
                Question_9 q9 = new Question_9();
                if (q9.stepVegas(j)) {
                    if (q9.backTrace()) {
                        success++;
                    } else {
                        failed++;
                    }
                } else {
                    timeout++;
                }
            }
            end = System.nanoTime();
            System.out.println("规模为15,随机放置"+j+"个,平均运行时间为:" + (end - begin) / 100
                    + "ns");
            System.out.println("找到解的成功率为" + (success / (testCount * 1.0))
                    + ",随机算法的超时率为" + (timeout / 100.0));
            System.out.println();

        }
    }

}


下载前可以先看下教程 https://pan.quark.cn/s/a4b39357ea24 SSM框架,涵盖了Spring MVC、Spring以及MyBatis这三个框架,在Java领域内作为构建Web应用程序的常用架构而备受青睐,特别是在电子商务购物平台的设计与实现过程中展现出极高的应用价值。 这三个框架各自承担着特定的功能角色,通过协同运作来达成高效且灵活的业务处理目标。 Spring MVC作为Spring体系结构中的一个关键部分,主要致力于处理HTTP请求与响应,并推行模型-视图-控制器(MVC)的设计模式。 其运作机制中,DispatcherServlet扮演着前端控制器的角色,负责接收HTTP请求,并将其依据请求映射至相应的Controller处理方法。 在Controller执行完业务逻辑后,会将处理结果传递给ModelAndView对象,随后由ViewResolver将其解析为具体视图进行呈现。 Spring MVC还具备数据绑定、验证以及国际化等附加功能,这些特性显著提升了开发工作的效率以及代码的可维护程度。 Spring框架则是一个综合性的企业级应用开发框架,其核心能力包含依赖注入(DI)、面向切面编程(AOP)以及事务管理等关键特性。 DI机制使得开发者能够借助配置文件或注解手段来管理对象的生成与依赖关联,从而有效降低组件之间的耦合性。 AOP技术则适用于实现诸如日志记录、权限管理这类跨领域的功能需求,有助于使代码结构更为清晰。 Spring在事务管理方面提供了编程式和声明式两种处理途径,确保了数据操作过程遵循原子性与一致性原则。 MyBatis则是一个轻量级的数据库访问层框架,其特点在于将SQL语句与Java代码进行分离,并支持动态SQL的编写。 开发者可以在XM...
### Python SQLite3 中 `c.execute` 和 `c.fetchone()` 的功能及用法 #### 1. `c.execute` 方法的功能与用法 `c.execute` 是游标对象 (`Cursor`) 的一个重要方法,用于执行SQL语句。它可以用来创建表、插入数据、更新数据以及运行查询等操作。 - **创建表** 下面的例子演示了如何使用 `execute` 来创建一个新的表格: ```python cur.execute('CREATE TABLE IF NOT EXISTS foo (o_id INTEGER PRIMARY KEY, fruit TEXT, veges TEXT)') ``` - **插入数据** 插入数据到已存在的表中也是通过 `execute` 完成的。例如向表 `foo` 添加一行记录: ```python cur.execute('INSERT INTO foo (fruit, veges) VALUES (?, ?)', ("apple", "broccoli")) ``` 这里使用了参数化查询的方式防止SQL注入攻击[^1]。 - **查询数据** 查询数据库中的信息同样依赖于 `execute` 函数。例如从表 `foo` 查找所有的条目: ```python cur.execute('SELECT * FROM foo') ``` #### 2. `c.fetchone()` 方法及其返回值解释 当执行了一个 SELECT 或其它 DQL(Data Query Language) 类型的操作之后,可以调用 `fetchone()` 方法来获取结果集中的下一行作为元组(tuple),如果没有更多的行,则返回 None。 - **基本用法** 继续上面提到的选择所有记录的例子,在此之后我们可以这样读取第一条记录: ```python first_row = cur.fetchone() print(first_row) # 输出可能是类似于这样的东西 ('苹果', '西兰花') ,具体取决于之前插入的数据。 ``` - **多次调用行为** 每次调用 `fetchone()` 都会前进至下一个结果行;因此连续两次调用将分别给出第二和第三条记录等等直到耗尽为止[^2]: ```python second_row = cur.fetchone() third_row = cur.fetchone() ``` - **注意事项** 如果尝试在一个未被执行过任何DQL命令之前的游标上调用 `fetchone()` , 将不会得到有意义的结果,并且通常情况下也不会抛出异常。另外需要注意的是每次新的 execute 调用都会重置前一次的结果集合位置指针回到起始状态[^3]. #### 示例综合代码展示 以下是结合以上知识点的一个完整的例子程序: ```python import sqlite3 # 创建连接并初始化环境 conn = sqlite3.connect(':memory:') # 使用内存数据库方便测试 cur = conn.cursor() # 构建基础结构 cur.execute('''CREATE TABLE stocks (date text, trans text, symbol text, qty real, price real)''') # 插入几笔交易模拟数据 purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00)] cur.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases) # 提交更改保存到磁盘上的持久性存储器当中去 conn.commit() # 开始检索过程 for i in range(len(purchases)): row = cur.fetchone() # 获取每一条单独的记录 if row is not None: date, trans, symbl, quantity, cost = row print(f"On {date} we did a '{trans}' operation on stock '{symbl}', buying/selling {quantity} shares at ${cost:.2f}.") # 结束清理工作 cur.close() conn.close() ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值