// // 仲良し、嫌いの入ったグループ分けを行う import jp.kobe_u.copris._ import jp.kobe_u.copris.dsl._ // 12人×4グループ val n_member = 12 val n_group = 4 val mem_of_grp = 3 // 1グループの人数 int(n_member / n_group) // 仲良しの組を入れる // 例えば 3 と 5 が仲良しなら // 'x(3,0) * 'x(5,0) + 'x(3,1) * 'x(5,1) + 'x(3,2) * 'x(5,2) + 'x(3,3) * 'x(5,3) === 1 def nakayoshi(ma:Int, mb:Int){ var lst = List[Term]() for (grp <- 0 until n_group){ lst :+= 'x(ma,grp) * 'x(mb,grp) } add( Add(lst) === 1 ) } // 嫌い同士の組を入れる // 例えば 4 と 6 が嫌いなら // 'x(4,0) * 'x(6,0) + 'x(4,1) * 'x(6,1) + 'x(4,2) * 'x(6,2) + 'x(4,3) * 'x(6,3) === 0 def kirai(ma:Int, mb:Int){ var lst = List[Term]() for (grp <- 0 until n_group){ lst :+= 'x(ma,grp) * 'x(mb,grp) } add( Add(lst) === 0 ) } // メイン・プログラム開始 init // メンバー×グループの変数を用意する for (mem <- 0 until n_member; grp <- 0 until n_group){ boolInt('x(mem, grp)) } // 各メンバーはどこかのグループに属する for( mem <- 0 until n_member ){ var lst = List[Term]() for( grp <- 0 until n_group ){ lst :+= 'x(mem,grp) } add( Add(lst) === 1 ) } // 1グループの人数は決まっている for( grp <- 0 until n_group ){ var lst = List[Term]() for( mem <- 0 until n_member ){ lst :+= 'x(mem,grp) } add( Add(lst) === mem_of_grp ) } // 仲良し nakayoshi( 1, 3 ) nakayoshi( 5, 7 ) nakayoshi( 9, 11 ) // 嫌い kirai( 0, 1 ) kirai( 4, 6 ) kirai( 8, 10 ) // 探せ〜 if( find ){ for( grp <- 0 until n_group ){ for( mem <- 0 until n_member ){ // 結果を得たいとき、変数を solution への引数として与えれば値が得られる. printf( "%d, ", solution('x(mem,grp) ) ) } println("") } } else { println( "no solution ..." ) }