Optimization 基于微软Sover基金会3的团队建设优化

Optimization 基于微软Sover基金会3的团队建设优化,optimization,linear-programming,ms-solver-foundation,Optimization,Linear Programming,Ms Solver Foundation,我正在开发一个学生项目团队建设应用程序。我熟悉优化,但以前没有使用微软解决方案基金会。我已经解决了我的约束条件,但在使用解算器语法确定目标时遇到了困难。以下是应用程序的基本摘要: 教授们为每个项目权衡某些技能。学生列出 技能是他们的强项和弱项,他们对项目进行排名 想做什么。一个项目必须有3-5名学生分配到 信息技术必须为每个学生分配一个项目 主要目标是最大限度地满足技能要求的数量 第二个目标是最大化学生的偏好 我一直在玩基于此的游戏,能够最大限度地提高学生的喜好没有任何问题 using Mi

我正在开发一个学生项目团队建设应用程序。我熟悉优化,但以前没有使用微软解决方案基金会。我已经解决了我的约束条件,但在使用解算器语法确定目标时遇到了困难。以下是应用程序的基本摘要:

教授们为每个项目权衡某些技能。学生列出 技能是他们的强项和弱项,他们对项目进行排名 想做什么。一个项目必须有3-5名学生分配到 信息技术必须为每个学生分配一个项目

  • 主要目标是最大限度地满足技能要求的数量
  • 第二个目标是最大化学生的偏好
我一直在玩基于此的游戏,能够最大限度地提高学生的喜好没有任何问题

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>");
使用Microsoft.SolverFoundation.Solvers;
//本例有2个项目和6名学生
SimplexSolver=新SimplexSolver();
//学生A想参加项目1,学生B对项目1漠不关心,学生C不想参加项目1,等等。。。
double[]studentprojectpref=新的double[]{1,0,-1,0,-1,0,0,1,0,1};
int[]选择studentprojectps=newint[12];
//目标-最大化学生偏好
个人偏好;
AddRow(“sumpreferences”,out-sumpreferences);
解算器.AddGoal(sumpreferences,1,false);
//为每个可能的学生/项目对添加变量(列)
对于(int i=0;i”;
回答。写(“
项目1
”; 对于(int i=0;i<6;i++) { if(solver.GetValue(choosestudentprojectPS[i])==1)Response.Write(projectstudent[i]+“
”; } 回答。写(“
项目2
”; 对于(int i=6;i<12;i++) { if(solver.GetValue(choosestudentprojectPS[i])==1)Response.Write(projectstudent[i]+“
”; } Write(“
总sumpreferences为:”+solver.GetValue(sumpreferences)+“
”;
我知道如何为每个项目技能要求添加行,并为每个学生的技能优势/劣势设置系数,并为该项目的技能权重设置下限。这给了我两个问题

  • 我不相信所有的项目技能要求都能得到满足。这就是为什么我想设定一个目标,最大限度地提高技能要求的数量,而不是将技能权重设置为最低限制。即使一支球队在某项技能上少了1分,也比所有将该技能列为弱点的球队要好

  • 如果一个团队中有4名学生的编程技能权重为3,其中3名学生的编程能力被列为优势(+1),而另一名学生的编程能力被列为劣势(-1),那么我的模型将错误地显示编程要求未得到满足,因为(1+1+1-1)是的,您可以使用单纯形来解决这个问题。这是一个标准的“分配问题”,在偏好和技能权重方面有一些变化

    您可以通过引入一个或多个虚拟变量来解决问题1中的问题以填补“松弛”

    而不是将技能约束写为:

    Sum for all student(X_sp)>=NumMin_pk
    针对每个项目p,针对每个技能k

    你写

    所有学生的总和(X_sp)>0+NumMin_pk*Dummy1_pk
    每个p,每个技能k

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

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

    所有学生的总和(X_sp)>0+3*Dummy_pk+2*Dummy_pk2

    在目标函数中,给Dummy_pk一个较高的负成本,给Dummy 2_pk一个较小的负成本。模型将首先尝试使get Dummy 1_pk为0,如果可能,if将驱动Dummy 2_pk为零。结果是5名具有编程技能的学生被分配到该项目中

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

    所以[1,0,0,1,-1,0,1]变成了[1,0,0,1,0,0,1]和[0,0,0,0,-1,0,0]。根据你想对技能弱点做什么,你可以为每个项目p,技能k写两个约束条件,避免弱点抵消另一个学生技能的问题