Minizinc 语法错误?请求帮助/建议

Minizinc syntax errors? requesting help/advice

提问人:Orange 提问时间:11/2/2023 最后编辑:decezeOrange 更新时间:11/2/2023 访问量:49

问:

我有以下模型,它给出了语法错误。任何帮助,非常感谢。

int: N = 8;  % Number of participants
int: M = 2;  % Team size
int: S = 4;  % Number of sessions
int: A = 4;  % Number of activities

% Define decision variables
array[1..N, 1..S] of var 1..A: team_assignment;

% Constraints
constraint
   % Each team can only participate in one activity
   forall(t in 1..N)
      (sum(s in 1..S)(team_assignment[t, s] == 1)) == 1;

   % No participant is assigned more than once in a session
   forall(s in 1..S, p in 1..N)
      (sum(t in 1..N)(team_assignment[p, s] == p)) == 1;

   % No participant is in the same activity more than once
   forall(p in 1..N, a in 1..A)
      (sum(s in 1..S)(team_assignment[p, s] == a)) <= 1;

solve satisfy;

% Output the solution
output [show(team_assignment)];

这些语法错误还在继续吗?

SessionActivity8:17.52-53:
MiniZinc: syntax error: syntax error, unexpected =, expecting ++ or ':'
SessionActivity8:21.52-53:
MiniZinc: syntax error: syntax error, unexpected <=, expecting ++ or ':'
Process finished with non-zero exit code 1.
语法错误 minizinc

评论


答:

0赞 Dekker1 11/2/2023 #1

语法错误是因为您忘记在每个约束之前重复约束关键字。

解决此问题后,会出现各种打字错误。假设您要计算条件保持的次数,则生成的模型将如下所示:

    int: N = 8;  % Number of participants
    int: M = 2;  % Team size
    int: S = 4;  % Number of sessions
    int: A = 4;  % Number of activities
    
    % Define decision variables
    array[1..N, 1..S] of var 1..A: team_assignment;
    
    % Constraints
    constraint
       % Each team can only participate in one activity
       count(t in 1..N)
          (sum(s in 1..S)(team_assignment[t, s]) == 1) == 1;
    
    constraint
       % No participant is assigned more than once in a session
       count(s in 1..S, p in 1..N)
          (sum(t in 1..N)(team_assignment[p, s]) == p) == 1;
    
    constraint
       % No participant is in the same activity more than once
       count(p in 1..N, a in 1..A)
          (sum(s in 1..S)(team_assignment[p, s]) == a) <= 1;
    
    solve satisfy;
    
    % Output the solution
    output [show(team_assignment)];

评论

0赞 Orange 11/2/2023
Dekker1,感谢您的快速回复。该修订删除了语法问题。是的,这是要解决的问题/条件:给定一组 N 个参与者,将参与者分成 m 个成员的团队。会议中有许多活动。将团队分配给每个会话*活动,以便一个团队只能参与 1 个活动,在会话中分配任何参与者/成员都不能多次,并且没有参与者/成员多次参与同一活动。首先,我要与 8 个人、4 项活动和 4 节课以及 2 人的团队打交道。
0赞 Orange 11/2/2023
它运行完成,但说不满意。我认为设置没有使用 M ,每个团队的人数。我是新手,所以可能错过了一两个约束。欢迎任何帮助/建议。
0赞 Dekker1 11/3/2023
“FindMUS”工具可以帮助找到“最小的不满足子集”,即使模型不满足的最小约束组合
0赞 Orange 11/5/2023
感谢您回复 Dekker1。我仍在尝试弄清楚这是什么样的调度问题。有人认为这可能是一个平衡的不完整的块设计,但在谷歌搜索和 youtube 之后,我没有足够的知识来确认或拒绝。我不知道这个问题是否适合 miniZinc,这也是有人建议的。我真的很想解决 4x4 问题,并从中尝试看看解决方案是否可扩展。这对我来说都是新的。
0赞 Orange 11/5/2023
我知道至少存在 1 种解决方案。这是手动完成的。使用 8 名参与者 A、B、C、D、E、F、G、H 和 2 人团队,....................活动。。。。。。。。。。。。。。。。。。。。。1 2 3 4 第 1 节 AE-CF-DG-BH 第 2 节 CG-AH-BE-DF 第 3 节 DH-BG-AF-CE 第 4 节 BF-DE-CH-AG 我难以将活动和会话与 StackOverflow 编辑器保持一致????当然不直观,也不要碰回车键!