Minizinc云VM选型模型使用coin-bc求解器报float_div错误如何解决
问题原因
- 报错原因:COIN-OR BC(CBC)属于混合整数线性规划(MILP)求解器,仅支持线性约束,你当前目标函数中的浮点除法属于非线性运算,不在CBC支持范围内,因此触发
float_div报错。 - Gecode运行过慢原因:Gecode是通用约束编程求解器,对带优化目标的中大规模组合问题求解效率远低于专用MILP求解器,因此难以快速收敛到最优解。
- 额外逻辑错误:你当前设置的目标是
maximize (0.9 * totalPrice) / (0.1 * totalACU),等价于追求成本越高、性能越低,和你「压低总成本、抬高总ACU」的需求完全相反。
修复方案
1. 改写目标函数为线性形式
无需使用除法做比率计算,直接用线性加权的方式平衡成本和性能权重即可,完全符合MILP求解器的要求:
% 权重可按需调整:成本权重越高,整体越倾向选低价实例;性能权重越高越倾向选高性能实例 var float: targetFunc = 0.9 * totalPrice - 0.1 * totalACU; % 改为最小化目标,等价于成本尽可能低、性能尽可能高 solve minimize targetFunc;
如果不想引入浮点变量,也可以将系数放大为整数,运行效率更高:
var int: targetFunc = 9 * totalPrice - 1 * totalACU; solve minimize targetFunc;
2. 补全遗漏约束
你当前代码缺少磁盘配置匹配约束和磁盘成本计算,建议同步补充:
% 补充磁盘容量匹配约束 constraint forall(vm in existingVMs)( vmDiskSizes[selectedDiskSize[vm]] >= vmDisk[vm] ); % 总价格补充磁盘成本 var float: totalPrice = sum(vm in existingVMs)( vmSizePrice[selectedSize[vm]] + vmDiskPrice[selectedDiskSize[vm]] );
3. 继续使用CBC求解器
修改后重新运行原命令即可,CBC对线性整数规划问题的求解效率远高于Gecode,可快速得到最优解。
内容的提问来源于stack exchange,提问作者Eosfor
相关产品推荐
相关产品推荐

