簡體   English   中英

如何使用適用於Java的Choco求解器框架對特殊集合約束進行建模

[英]How to model special set constraints using Choco solver framework for Java

我在建模問題並使用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());

可從實現IConstraintFactory的模型訪問可用約束集。 在源代碼中查看ISetConstraintFactory.java。 存在與集合大小,並集,分區有關的約束...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM