Fra*_* R. 8 c# sql oracle select permutation
这个挑战是社交高尔夫球手问题场景.我有一个有320人的公司.我最近实施了一个按目标管理(MBO)计划,其中每个工作人员都被分配了每月完成的目标.其中一个反复出现的目标是按时到达工作,每天早上参加30分钟的咖啡和dounut会议.会议在我们的餐厅举行,共有50张桌子.每张桌子最多可容纳8人.每个工作日正负80个座位是空的,因为目前最大容量为400个.我想生成一个循环座位安排,以便每个人可以轮流与其他人会面和协作.
(编辑)规则:每个工作日需要8人独特.一个人不能与他们过去坐过的其他人再次坐下,直到所有可能的排列都用完为止.
编辑:所需结果的一个例子是:
Day 1:
Table 1 will seat worker numbers 1,2,3,4,5,6,7,8.
Table 2 will seat worker numbers 9.10,11,12,13,14,15,16
...
Table 50 will seat worker numbers 313,314,315,316,317,318,319,320
**NOTE:**
(So, the next workday and thereafter, workers 1 through 8 cannot ever be seated with
any other workers from that same set until all possible permutations have been
exhausted).
Day 2:
Table 1 will seat worker numbers 1,17,18,19,20,21,22,23
Table 2 will seat worker numbers 2,10,24,25,26,27,28,29
...
Table 50 will seat worker numbers 305,306,307,308,309,310,311,312
Day N:
.
.
...
.
Run Code Online (Sandbox Code Playgroud)
在所有可能的唯一集合(排列)都已用完之前,所有工作者编号(元素)都不能在8个工作程序的每个集合(数组)中重复.然后循环重新开始,也许是移动元素,只有这样,一个工人才能和他们以前见过的另一个工人坐在一起.然后,我想通过电子邮件向每个工作人员发送电子邮件,告知他们在下一个工作日分配了哪些表格.每个工人在到达桌子前都不知道还有谁在他们指定的桌子上坐着.只有我会有完整的座位安排名单.(这是一种"音乐椅"游戏)
这不是一项例外或学校作业.使用APL编程语言的朋友告诉我,她可以使用一行代码生成所需的结果,但我们只使用基于SQL的DBMS(IBM Informix 11.70和Oracle 11).
所以我有一个包含以下列的SQL表:
employee.id INT {unique primary key}
employee.FullName VARCHAR
...
Run Code Online (Sandbox Code Playgroud)
以下一行APL编程代码生成矩阵排列:
pmat2?{{,[?2]?(???io,1+?)?¨?¨??.=??1+1???}?????}
Run Code Online (Sandbox Code Playgroud)
在SQL中,我可以使用一个SELECT语句生成所需的结果,是否需要多个SELECT INTO TEMP语句,或者是获取所需结果所需的存储过程?
我的SELECT语句或SP应该是什么样的?
编辑:如果SQL无法实现所需的结果,是否可以使用像c#这样的3GL来完成?
这就是所谓的“社交高尔夫球手问题”,尽管它是通过APL解决的,而不是通过一条线解决的。这实际上是一个非常困难的问题,所以我很难想象它可以通过数据库查询来完成。网上有很多关于该主题的文献和一些在线计算器。
\n\n编辑:
\n\n您的 APL 代码只是创建一个排列矩阵。例如,如果您输入以下内容:
\n\npmat2\xe2\x86\x90{{,[\xe2\x8d\xb32]\xe2\x86\x91(\xe2\x8a\x82\xe2\x8a\x82\xe2\x8e\x95io,1+\xe2\x8d\xb5)\xe2\x8c\xb7\xc2\xa8\xe2\x8d\x92\xc2\xa8\xe2\x86\x93\xe2\x88\x98.=\xe2\x8d\xa8\xe2\x8d\xb31+1\xe2\x86\x93\xe2\x8d\xb4\xe2\x8d\xb5}\xe2\x8d\xa3\xe2\x8d\xb5\xe2\x8d\x89\xe2\x8d\xaa\xe2\x8d\xac}\npmat2 3\nRun Code Online (Sandbox Code Playgroud)\n\n你得到以下矩阵:
\n\n1 2 3\n1 3 2\n2 1 3\n2 3 1\n3 1 2\n3 2 1\nRun Code Online (Sandbox Code Playgroud)\n\n根据维基百科:
\n\n循环赛(或全场比赛)是“每位参赛者依次与所有其他参赛者相遇”的比赛。
\n\n根据马库斯·特里斯卡 (Markus Triska) 在他关于该主题的硕士论文中的说法:
\n\n社交高尔夫球手问题(SGP)是一个组合优化问题。任务是将 g \xc3\x97 p 个高尔夫球手安排在 g 个由 p 个球员组成的组中,为期 w 周,使得没有两个高尔夫球手在同一组中打球超过一次。
\n\n从数学上来说,有很大的区别。循环赛为两人一组,因此如果有 9 名参赛者,则需要 8 轮 36 场比赛。对于社交高尔夫球手,你可以将他们三人一组,这需要 4 轮 12 场比赛:
\n\n6 4 8 1 8 3 1 9 6 9 5 8\n3 9 7 4 2 9 4 3 5 4 7 1\n5 1 2 5 7 6 8 7 2 6 3 2\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1453 次 |
| 最近记录: |