我正在为一位教师的家庭成员编写应用程序.她要求一个应用程序,允许她进入一群孩子,设定他们的惯用手,设置他们不能坐在旁边的人,指定每个工作台有多少个座位,然后为孩子们生成一个随机的布局,这样就没有了 – 汉德斯坐在右手边的右边,不应该坐在一起的孩子们不会坐在长凳上.

这与通用表座位算法的问题并不完全相同,因为一个工作台有2个端点,并且因为节点没有“值”来创建任何优先分组.

我决定创建一个有向图,其中边表示谁可以坐在给定孩子的右边.然后我从每个节点做一个递归DFS而不触摸节点两次,直到我得到一个触摸每个节点的路径.一个问题是,在每个工作台的“尽头”,任何人都可以坐到他们的“右边”.

这个算法似乎总是有效,这很好.但是,一旦我超过10个孩子在一个长凳上,假设长椅可以说20个孩子,那么运行时似乎会变得非常糟糕.我做错了什么,还是有更好的方法来解决这个问题? Java代码如下.

编辑:对不起,我没有说清楚,但我希望每次都能实现RANDOM座位安排,这样孩子们就不会被困在同一个地方或同一个长凳上或者在同一个孩子旁边.此外,我的应用程序运行此算法:

目前我正在强制执行1,000,000个节点触摸的上限,这样我的服务器就不会受到冲击.您可以看到算法似乎正确缩放,直到您将每个工作台的座位设置为9左右,此时它立即变得难以处理.

private static class Person {

private String m_name = null;

private Handedness m_handedness = null;

private Set m_nonadjacents = null;

}

private static class Node {

private Person m_person = null;

private List m_possibleRightNodes = null;

private boolean m_isInPath = false;

}

private Stack generateSeatingArrangement() {

// Generate randomized directed graph, start with all nodes as root nodes

for(Person leftPerson: people.values()) {

Node node = new Node(leftPerson);

nodes.put(leftPerson, node);

}

// Create all edges based on constraints

for(Node leftNode: nodes.values()) {

List possibleRightNodes = new LinkedList<>();

for(Node rightNode: nodes.values()) {

Person leftPerson = leftNode.getPerson();

Person rightPerson = rightNode.getPerson();

if(leftNode==rightNode) {

log.fine("Can't seat '" + leftPerson.getName() + "' next to himself");

continue;

}

if(leftPerson.getHandedness()==Person.Handedness.RIGHT_HANDED &&

rightPerson.getHandedness()==Person.Handedness.LEFT_HANDED) {

log.fine("Can't seat right-handed '" + leftPerson.getName()

+ "' to the left of left-handed '" + rightPerson.getName() + "'");

continue;

}

if(leftPerson.getNonadjacents().contains(rightPerson)) {

log.fine("Can't seat '" + leftPerson.getName() + "' next to '" + rightPerson.getName() + "'");

continue;

}

if(rightPerson.getNonadjacents().contains(leftPerson)) {

// TODO: This should be redundant but not enforcing right now...

log.fine("Can't seat '" + rightPerson.getName() + "' next to '" + leftPerson.getName() + "'");

continue;

}

log.fine("Can seat '" + leftPerson.getName() + "' to the left of '" + rightPerson.getName() + "'");

possibleRightNodes.add(rightNode);

}

Collections.shuffle(possibleRightNodes);

leftNode.setPossibleRightNodes(possibleRightNodes);

}

List nodes2 = new LinkedList<>(nodes.values());

Collections.shuffle(nodes2);

// Perform recursive graph traversal

Stack pathStack = new Stack<>();

for(Node node: nodes2) {

TraversalStatistics stats = new TraversalStatistics();

boolean isPathFound = depthFirstSearchRecur(numSeatsPerBench, nodes2, pathStack, node, stats);

if(isPathFound) {

break;

}

pathStack.clear();

}

}

// The resursive DFS method

private boolean depthFirstSearchRecur(int numSeatsPerBench,

List allNodes,

Stack pathStack,

Node node,

TraversalStatistics stats) {

stats.numNodesTouched++;

if(node.isInPath()) {

stats.numLeavesReached++;

return false;

}

pathStack.push(node);

node.setIsInPath(true);

if(pathStack.size() >= allNodes.size()) {

return true; // We win!

}

if(pathStack.size() % numSeatsPerBench == 0) {

// "End" of a bench, anyone can "sit to the right of" me

for(Node node2: allNodes) {

if(node == node2) {

// Can't sit next to myself

continue;

}

if(depthFirstSearchRecur(numSeatsPerBench, allNodes, pathStack, node2, stats)) {

return true;

}

}

} else {

for(Node node2: node.getPossibleRightNodes()) {

if(depthFirstSearchRecur(numSeatsPerBench, allNodes, pathStack, node2, stats)) {

return true;

}

}

}

pathStack.pop();

node.setIsInPath(false);

return false;

}

java随机安排座位表程序_java – 为长凳生成随机座位表的最有效算法?相关推荐

  1. 用Java实现在【520,1314】之间生成随机整数的故事

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 在未来城市工作的的程序员小木,做了一个梦,梦到自己在塔鲁姆的街道上看到一个姑娘,这个姑娘从远处走向他,脸上带着微笑.让小木 ...

  2. java ee的小程序_Java EE调度程序

    java ee的小程序 Java EE应用程序服务器具有本机调度支持,并且在大多数应用程序中,不需要包括外部依赖项,例如著名的Quartz调度程序库. Java EE 6和7完整配置文件上提供的Jav ...

  3. java ee的小程序_Java EE应用程序的单片到微服务重构

    java ee的小程序 您是否曾经想过将现有的Java EE单体应用程序重构为基于微服务的应用程序需要做什么? 该博客说明了一个简单的购物车示例如何转换为基于微服务的应用程序,以及围绕它的一些担忧. ...

  4. java ee的小程序_Java EE 8 –为更多设备提供更多应用程序

    java ee的小程序 如果我不喜欢夏天的一件事,那就是事实是没有太多要分享或谈论的新闻. 谁决定将Java Day Tokyo置于今年的这个无聊的时间里,做得很好,并给了我一个写关于新的和即将到来的 ...

  5. java类和对象程序_Java类与对象程序设计基础

    Java类与对象程序设计基础 一.实验目的: 通过编制一个独立应用程序,使得学生掌握Java的系统所提供类的引用方法:通过编制一个完整的应用程序,使得学生对Java的应用程序的基本构成和基本算法熟练掌 ...

  6. java求梯形面积程序_Java初级应用,计算关于梯形跟圆形的面积。该程序中有3个类:Lader、Circle和主类Test。...

    编写一个Java应用程序,该程序中有3个类:Lader.Circle和主类Test.具体要求如下:Lader类具有类型为double的上底.下底.高.面积属性,具有返回面积的功能,包括斜体样式一个构造 ...

  7. java中抽牌程序_Java—— 随机抽取扑克牌游戏

    /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作    者:李晓凯 * 完成日期:2015年 ...

  8. java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些java方面的技术应用. 今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆. ...

  9. 用java写秋道程序_Java开发者使用C++写程序踩的坑

    笔者是一个很矛盾的人.平时用Java.但是一开始学习的时候学的是汇编语言,而且对C语言也很熟悉.为什么不学C++呢?是因为我可以完全用Java的编码规范去写C++.因此我不需要了解更多的诸如C++的命 ...

最新文章

  1. Linux cmake使用入门
  2. jenkins+git+maven搭建项目自动化持续集成
  3. Android Studio——[The ‘kotlin-android-extensions‘ Gradle plugin is deprecated.]解决方案
  4. 反三角函数怎么表示_交流电的功率因数怎么算(里面有例子)
  5. Java 接口和抽象类的区别
  6. access 如何使用dolby_Access/VBA/Excel-Access表及字段创建-03
  7. BBlean最初级的入门幽默教程
  8. python 新式类和旧式类_python新式类和旧式类区别
  9. 7号团队-团队任务5:项目总结
  10. Windows 11正式发布!网友的这波吐槽,太搞笑了。。。
  11. MAC环境配置SDK
  12. 在Java中使用Jedis的测试案例
  13. 面试字节跳动,我被怼了....
  14. 电脑管家下载|腾讯电脑管家下载
  15. 成长 工作 游戏 英语 阅读
  16. php怎么将农历转换成公历,PHP实现阳历到农历转换的类实例
  17. Red Giant Universe中文版
  18. 《21天学通HTML+CSS+JavaScript Web开发(第7版)》——2.4 您要在Web上做什么
  19. python爬虫实战-如何批量爬取唯品会商品信息>>>
  20. [HDF5] 封装了一个简单的C++ HDF5工具库,实现常用数据类型的读写

热门文章

  1. linux下的vconfig配置_Linux系统下安装配置-OpenLDAP-phpLDAPadmin
  2. C语言读取raw格式图像,求指导,如何用c语言实现读取*.raw格式图像
  3. android开发卡死代码,Android Studio编译卡死(示例代码)
  4. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第四天(非原创)
  5. luoguP2701 [USACO5.3]巨大的牛棚Big Barn(极大子矩阵)
  6. Referenced file contains errors (http://JAVA.sun.com/xml/ns/j2ee/web-app_2_5.xsd).
  7. SQL Serverf 索引 - 索引压缩 、附加特性 第十篇
  8. Java Math Expression Engine
  9. hdu3535 (分组背包,最少选一 + 最多选一 + 随意)
  10. Verdi(debussy)中查看memory