【问题标题】:How to model special set constraints using Choco solver framework for Java如何使用适用于 Java 的 Choco 求解器框架对特殊集合约束进行建模
【发布时间】:2016-12-30 21:05:48
【问题描述】:

我在建模问题并使用 Java 中的 Choco-solver 解决问题时遇到了问题,而且我一开始就不太熟悉约束编程,但我的任务是为以下会议制作一个座位应用程序:

  • 每张桌子必须至少有 6 人,并且总是有足够的桌子。
  • 人们应该与邻居坐在一起,以最大限度地实现共同利益。
  • 在前几天,我们希望尽量减少与之前坐过的人一起坐在桌子上的人数。
  • 人员属于 A 类或 B 类,我们希望尽量减少每张桌子上出现 A 类的情况。

到目前为止,我们有一个 SetVar guest_list,其中包括最多 1 个客人。 然后将 guest_list 分区到 SetVar[] 表。

但是我如何使每个 table.size >= 6 的约束条件呢?

如何在两个集合之间进行约束,以尽量减少成员/交叉点?

而且我不知道如何为一组中的邻居建模以最大化共同利益。

import org.chocosolver.solver.Model;
import org.chocosolver.solver.Solution;
import org.chocosolver.solver.variables.IntVar;
import org.chocosolver.solver.variables.SetVar;

// constant value declarations
int number_of_guests = 100;
int table_size = 8;
int tables_needed = number_of_guests / table_size + 1;

// this will later be passed as argument, generated for testing
int[] guest_ids = new int[number_of_guests];
for (int i = 0; i < number_of_guests; i++) {
    guest_ids[i] = i;
}

// Model and variables
Model model = new Model("Seating solver");

IntVar min_guests_at_tables = model.intVar(6);
// a list containing all guests in its LB
SetVar guest_list  = model.setVar("guests", guest_ids);
// making empty sets for each table needed, UB is all guests
SetVar[] tables = model.setVarArray(tables_needed, new int[]{}, guest_ids);
// log over table seatings from earlier days, starts empty for day 1.
// want to minimize how many members from tables[x] share with any ser of logged_tables
SetVar[] logged_tables = model.setVarArray(0, new int[]{}, new int[]{});
// a setvar of all interests for each guest, will be imported later.
SetVar[] guest_interests = model.setVarArray(number_of_guests, new int[]{}, new int[]{});
// set of all those members of group A
// random test values inserted
SetVar group_A_members = model.setVar(1,23,54,2);

// Constraints unsure about all of these

// each set must be unique
model.allDifferent(tables);
for (SetVar table : tables) {
    // TODO trying to constrain sizes of each table set to 6 or greater
    model.arithm(model.intVar(table.getLB().size()), ">=", min_guests_at_tables);
// TODO trying to minimize number of shared members in tables, with whats in logged_tables
for (SetVar old_table : logged_tables) {
    // no idea
}
// TODO trying to maximize the amount of interest neigbors in a set share
// no idea

// TODO minimize shared members from table with group_A_members
// no idea how to minimize or maximize
}

// Solving

Solution s = model.getSolver().findSolution();
if (s != null) System.out.println(s.toString());

【问题讨论】:

  • 请分享任何可以帮助理解问题的 pom.xml 和代码

标签: java constraint-programming choco


【解决方案1】:

可用的约束集可从实现 IConstraintFactory 的模型访问。查看源代码中的 ISetConstraintFactory.java。存在与集合大小、联合、分区相关的约束......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多