constraint-programming - 如果某些变量是字符串数组,如何在 Minizinc 中构建约束?
问题描述
我刚刚开始使用 Minizinc,如果我能在为我的问题建立模型方面获得一些想法,我将不胜感激。
我有三个项目。在购买每件商品时,我都会获得一定的现金返还奖金,并且可以购买一件商品的次数有限制。我的购物车里也有容量。
例子 :
items = [ 'i1', 'i2', 'i3' ]
cart_capacity = 7
cashback = [30,10,20]
(meaning, with purchase of item1 I get back $30)
Frequency_of_purchase = [ 2 , 1 , 5]
(meaning, item 3 can be purchased 5 times)
我需要一个输出说明每件商品可以购买多少次,以便我获得最大的现金返还
Desired result = { i1 : 2, i2: 0, i3 : 5}
解决方案
通常我们会说字符串输入主要作为不同项目的标签。
在 MiniZinc 中,最好的方法是使用枚举类型。枚举类型既可以用作数组的索引,也可以用作变量的可能值。
您的模型可以表示为:
/* --- Problem Parameters --- */
enum ITEMS;
int: cart_capacity;
array[ITEMS] of int: cash_back;
array[ITEMS] of int: item_capacity;
/* --- Decision Variables --- */
array[ITEMS] of var 0..ub_array(item_capacity): purchases;
/* --- Constraints --- */
constraint forall(it in ITEMS) (purchases[it] < item_capacity[it]);
constraint sum(it in ITEMS) (purchases[it]) < cart_capacity;
/* --- Solving Goal --- */
solve maximize sum(it in ITEMS) (purchases[it]*cash_back[it]);
output ["{"] ++ [show(it) ++ ": " ++ show(purchases[it]) ++ if it == max(ITEMS) then "" else ", " endif | it in ITEMS] ++ ["}"];
您问题中的输入必须稍微调整为:
ITEMS = { 'i1', 'i2', 'i3' };
cart_capacity = 7;
cashback = [30, 10, 20];
item_capacity = [2 , 1 , 5];
推荐阅读
- c# - c# 配置类和 KeyVault
- javascript - 由于错误 c004e005 无法完成操作
- java - 系统尝试启动时,liquibase 不会响应
- angular - 角度 4.3 [style.box-shadow] 或 [style.boxShadow] 不工作
- excel - Excel - 复制每个值的次数与另一列中的序列号一样多
- sql - 如何通过比较sql中where子句中的两个字符串来使用case语句
- ruby - 在 Sequel 应用程序中使用多个数据库
- sql - 将 jsonb 列与 Postgres 中的顶级列连接
- docker - 'docker container commit' 命令以何种方式有助于调试?
- angular - 使用 SIGNAL R 的 Angular 7 和 ASP.NET Core 2.2 的 CORS 策略问题