如果您能提供原始问题陈述,我将能够为您提供更好的解决方案。这是我目前的答案。
遗传算法不是满足硬约束的最佳工具。这是一个可以使用整数规划(线性规划的特例)解决的分配问题。
线性程序允许用户最小化或最大化由目标函数(分级函数)建模的某些目标。目标函数由单个决策(或决策变量)的总和以及对目标函数的价值或贡献来定义。线性程序允许您的决策变量为十进制值,但整数程序强制决策变量为整数值。
那么,你的决定是什么?您的决定是将学生分配到插槽。这些插槽具有活动需要和房间满足的功能。
在您的情况下,您希望最大化分配到某个位置的学生数量。
你也有限制。在您的情况下,一名学生最多只能参加一个活动。
下面的网站提供了一个关于如何为整数程序建模的很好的教程。
http://people.brunel.ac.uk/~mastjjb/jeb/or/moreip.html
对于 java 特定的实现,请使用下面的链接。
http://javailp.sourceforge.net/
SolverFactory factory = new SolverFactoryLpSolve(); // use lp_solve
factory.setParameter(Solver.VERBOSE, 0);
factory.setParameter(Solver.TIMEOUT, 100); // set timeout to 100 seconds
/**
* Constructing a Problem:
* Maximize: 143x+60y
* Subject to:
* 120x+210y <= 15000
* 110x+30y <= 4000
* x+y <= 75
*
* With x,y being integers
*
*/
Problem problem = new Problem();
Linear linear = new Linear();
linear.add(143, "x");
linear.add(60, "y");
problem.setObjective(linear, OptType.MAX);
linear = new Linear();
linear.add(120, "x");
linear.add(210, "y");
problem.add(linear, "<=", 15000);
linear = new Linear();
linear.add(110, "x");
linear.add(30, "y");
problem.add(linear, "<=", 4000);
linear = new Linear();
linear.add(1, "x");
linear.add(1, "y");
problem.add(linear, "<=", 75);
problem.setVarType("x", Integer.class);
problem.setVarType("y", Integer.class);
Solver solver = factory.get(); // you should use this solver only once for one problem
Result result = solver.solve(problem);
System.out.println(result);
/**
* Extend the problem with x <= 16 and solve it again
*/
problem.setVarUpperBound("x", 16);
solver = factory.get();
result = solver.solve(problem);
System.out.println(result);
// Results in the following output:
// Objective: 6266.0 {y=52, x=22}
// Objective: 5828.0 {y=59, x=16}