minizinc - 我怎样才能获得元素的组合

标签 minizinc

我刚刚开始使用 Minizinc,我会在这方面提供一些帮助。

如何编写以下约束:

I want to buy at most 4 GROUP offers, spend at most 100$ and I can buy only one item from every group. Maximize quality.

int: items = 10;
set of int: GROUPS = 0..itms; 
set of int: PRODUCTS = 1..7;

set of int:BUYS = 1..4;
int : max_spent = 100;

array[GROUPS] of set of int : package = array1d(GROUPS,[{},{1,2,3},{4,7},{3,6},{1,4,5},{3,4,7},{1,2,5},{4,6},{3,7},{3,7,5},{2,3}]);
array[GROUPS] of int: package_price  =  array1d(GROUPS,[0,5,5,25,10,12,20,40,55,52,10]);
array[GROUPS] of int: package_quality = array1d(GROUPS,[0,7,2,7,2,3,5,4,9,6,5]);

所需的输出应该类似于:

{3,7} {4,6} {1,2,5} {}
quality = 10;
price = 97;

--- 更新 ---

到目前为止我尝试过:

var int : will_buy;
will_buy = sum(i in BUYS)(package_price[i]);
constraint will_buy <= max_spent;

var int : quality;
quality = sum(i in GROUPS)(package_quality[i]);

array[GROUPS] of var BUYS: index;
include "element.mzn";
constraint forall(t in GROUPS)
            ( 
             element(index[t], package_price, package_price[t]) 
             /\  
             element(index[t], package_quality, package_quality[t])
             ); 

:/

最佳答案

您的问题是众所周知的背包问题的变体。 MiniZinc tutorial中给出了这个问题的解决方案。 ,第 3.6 章。了解背包模型的 MiniZinc 模型应该可以为您解决此问题提供指导。

或者,您可能想查看 global packing constraints ,这些可能会使建模变得更容易。

关于minizinc - 我怎样才能获得元素的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47460829/

相关文章:

minizinc - minizinc下的多重输出

arrays - Minizinc - 如何限制数组的每一列仅包含给定整数之一?

MiniZinc:类型错误:找不到具有此签名的函数或谓词: `floor(var int)'

floating-point - 在 MiniZinc 中我该如何解决这个错误?

constraint-programming - Minizinc:可变顺序

constraints - 检查数组中是否存在元素#minizinc

python - 从 Python 访问 minizinc 数据

algorithm - 我什至无法表达这个问题,我需要从一大组数字中选出 3 个非常接近的数字

minizinc - 有没有办法在 minizinc 中自定义 int_search ?