解决具有额外约束的分区的正确算法是什么?

时间:2018-06-15 08:01:26

标签: algorithm constraints partitioning

以下是我的问题摘要:

我有一组需要分配给一组人的问题。每个问题都应该只分配给一个人,所有问题都应该分配(分区)。每个问题都有一个值(连续变量)和一个成本(不同人的成本是不同的,每个人对问题都有自己的成本)。

目标是找到一个为人们分配问题的分区,以便每个人在所有分配的问题中的最大成本低于某个阈值,并且所有分区的总值大致相同(或者总差异更大)人与人之间的价值最小化。)

有人能指出我正确的方向吗?我知道有贪婪的算法来解决多路分区问题,但我不知道如何修改它们来处理额外的约束,即分配给一个人的所有问题的最大成本应该低于某个阈值

是否可以使用像minizinc这样的约束建模语言来解决这个问题?

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

根据您的描述,我不确定您遇到的是分区问题,还是分配问题,因为您正在尝试为每个问题分配一个人。

下面,我与您分享一个基本的MiniZinc模型,该模型应该可以大致解决您的问题;您可能需要进行一些调整才能完全适合您的问题描述。

problem.mzn:

 int: num_people;  % the number of people
 set of int: PEOPLE = 1..num_people;
 int: num_problems; % the number of problems
 set of int: PROBLEMS = 1..num_problems;
 array[PROBLEMS] of float: value;  % the value of each problem
 array[PROBLEMS, PEOPLE] of float: cost; % the cost of each problem, for each person
 float: threshold; % the threshold for the overall costs

 % DECISION VARIABLE: assign to each problem a person
 array[PROBLEMS] of var PEOPLE: personForProblem;


 % the sum of the costs of the "problem-person" assignment must be smaller than a threshold 
 constraint 
    sum (problem in PROBLEMS) (cost[problem, personForProblem[problem]] )  
    <= threshold;

 % maximize the sum of the value of each "problem-person" assignment
 solve maximize 
     sum (problem in PROBLEMS) ( value[personForProblem[problem]]);

在此模型中,我首先定义您定义的所有参数:人数num_people,问题数量num_problems,{{1 }},每个问题的value(因人而异),以及总体费用的cost

第二,我定义了决策变量threshold,它是整数变量的数组,其中整数表示将问题分配给的人。

第三,我发布了约束,即所有费用的总和必须小于personForProblem

最后,我声明目标的问题是使整体threshold最大化。不确定这是否是您的目标,您尚未指定value的目的是什么,所以这是一个猜测。

如果将上面的文本保存到文件value中,则可以使用MiniZinc和示例数据文件来解决此问题模型,例如:

sample-problem.dzn:

problem.mzn

我希望这有助于全面解决您的问题。