2017-11-30 14 views
1

이것은 내 모델입니다 ... N = 16 POTITIONS의 사이 클릭 테이블에서 다른 친구를 옆에 두려고합니다. 친구들은 관심사가 있습니다. 서로 옆에 하나씩 은 최소한 하나의 공통 관심사가 있어야합니다.. 자신의 이익의minizinc 친구가 테이블에 앉아 공통 관심사를 공유

int :N; 
    set of int: FRIENDS = 1..N; 
    set of int: POSITIONS = 1..N; 
    array[FRIENDS] of set of int: interests; 
    array[POSITIONS] of var FRIENDS : friends_at; 
    include "alldifferent.mzn"; 
    constraint alldifferent(friend_at); 

    constraint forall(i in 2..N-1)(
    (interests[friend_at[i+1]]<=interests[friend_at[i]] \/ interests[friend_at[i+1]]>=interests[friend_at[i]]) 
/\ 
(interests[friend_at[i-1]]<=interests[friend_at[i]] \/ interests[friend_at[i-1]]>=interests[friend_at[i]]) 
/\ 
(interests[friend_at[N]]<=interests[friend_at[1]] \/ interests[friend_at[N]]>=interests[friend_at[1]]) 
); 

    solve satisfy; 

N = 16 배열 : 여기

interests=[{1},{2,3},{3,2},{2},{2,3},{2,1},{1,3},{3},{2,1},{3,1},{1,2},{2},{2,3},{2,3},{3},{2}]; 
+0

어떤 오류가 발생합니까? 또한이 모델은 완전하지 않습니다. '이익'의 선언이 부족하다. "관심사"매트릭스도 추가해 주시겠습니까? 그러면 모델을 더 쉽게 이해할 수 있습니다. – hakank

+0

관심 분야 = [{2,1,3}, {2,1,3}, {3,2}, {3,2,1}, {2,1,3}, {2,3,1} {1,2,3}, {3,1}, {2,3,1}, {3,2,1}, {1,3,2}, {3,1,2}, {2,3 }, {1,2}, {2,3,1}, {2,3}]; 내 오류 : C : /Users/ /Documents/ / /Gala/gala.mzn : 36 : MiniZinc : 병합 오류 : 'set_le'이 구체화 된 컨텍스트에서 사용되지만 구체화 된 버전을 사용할 수 없습니다. 이전 메모에서 – Kotsos

+0

... 모든 세트에서 공통된 차이점이 있습니다 ... 실례합니다. 관심사 = [\t {1 } \t {2,3}, {3,2 \t} \t {2} \t {2,3}, {2,1 \t}, {1 \t 3} \t {3} \t {2,1}, {3,1 \t} \t {1,2} \t {2} \t {2,3} \t {2,3}, \t {3}, \t {2} \t]; – Kotsos

답변

0

가 작동하는 것 같다 모델이다. 주요 접근법은 집합 작업 intersect을 사용하여 두 이웃이 최소한 하나의 공통 관심사를 가지도록하는 것입니다.

int :N; 
set of int: FRIENDS = 1..N; 
set of int: POSITIONS = 1..N; 
array[FRIENDS] of set of int: interests; 
array[POSITIONS] of var FRIENDS : friend_at; 
include "alldifferent.mzn"; 

constraint alldifferent(friend_at); 

constraint 
    forall(i in 2..N-1) (
     card(interests[friend_at[i+1]] intersect interests[friend_at[i]]) > 0 
    ) 
    /\ 
    card(interests[friend_at[N]] intersect interests[friend_at[1]]) > 0; 

해결 만족;

N = 16; 관심 분야 = {1}, {2,3}, {3,2}, {2}, {2,3}, {2,1}, {1,3}, {3} }, {3,1}, {1,2}, {2}, {2,3}, {2,3}, {3}, {2}];

출력 [ "friend_at (friend_at) \ n"] ++ [ "P (P)의 관심 (관심 [friend_at [P]) \ n" | p in POSITIONS ];

여기서 첫 번째의 많은 솔루션이 있습니다 : 여기

friend_at:[7, 15, 14, 16, 13, 12, 11, 9, 10, 8, 5, 4, 3, 2, 6, 1] 
p:1 interests:{1,3} 
p:2 interests:3..3 
p:3 interests:2..3 
p:4 interests:2..2 
p:5 interests:2..3 
p:6 interests:2..2 
p:7 interests:1..2 
p:8 interests:1..2 
p:9 interests:{1,3} 
p:10 interests:3..3 
p:11 interests:2..3 
p:12 interests:2..2 
p:13 interests:2..3 
p:14 interests:2..3 
p:15 interests:1..2 
p:16 interests:1..1 

하나가 확인할 수있다 적어도 하나의 공통 관심사 (첫 번째와 마지막 포함) 모든 이웃.