MiniZinc 数组中字符串值的索引

2023-12-01

问题

给定一个 MiniZinc 字符串数组:

int: numStats;
set of int: Stats = 1..numStats;
array[Stats] of string: statNames;

...使用从 MiniZinc 数据文件加载的数据:

numStats = 3;
statNames = ["HEALTH", "ARMOR", "MANA"];

如何查找数组中特定字符串的索引?例如,ARMOR 位于位置 2。

上下文

我需要根据其统计数据的一些限制找到最佳的项目选择。该信息存储在声明如下的二维数组中:

int: numItems;
set of int: Items = 1..numItems;
array[Items, Stats] of float: itemStats;

因此,为了对通过所选项目获得的 ARMOR 的最小数量编写约束,我需要知道 ARMOR 在内部数组中的索引为 2。

由于数据文件是由外部程序生成的,并且统计数据的数量和顺序是动态的,因此我无法对约束中的索引进行硬编码。

一种解决方案(在我的情况下不起作用)

The 迷你锌教程使用一个有趣的技巧来实现类似的目标:

set of int: Colors = 1..3;
int: red = 1;
int: yellow = 2;
int: blue = 3;
array[Colors] of string: name = ["red", "yellow", "blue"];

var Colors: x;
constraint x != red;
output [ name[fix(x)] ];

不幸的是,由于 MiniZinc 数据文件中不允许变量声明,因此这个技巧在我的情况下不起作用。


你可以自己写自定义功能获取字符串数组中字符串的索引:

function int: getIndexOfString(string: str, 
                               array[int] of string: string_array) = 
   sum(  [ if str = string_array[i] 
              then i
           else 0 endif  
          | i in index_set(string_array) ]
   );

在此函数中,我创建一个整数数组,其中位置处的整数i任一等于索引str if string_array[i]=str and 0否则。例如,对于您的示例字符串数组["HEALTH", "ARMOR", "MANA"]和strARMOR结果 int 数组将是[0,2,0].

这就是为什么我可以简单地对 int 数组求和来获取字符串的索引。如果该字符串不存在,则返回值为0,这很好,因为 MiniZinc 中的索引默认从 1 开始。

以下是您如何为第一个示例调用上面的函数:

int: numStats;
set of int: Stats = 1..numStats;
array[Stats] of string: statNames;

numStats = 3;
statNames = ["HEALTH", "ARMOR", "MANA"];

var int: indexOfArmor;

constraint 
   indexOfArmor = getIndexOfString("ARMOR",statNames);  

solve satisfy;  

但请注意,上述功能是有限的并且存在一些缺陷。首先,如果该字符串在数组中多次出现,那么您将收到一个无效索引(所有索引的总和,其中str发生了)。另外,如果您为字符串数组设置了自己的索引(例如(2..6)),那么您将需要调整该功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MiniZinc 数组中字符串值的索引 的相关文章

随机推荐

  • android Volley如何发布多个参数

    如何发布多个参数android Volley 发布多个数组 如 101 102 103 params put sessionid 101 102 103 就像 任何其他方式 public void postCompanyArticle St
  • 没有选择 emacs ido 所建议的内容? [复制]

    这个问题在这里已经有答案了 在我当前的工作目录中 WD有一个abc txt文件 现在我想做另一个abc txt子目录下 WD NEW 当我打字时C x C f和目录 WD NEW abc txt ido 正在将字符串更改为 WD abc t
  • 如何为 scikit-learn 提供随机数生成器的种子?

    我正在尝试为一些使用 scikit learn 的代码编写单元测试 然而 我的单元测试似乎是不确定的 AFAIK 我的代码中 scikit learn 使用随机性的唯一地方是它的LogisticRegression模型及其train tes
  • 如何将两个不同的域名指向同一个网站? [关闭]

    Closed 这个问题是无关 目前不接受答案 我有一个网站 但这个网站没有完整的域名 但在互联网上排名很好 我想让这个网站由两个不同的域名指向 请建议我该怎么做 请给我简单的步骤来做到这一点 Thanks 在每个域下 您应该有 DNS 设置
  • 如何从命令行构建 MSIX [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我们已经了解 MSIX 是 ClickOnce 的一个有趣的现代替代品 与 GUI 一起使用运行流畅 我们还希望将其与 Powershell CMD 脚本一起使用 我们只想要 m
  • (字符串)文字的范围

    我总是尽量避免返回字符串文字 因为我担心它们没有在函数外部定义 但我不确定情况是否如此 我们以这个函数为例 const char return a string void return blah 这是正确的代码吗 它确实对我有用 但也许它只
  • 就像 MySQL 中区分大小写一样

    我有一个 MySQL 查询 SELECT concat ws title description as concatenated HAVING concatenated LIKE SearchTerm 我的表是用 MyISAM 编码的 ut
  • 使用原始音乐数组进行循环 android

    我目前正在尝试创建一个 for 循环 在该循环中它将播放原始文件 完成后 它将继续播放数组中的下一个声音文件 目前它正在一次播放所有文件 关于如何解决这个问题有什么建议吗 我认为完成监听器可能有问题 但不确定 谢谢 my Code pack
  • 使用单个 URL 抓取多个页面上的表

    我正在尝试从 Fangraph 中抓取数据 这些表分为 21 个页面 但所有页面都使用相同的 URL 我对网络抓取 或一般的Python 非常陌生 但Fangraphs没有公共API 所以抓取页面似乎是我唯一的选择 我目前正在使用 Beau
  • Javafx 四边形网格

    我需要在javafx中显示一个四边形网格 每个网格面有4个点我尝试了一些来自fxyz的三角形网格示例library 但不确定它如何适用于四边形 有人可以帮助指出 javafx 中四边形网格的示例吗 OpenJFX 上提供的 3DViewer
  • 如果我在不同的国家/地区,如何知道特定国家/地区的时间?

    我正在尝试这样做 1 获取我的当前时间和时区 2 我从 Google 知道该特定国家 地区的时区 3 计算时区差异 4 从当前时间中减去该差值 这会给我在其他国家的时间 我被困在步骤 3 和 4 了 我得到这样的当前时间 Date d ne
  • Java字符串操作:根据模式从字符串中提取整数和浮点数

    我有以下两个可能的字符串内容 显然 金额总是有所不同 我想提取关键信息并 Case 0 pricesString Case 1 pricesString 0 023 Case 2 pricesString 10 1 46 100 0 16
  • Oracle:发送 JMS 消息的 Java 存储过程

    我正在尝试将点对点 JMS 消息从 Oracle 数据库存储过程发送到 java 应用程序 这两个 点 位于不同的机器上 我已确认它们可以通过 ping 相互通信 我创建了一个 java 应用程序 能够成功地从应用程序服务器内的队列中取出消
  • Android Studio 中未显示 Windows 的构建选项

    我使用的是 Flutter Desktop 的最新稳定版本 并且已经安装了 Visual Studio 2022 但仍然没有显示 Windows 选项 我还需要在稳定版本中运行以下命令吗 flutter config enable
  • 删除 NaN 行在 pandas 中不起作用[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我有一个大约 7k 行和 4 列的文件 很多单元格都是空的 我尝试使用许多 pandas 函数删除它们 但似乎没有任何效果 我尝试过的功能和代码如下 我尝试过的 df df
  • 为什么 GetProcAddress 不起作用?

    首先 我创建一个简单的 dll 名为SimpleDll dll 其头文件 SimpleDll h ifdef MYLIBAPI else define MYLIBAPI declspec dllimport endif MYLIBAPI i
  • javascript 中函数闭包前是否需要分号?

    我想知道这是否是一个编译器错误 或者这就是它应该的方式 使用node js v10 15 3 此代码会抛出错误 var x x false function y console log foo 但这段代码工作正常 var x x false
  • 隐藏/不可见的 Ajax 请求?

    是否可以编写和创建一个无法被 Firefox 中的 Firebug 插件捕获的 JavaScript Ajax 请求 我问这个问题是因为我可以在 Facebook 上看到没有正在进行的 Ajax 请求 但是当我从另一个帐户发送消息时 顶部的
  • 2D CUDA 中值滤波器优化

    我在 CUDA 中实现了一个 2D 中值滤波器 整个程序如下所示 include cuda runtime h include cuda runtime api h include device launch parameters h in
  • MiniZinc 数组中字符串值的索引

    问题 给定一个 MiniZinc 字符串数组 int numStats set of int Stats 1 numStats array Stats of string statNames 使用从 MiniZinc 数据文件加载的数据 n