当前位置: 首页 > 知识库问答 >
问题:

如何使用Choco solver framework for Java对特殊集合约束建模

晋鹤轩
2023-03-14

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

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

到目前为止,我们有一个SetVar guest_列表,其中包括1至1名客人。然后将guest_列表划分到SetVar[]表中。

但是我如何约束每个table.size

如何在两个集合之间设置约束,以最小化成员/交点?

我不知道如何在一个集合内为邻居建模,以最大限度地实现共同利益。

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());

共有1个答案

段干祺
2023-03-14

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

 类似资料:
  • 这在gcc中编译,但在clang和最新的MSVC预览编译器中都不编译 下一个尝试是使用friend声明中的约束,即。 这看起来像是一种自然的方式,因为无论如何只能在满足约束的情况下实例化friend。

  • 我正在尝试在php中创建以下元素,以创建我们的一个客户所需的xml。 每件事都很好,但我不知道如何创建以下元素 我已经尝试了几种方法,但仍然无法正确生成上述示例 有人能送我上路吗? 这是我的代码

  • 我需要解决一个类似背包问题的最佳化问题。我在这篇文章中详细描述了最佳化问题:动态变量背包优化我实际上需要使用python而不是OPL,所以我安装了docplex和clpex包,以便使用cplex优化框架。 这是我想用docplex转换成python的OPL代码 这是我的第一次代码尝试: 我实际上不知道如何正确地建模OPL代码中的变量xg、xc和z? 关于如何正确建模的任何想法。先谢谢你 编辑:这是

  • 问题内容: 我有一个带有4列的表格 每列将是A,B,C,D 列A是主键。列B具有唯一的名称约束。 现在,我想删除列B的唯一约束,并通过组合列B,C和D给出唯一约束。因此,该表将只允许一行包含列B,C和D中的特定值。 如何给这种约束? 我尝试给复合唯一密钥,例如: 但这是在检查是否存在任何约束,而不是在检查唯一键约束的组合。 问题答案: 在这些列上创建唯一键 Oracle / PLSQL:唯一约束

  • 我想在 中使用 trait 对象。在C中,我可以制作一个基类,从中派生出和。然后我可以创建一个

  • 我正在为Java 6开发源代码到源代码转换器*1)。 我需要保持负面信息和正面信息,所以我必须为变压器实现小约束系统。约束系统是受限制的CNF公式,可以定义为以下内容: 其中,是等式约束(替换、变量赋值), 是质量限制,