Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用约束求解赋值或匹配的算法_Algorithm_Matlab_Optimization_Variable Assignment_Linear Programming - Fatal编程技术网

Algorithm 使用约束求解赋值或匹配的算法

Algorithm 使用约束求解赋值或匹配的算法,algorithm,matlab,optimization,variable-assignment,linear-programming,Algorithm,Matlab,Optimization,Variable Assignment,Linear Programming,问题就在这里。假设我们有N个工人和N个工作。我们希望每项工作只分配一名工人。对于我所认识的每一个工人,他都能以一定的成本做一些工作。我们的目标是在任何单个成本应小于某个值的情况下,使总成本最小化。 例如,10名工人和10份工作。工人1可以用0.8美元完成工作1,用2.3美元完成工作2,用15.8美元完成工作3,用100美元完成工作4到8,用3.2美元完成工作9,用15.3美元完成工作10 工人2可以用3.5美元完成工作1,用2.3美元完成工作2,用4.6美元完成工作3,用17美元完成工作4,等等

问题就在这里。假设我们有N个工人和N个工作。我们希望每项工作只分配一名工人。对于我所认识的每一个工人,他都能以一定的成本做一些工作。我们的目标是在任何单个成本应小于某个值的情况下,使总成本最小化。

例如,10名工人和10份工作。工人1可以用0.8美元完成工作1,用2.3美元完成工作2,用15.8美元完成工作3,用100美元完成工作4到8,用3.2美元完成工作9,用15.3美元完成工作10

工人2可以用3.5美元完成工作1,用2.3美元完成工作2,用4.6美元完成工作3,用17美元完成工作4,等等

我们的目标是找到一个匹配项,或者我们可以称之为分配,这样总成本最小化,但工作i和工作i之间对应的配对/匹配项的任何单个成本都小于50美元


如果可能的话,我非常想在MATLAB中解决它。

这是。要处理任何单个作业成本都不应超过某个值的附加约束,只需将成本矩阵中大于此阈值的所有条目更改为一个巨大的值(大于所有其他条目的总和即可),并像往常一样使用解决方法,例如。

可能我遗漏了什么,但问题似乎很简单。对于每一份工作,找到最便宜的工人,检查这对工作和工人的成本是否低于50美元,分配工作。@DanielR:你遗漏了什么。例如,工人1在工作1上可能比其他工作更贵,但让他在工作1上的总成本可能仍然最低(例如,他在工作1上额外花费0.01美元,但在任何其他工作上额外花费1.0美元)。@JerryCoffin:如果每个工人有一个工作限制,你是对的。“我不知道它的用意是什么。”DanielR说,这个想法很像贪婪算法。这是有用的。我试图找到最小值,所以这可能不是最佳解决方案。@JerryCoffin感谢您的澄清。你很聪明@阿巴拉契安马:不客气:)当然,它适用于非整数成本。它可能被描述为最大化权重之和,而不是最小化它们,在这种情况下,只需将所有“>”替换为“你的意思是,只有当你改变大于阈值的值时,它才会变慢吗?在任何情况下,我希望1000x1000矩阵需要一段时间,因为它是一个O(n^3)算法!您可能可以使用不同的算法解决分配问题,或者使用线性规划解算器(如lp_solve)更快地解决问题。我之所以写第一句话,是因为我试图弄清楚您为什么会写“当我将所有大于阈值的项更改为更大的值时,会出现问题。”而不仅仅是“有问题”。我建议使用LP是因为它可能会更快——但可能只有当LP解算器足够聪明,能够检测到这是赋值问题的一个变体,并对其应用特殊的解决方法时。商业(I)LP解算器,如Gurobi,内置了大量此类内容:)如果使用LP,则只需忽略任何超过阈值的配对,而不是将它们设置为巨大的值。如果有大量的配对超过了阈值,普通的单纯形或障碍LP方法很可能比匈牙利方法更快地解决问题——必须试一试!不,我不抱歉,我已经好几年没碰MATLAB了。我似乎还记得有一个“优化工具箱”或其他东西。可能是这样的。