首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果一些变量是字符串数组,如何在Minizinc中构建约束?

如果一些变量是字符串数组,如何在Minizinc中构建约束?
EN

Stack Overflow用户
提问于 2021-04-17 06:24:26
回答 1查看 32关注 0票数 0

我刚刚开始使用Minizinc,如果我能为我的问题建立一个模型,我会很感激。

我有三样东西。在购买每一件商品时,我都会得到一定的返现奖金,而且购买一件商品的次数是有限制的。另外,我的购物车里也有空位。

示例:

代码语言:javascript
复制
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)

我需要一个输出,告诉我每件商品可以购买多少次,这样我就可以获得最大的现金回扣

代码语言:javascript
复制
Desired result = { i1 : 2, i2: 0, i3 : 5}
EN

回答 1

Stack Overflow用户

发布于 2021-04-17 07:02:57

通常我们会说字符串输入主要是作为不同项目的标签。

在MiniZinc中,最好的方法是使用枚举类型。枚举类型既可用作数组的索引,也可用作变量的可能值。

您的模型可以表示为:

代码语言:javascript
复制
/* --- 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] ++ ["}"];

您的问题中的输入必须稍微调整为:

代码语言:javascript
复制
ITEMS = { 'i1', 'i2', 'i3' };
cart_capacity = 7;
cashback = [30, 10, 20];
item_capacity = [2 , 1 , 5];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67132861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档