首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MicrosoftSolverFoundation3.0优化团队建设

使用MicrosoftSolverFoundation3.0优化团队建设
EN

Stack Overflow用户
提问于 2011-10-08 19:12:47
回答 1查看 1.1K关注 0票数 2

我在做一个学生项目团队建设应用程序。我熟悉优化,但以前没有使用过。我已经完成了我的约束,但是我很难用Solver语法来确定我的目标。下面是应用程序的基本摘要:

教授们对每个项目的某些技能进行了权衡。学生们列出哪些技能是他们的长处和弱点,并对他们想要做的项目进行排序。一个项目必须有3-5名学生分配给它.每个学生必须被分配一个项目。

  • 主要目标是最大限度地满足技能要求。
  • 次要目标是尽量扩大学生的喜好。

我一直在玩的SimplexSolver类基于这个混合整数问题教程,并能够最大限度地提高学生的喜好,没有任何问题。

代码语言:javascript
复制
using Microsoft.SolverFoundation.Solvers;

//This example has 2 projects and 6 students
SimplexSolver solver = new SimplexSolver();
//Student A wants to be in project 1, Student B is indifferent to project 1, Student C does not want to be in project 1, etc...
double[] studentprojectpref = new double[] { 1, 0, -1, 0, -1, 0, 0, 1, 0, 1, 0, 1 };
int[] choosestudentprojectPS = new int[12];

//GOAL - maximize student preferences
int sumpreferences;
solver.AddRow("sumpreferences", out sumpreferences);
solver.AddGoal(sumpreferences, 1, false);

//add a varaible (column) for each possible student/project pair
for (int i = 0; i < choosestudentprojectPS.GetUpperBound(0)+1; i++)
{
    solver.AddVariable(projectstudent[i], out choosestudentprojectPS[i]);
    solver.SetBounds(choosestudentprojectPS[i], 0, 1);
    solver.SetIntegrality(choosestudentprojectPS[i], true);
    solver.SetCoefficient(sumpreferences, choosestudentprojectPS[i], studentprojectpref[i]);
}

solver.Solve(new SimplexSolverParams());

Response.Write(solver.MipResult + "<br>");
Response.Write("<br>Project 1<br>");
for (int i = 0; i < 6; i++)
{
    if (solver.GetValue(choosestudentprojectPS[i]) == 1) Response.Write(projectstudent[i] + "<br>");
}
Response.Write("<br>Project 2<br>");
for (int i = 6; i < 12; i++)
{
    if (solver.GetValue(choosestudentprojectPS[i]) == 1) Response.Write(projectstudent[i] + "<br>");
}
    Response.Write("<br>The total sumpreferences is: " + solver.GetValue(sumpreferences) + "<br>");

我知道如何为每个项目技能需求添加行,并为每个学生的强弱设置系数,并为该项目的技能权重设置一个下限。这给我带来了两个问题。

  1. 我不相信所有的项目技能要求都会得到满足。这就是为什么我想设定一个目标,最大限度地提高技能需求的数量,而不是将技能权重设置为约束。即使一支球队在某一项技能上还差1分,它仍然比所有拥有这一技能的人都要好。
  2. 如果团队中有4名学生的编程技能权重为3,其中3名学生的编程能力被列为优势(+1),而另一名学生的编程能力被列为弱点(-1),那么我的模型将错误地表明,由于(1+1+1-1)<3,编程需求没有得到满足。

有人有什么想法吗?SimplexSolver是解决这个问题的最好方法吗?看起来解决方案基金会有很多不同的解决方案/工具。我有解决方案基金会的Express版本,但如果需要的话,我可能会获得学术企业版本。

谢谢,-格雷格

*最终申请将需要解决模型约100名学生,20-30个项目,和~30个潜在的技能(~5个项目)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-05 14:18:55

是的,你可以用单纯形来解决这个问题。这是一个标准的“分配问题”,在偏好和技能权重方面有一些变化。

您可以通过引入一个或多个“虚拟变量”来处理问题中的问题1,以处理‘can’

而不是将技能约束写成:

Sum for all students (X_sp) >= NumMin_pk对每个项目p,对于每个技能k。

你写

sum for all students (X_sp) > 0 + NumMin_pk * Dummy1_pk对每个p,对于每个技能k

在目标函数中,你惩罚Dummy_pk (通过给它一个最大化问题的负代价)。因此,单纯形只有在没有其他选择的情况下才会分配一个非零的Dummy_pk .

此外,假设有一项技能(编程),该项目的最小技能权重为3,但如果5名学生有编程,那就更好了。您可以通过引入第二个虚拟变量(Dummy2_pk)来实现这一点。

Sum for all students (X_sp) > 0 + 3* Dummy_pk + 2 * Dummy_pk2对每个p,对于每个技能k

在目标函数中,给Dummy_pk一个较高的负代价,给Dummy2_pk.The模型一个较小但负的代价,先得到Dummy1_pk 0,如果可能的话,将Dummy2_pk变为零。结果将有5名具有编程技能的学生被分配到该项目中。

解决问题2(负技能权重):通过分离1s和-1将技能向量分成两个向量。

所以,1,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0。根据你想对技能弱点做些什么,你可以为每个项目写两个约束,技巧k,避免弱点抵消另一个学生的技能的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7699157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档