2016-12-30 183 views
0

我在建模问题和用Java解决Choco求解器问题时遇到了问题,并且我不太熟悉约束编程,但是已经分配了任务为会议制作座位应用程序,其中:如何使用Choco解算器框架为Java建模特殊集合约束

  • 每个表必须至少有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()); 
+0

请分享任何有助于理解问题的pom.xml和代码 –

回答

0

可用约束的集合可以从实现IConstraintFactory的模型访问。查看源代码中的ISetConstraintFactory.java。有与设置大小,工会,分区有关的限制...