为了账号安全,请及时绑定邮箱和手机立即绑定

choco 求解器中的资源分配

choco 求解器中的资源分配

紫衣仙女 2021-09-03 16:37:47
我正在choco用来解决虚拟机分配问题,这就是我想要做的:假设我们有 3 个用于物理机属性的数组 ( PMcpu, PMram, PMbw) 和 3 个用于虚拟机的数组 ( VMcpu, VMram, VMbw)。现在我们定义一个具有以下维度的矩阵:PM*VM以便 choco 将设置值(0 或 1 表示特定 VM 是否分配给 PM)。根据常识,我们知道 PM 资源应该大于或等于所有分配的 VM 资源的总量,因此为此我们将分配矩阵中的每个元素与相应的资源相乘,例如假设:PMcpu = {8000, 7000, 3000};PMram = {7000, 4000, 5000};PMbw = {2000, 500, 7000};VMcpu = {2000, 3000, 1000};VMram = {1000, 2000, 3000};VMbw = {100, 2000, 500};分配矩阵:0 1 01 0 00 0 1行代表 PM,列代表 VM,所以这里:VM2 -> PM1VM1 -> PM2VM3 -> PM3所以我写了这段代码:    Model model = new Model("Resource Allocation Problem");    int[] VMcpu = new int[number_of_vms];    int[] VMram = new int[number_of_vms];    int[] VMbw = new int[number_of_vms];    // some initialization here    int[] PMcpu = new int[number_of_pms];    int[] PMram = new int[number_of_pms];    int[] PMbw = new int[number_of_pms];    // some initialization here    IntVar[][] alloc_matrix = model.intVarMatrix("alloc_matrix", number_of_pms, number_of_vms, new int[] {0,1});    // ensuring all columns have only one 1 in them    ArrayList<IntVar> sum_of_col = new ArrayList<>();    for(int j=0; j<number_of_vms; j++) {        int count = 0;        for(int i=0; i<number_of_pms; i++) {            count += alloc_matrix[i][j].getValue();        }        IntVar tempInt = model.intVar(count);        sum_of_col.add(tempInt);    }    for(int i=0; i<sum_of_col.size(); i++) {        model.arithm(sum_of_col.get(i), "=", 1).post();    }     我试图通过检查行中要填充的矩阵的每一列来确保所有 VM 都已分配model.arithm(sum_of_col.get(i), "=", 1).post();。如果我评论约束和目标,矩阵将被随机分配,但是在应用约束时,choco 将无法解决任何问题(没有输出,因为while(model.getSolver().solve()它永远不会为真,因此 choco 似乎无法解决它)。我不知道我哪里做错了。任何帮助表示赞赏:)提前致谢编辑:我意识到问题是 choco 第一次只检查这些约束,所以它在一切都为 0 时检查它,这就是它不会继续的原因,但在 solve() 循环中添加约束后,我仍然得到相同的结果,也许我应该以 choco 理解它们的另一种方式应用这些约束,我现在真的很沮丧 :(
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信