ソフト制約の記述  
   -外部制約をスマートに記述する

ハード制約では、制約文が Trueになるようにしましたが、ソフト制約では、エラーの数をカウントすることになります。つまり、ハード制約とソフト制約では真逆の記述になります。

一方、ソルバーの内部アルゴリズムは、

  1. カウントしたエラーを同じレベル同士(ソフト制約レベル)で集めます
  2. 各レベルでのエラー数総和を算出します
  3. 優先度の高いレベルから、エラー数総和の最小化を試みます
  4. それ以上エラー数を低く出来ないと判断したときに、そのときのエラー数以下という内部制約を保持したまま次の制約レベルに行きます。(3へ)

このアルゴリズムによって、優先度の高いソフト制約ほど、優先的にエラー数が極小化されることになります。

1. ソフト制約では、エラーの数をカウントする
   -できれば避けたい記述の例


例で見ていきましょう。

下で、準日禁止という制約を外部ソフト制約に置き換えてみます。


ハード制約のときは、エラー禁止だったので、

Jm禁止:$Inv($And(V));

だったのですがが、
ソフト制約にするには、エラーをカウントすることになるので、$Inv()が外れます。

for (スキル in スキルclass){//職能毎に
        for (person in スキル){//そのスキルに属する人について
                vector V;
                for (day in 全日){
                        if (day >=スケジュール開始日){
                        

                                V.clear();                              
                                V.push_back(X[person][day-1][J]);
                                V.push_back(X[person][day  ][N]);
                                Jm禁止Soft30:$And(V);

                        
                        }
                }
        }
}

これで、求解すると以下のようになります。o=xxは、エラーカウントです。最終的には、エラーが0になっていることが分かります。
ユーザレベル3.0となっているのが、ソフト制約レベルです。外部制約では、GUIでのソフト制約レベルとお互い干渉しないようになっています。
ソフト制約にするには、ラベル+2桁偶数の数字するとソフト制約になります。

制約 項目 内部レベル 備考
GUI 予定制約 X.5 Xは、1〜7の整数
(ただし、通常1は使いません)
列制約 X.3
行制約 X.1
外部制約 外部 X.A Xは、1〜9の整数、Aは偶数

従って、外部制約は、GUIでの制約対し、上位下位いずれも自由に設定可能です。Jm禁止Soft30は、ソフト制約レベル3.0にするという意味になります。




また、ソルバが生成したファイル交代3X7.pyをcygwin64上で走らせてみると、以下のようになります。

$ python3 交代3X7.py
Checking Jm禁止Soft30
Jm禁止Soft30 = 0

これは、ソフト制約Jm禁止Soft30の違反件数が0だったことを示しています。
このチェック関数ソースを見てみると延々と加算しています。ハード制約では、その場で禁止として制約してしまえばよかったものが、ソフト制約では、どの箇所がエラーになるかは予測できないので、延々と加算することになってしまう訳です。

def check_soft_constraint_Jm禁止Soft30(X):
        print('Checking Jm禁止Soft30')
        Total=0
        Total=Total+And(X[3][6][1],X[3][7][0])
        Total=Total+And(X[3][7][1],X[3][8][0])
        Total=Total+And(X[3][8][1],X[3][9][0])
        Total=Total+And(X[3][9][1],X[3][10][0])
        Total=Total+And(X[3][10][1],X[3][11][0])
        Total=Total+And(X[3][11][1],X[3][12][0])
        Total=Total+And(X[3][12][1],X[3][13][0])
        Total=Total+And(X[3][13][1],X[3][14][0])
        Total=Total+And(X[3][14][1],X[3][15][0])
        Total=Total+And(X[3][15][1],X[3][16][0])
        Total=Total+And(X[3][16][1],X[3][17][0])
        Total=Total+And(X[3][17][1],X[3][18][0])
        Total=Total+And(X[3][18][1],X[3][19][0])
        Total=Total+And(X[3][19][1],X[3][20][0])
        Total=Total+And(X[3][20][1],X[3][21][0])
        Total=Total+And(X[3][21][1],X[3][22][0])
        Total=Total+And(X[3][22][1],X[3][23][0])
        Total=Total+And(X[3][23][1],X[3][24][0])
        Total=Total+And(X[3][24][1],X[3][25][0])
        Total=Total+And(X[3][25][1],X[3][26][0])
        Total=Total+And(X[3][26][1],X[3][27][0])
        Total=Total+And(X[3][27][1],X[3][28][0])
        Total=Total+And(X[3][28][1],X[3][29][0])
        Total=Total+And(X[3][29][1],X[3][30][0])
        Total=Total+And(X[3][30][1],X[3][31][0])
        Total=Total+And(X[3][31][1],X[3][32][0])
        Total=Total+And(X[3][32][1],X[3][33][0])
        Total=Total+And(X[3][33][1],X[3][34][0])
        Total=Total+And(X[3][34][1],X[3][35][0])
        Total=Total+And(X[3][35][1],X[3][36][0])
        Total=Total+And(X[3][36][1],X[3][37][0])
        Total=Total+And(X[6][6][1],X[6][7][0])
        Total=Total+And(X[6][7][1],X[6][8][0])
        Total=Total+And(X[6][8][1],X[6][9][0])
        Total=Total+And(X[6][9][1],X[6][10][0])
        Total=Total+And(X[6][10][1],X[6][11][0])
        Total=Total+And(X[6][11][1],X[6][12][0])
        Total=Total+And(X[6][12][1],X[6][13][0])
        Total=Total+And(X[6][13][1],X[6][14][0])
        Total=Total+And(X[6][14][1],X[6][15][0])
        Total=Total+And(X[6][15][1],X[6][16][0])
        Total=Total+And(X[6][16][1],X[6][17][0])
        Total=Total+And(X[6][17][1],X[6][18][0])
        Total=Total+And(X[6][18][1],X[6][19][0])
        Total=Total+And(X[6][19][1],X[6][20][0])
        Total=Total+And(X[6][20][1],X[6][21][0])
        Total=Total+And(X[6][21][1],X[6][22][0])
        Total=Total+And(X[6][22][1],X[6][23][0])
        Total=Total+And(X[6][23][1],X[6][24][0])
        Total=Total+And(X[6][24][1],X[6][25][0])
        Total=Total+And(X[6][25][1],X[6][26][0])
        Total=Total+And(X[6][26][1],X[6][27][0])
        Total=Total+And(X[6][27][1],X[6][28][0])
        Total=Total+And(X[6][28][1],X[6][29][0])
        Total=Total+And(X[6][29][1],X[6][30][0])
        Total=Total+And(X[6][30][1],X[6][31][0])
        Total=Total+And(X[6][31][1],X[6][32][0])
        Total=Total+And(X[6][32][1],X[6][33][0])
        Total=Total+And(X[6][33][1],X[6][34][0])
        Total=Total+And(X[6][34][1],X[6][35][0])
        Total=Total+And(X[6][35][1],X[6][36][0])
        Total=Total+And(X[6][36][1],X[6][37][0])
        Total=Total+And(X[9][6][1],X[9][7][0])
        Total=Total+And(X[9][7][1],X[9][8][0])
        Total=Total+And(X[9][8][1],X[9][9][0])
        Total=Total+And(X[9][9][1],X[9][10][0])
        Total=Total+And(X[9][10][1],X[9][11][0])
        Total=Total+And(X[9][11][1],X[9][12][0])
        Total=Total+And(X[9][12][1],X[9][13][0])
        Total=Total+And(X[9][13][1],X[9][14][0])
        Total=Total+And(X[9][14][1],X[9][15][0])
        Total=Total+And(X[9][15][1],X[9][16][0])
        Total=Total+And(X[9][16][1],X[9][17][0])
        Total=Total+And(X[9][17][1],X[9][18][0])
        Total=Total+And(X[9][18][1],X[9][19][0])
        Total=Total+And(X[9][19][1],X[9][20][0])
        Total=Total+And(X[9][20][1],X[9][21][0])
        Total=Total+And(X[9][21][1],X[9][22][0])
        Total=Total+And(X[9][22][1],X[9][23][0])
        Total=Total+And(X[9][23][1],X[9][24][0])
        Total=Total+And(X[9][24][1],X[9][25][0])
        Total=Total+And(X[9][25][1],X[9][26][0])
        Total=Total+And(X[9][26][1],X[9][27][0])
        Total=Total+And(X[9][27][1],X[9][28][0])
        Total=Total+And(X[9][28][1],X[9][29][0])
        Total=Total+And(X[9][29][1],X[9][30][0])
        Total=Total+And(X[9][30][1],X[9][31][0])
        Total=Total+And(X[9][31][1],X[9][32][0])
        Total=Total+And(X[9][32][1],X[9][33][0])
        Total=Total+And(X[9][33][1],X[9][34][0])
        Total=Total+And(X[9][34][1],X[9][35][0])
        Total=Total+And(X[9][35][1],X[9][36][0])
        Total=Total+And(X[9][36][1],X[9][37][0])
        Total=Total+And(X[12][6][1],X[12][7][0])
        Total=Total+And(X[12][7][1],X[12][8][0])
        Total=Total+And(X[12][8][1],X[12][9][0])
        Total=Total+And(X[12][9][1],X[12][10][0])
        Total=Total+And(X[12][10][1],X[12][11][0])
        Total=Total+And(X[12][11][1],X[12][12][0])
        Total=Total+And(X[12][12][1],X[12][13][0])
        Total=Total+And(X[12][13][1],X[12][14][0])
        Total=Total+And(X[12][14][1],X[12][15][0])
        Total=Total+And(X[12][15][1],X[12][16][0])
        Total=Total+And(X[12][16][1],X[12][17][0])
        Total=Total+And(X[12][17][1],X[12][18][0])
        Total=Total+And(X[12][18][1],X[12][19][0])
        Total=Total+And(X[12][19][1],X[12][20][0])
        Total=Total+And(X[12][20][1],X[12][21][0])
        Total=Total+And(X[12][21][1],X[12][22][0])
        Total=Total+And(X[12][22][1],X[12][23][0])
        Total=Total+And(X[12][23][1],X[12][24][0])
        Total=Total+And(X[12][24][1],X[12][25][0])
        Total=Total+And(X[12][25][1],X[12][26][0])
        Total=Total+And(X[12][26][1],X[12][27][0])
        Total=Total+And(X[12][27][1],X[12][28][0])
        Total=Total+And(X[12][28][1],X[12][29][0])
        Total=Total+And(X[12][29][1],X[12][30][0])
        Total=Total+And(X[12][30][1],X[12][31][0])
        Total=Total+And(X[12][31][1],X[12][32][0])
        Total=Total+And(X[12][32][1],X[12][33][0])
        Total=Total+And(X[12][33][1],X[12][34][0])
        Total=Total+And(X[12][34][1],X[12][35][0])
        Total=Total+And(X[12][35][1],X[12][36][0])
        Total=Total+And(X[12][36][1],X[12][37][0])
        Total=Total+And(X[15][6][1],X[15][7][0])
        Total=Total+And(X[15][7][1],X[15][8][0])
        Total=Total+And(X[15][8][1],X[15][9][0])
        Total=Total+And(X[15][9][1],X[15][10][0])
        Total=Total+And(X[15][10][1],X[15][11][0])
        Total=Total+And(X[15][11][1],X[15][12][0])
        Total=Total+And(X[15][12][1],X[15][13][0])
        Total=Total+And(X[15][13][1],X[15][14][0])
        Total=Total+And(X[15][14][1],X[15][15][0])
        Total=Total+And(X[15][15][1],X[15][16][0])
        Total=Total+And(X[15][16][1],X[15][17][0])
        Total=Total+And(X[15][17][1],X[15][18][0])
        Total=Total+And(X[15][18][1],X[15][19][0])
        Total=Total+And(X[15][19][1],X[15][20][0])
        Total=Total+And(X[15][20][1],X[15][21][0])
        Total=Total+And(X[15][21][1],X[15][22][0])
        Total=Total+And(X[15][22][1],X[15][23][0])
        Total=Total+And(X[15][23][1],X[15][24][0])
        Total=Total+And(X[15][24][1],X[15][25][0])
        Total=Total+And(X[15][25][1],X[15][26][0])
        Total=Total+And(X[15][26][1],X[15][27][0])
        Total=Total+And(X[15][27][1],X[15][28][0])
        Total=Total+And(X[15][28][1],X[15][29][0])
        Total=Total+And(X[15][29][1],X[15][30][0])
        Total=Total+And(X[15][30][1],X[15][31][0])
        Total=Total+And(X[15][31][1],X[15][32][0])
        Total=Total+And(X[15][32][1],X[15][33][0])
        Total=Total+And(X[15][33][1],X[15][34][0])
        Total=Total+And(X[15][34][1],X[15][35][0])
        Total=Total+And(X[15][35][1],X[15][36][0])
        Total=Total+And(X[15][36][1],X[15][37][0])
        Total=Total+And(X[18][6][1],X[18][7][0])
        Total=Total+And(X[18][7][1],X[18][8][0])
        Total=Total+And(X[18][8][1],X[18][9][0])
        Total=Total+And(X[18][9][1],X[18][10][0])
        Total=Total+And(X[18][10][1],X[18][11][0])
        Total=Total+And(X[18][11][1],X[18][12][0])
        Total=Total+And(X[18][12][1],X[18][13][0])
        Total=Total+And(X[18][13][1],X[18][14][0])
        Total=Total+And(X[18][14][1],X[18][15][0])
        Total=Total+And(X[18][15][1],X[18][16][0])
        Total=Total+And(X[18][16][1],X[18][17][0])
        Total=Total+And(X[18][17][1],X[18][18][0])
        Total=Total+And(X[18][18][1],X[18][19][0])
        Total=Total+And(X[18][19][1],X[18][20][0])
        Total=Total+And(X[18][20][1],X[18][21][0])
        Total=Total+And(X[18][21][1],X[18][22][0])
        Total=Total+And(X[18][22][1],X[18][23][0])
        Total=Total+And(X[18][23][1],X[18][24][0])
        Total=Total+And(X[18][24][1],X[18][25][0])
        Total=Total+And(X[18][25][1],X[18][26][0])
        Total=Total+And(X[18][26][1],X[18][27][0])
        Total=Total+And(X[18][27][1],X[18][28][0])
        Total=Total+And(X[18][28][1],X[18][29][0])
        Total=Total+And(X[18][29][1],X[18][30][0])
        Total=Total+And(X[18][30][1],X[18][31][0])
        Total=Total+And(X[18][31][1],X[18][32][0])
        Total=Total+And(X[18][32][1],X[18][33][0])
        Total=Total+And(X[18][33][1],X[18][34][0])
        Total=Total+And(X[18][34][1],X[18][35][0])
        Total=Total+And(X[18][35][1],X[18][36][0])
        Total=Total+And(X[18][36][1],X[18][37][0])
        Total=Total+And(X[21][6][1],X[21][7][0])
        Total=Total+And(X[21][7][1],X[21][8][0])
        Total=Total+And(X[21][8][1],X[21][9][0])
        Total=Total+And(X[21][9][1],X[21][10][0])
        Total=Total+And(X[21][10][1],X[21][11][0])
        Total=Total+And(X[21][11][1],X[21][12][0])
        Total=Total+And(X[21][12][1],X[21][13][0])
        Total=Total+And(X[21][13][1],X[21][14][0])
        Total=Total+And(X[21][14][1],X[21][15][0])
        Total=Total+And(X[21][15][1],X[21][16][0])
        Total=Total+And(X[21][16][1],X[21][17][0])
        Total=Total+And(X[21][17][1],X[21][18][0])
        Total=Total+And(X[21][18][1],X[21][19][0])
        Total=Total+And(X[21][19][1],X[21][20][0])
        Total=Total+And(X[21][20][1],X[21][21][0])
        Total=Total+And(X[21][21][1],X[21][22][0])
        Total=Total+And(X[21][22][1],X[21][23][0])
        Total=Total+And(X[21][23][1],X[21][24][0])
        Total=Total+And(X[21][24][1],X[21][25][0])
        Total=Total+And(X[21][25][1],X[21][26][0])
        Total=Total+And(X[21][26][1],X[21][27][0])
        Total=Total+And(X[21][27][1],X[21][28][0])
        Total=Total+And(X[21][28][1],X[21][29][0])
        Total=Total+And(X[21][29][1],X[21][30][0])
        Total=Total+And(X[21][30][1],X[21][31][0])
        Total=Total+And(X[21][31][1],X[21][32][0])
        Total=Total+And(X[21][32][1],X[21][33][0])
        Total=Total+And(X[21][33][1],X[21][34][0])
        Total=Total+And(X[21][34][1],X[21][35][0])
        Total=Total+And(X[21][35][1],X[21][36][0])
        Total=Total+And(X[21][36][1],X[21][37][0])
        Total=Total+And(X[24][6][1],X[24][7][0])
        Total=Total+And(X[24][7][1],X[24][8][0])
        Total=Total+And(X[24][8][1],X[24][9][0])
        Total=Total+And(X[24][9][1],X[24][10][0])
        Total=Total+And(X[24][10][1],X[24][11][0])
        Total=Total+And(X[24][11][1],X[24][12][0])
        Total=Total+And(X[24][12][1],X[24][13][0])
        Total=Total+And(X[24][13][1],X[24][14][0])
        Total=Total+And(X[24][14][1],X[24][15][0])
        Total=Total+And(X[24][15][1],X[24][16][0])
        Total=Total+And(X[24][16][1],X[24][17][0])
        Total=Total+And(X[24][17][1],X[24][18][0])
        Total=Total+And(X[24][18][1],X[24][19][0])
        Total=Total+And(X[24][19][1],X[24][20][0])
        Total=Total+And(X[24][20][1],X[24][21][0])
        Total=Total+And(X[24][21][1],X[24][22][0])
        Total=Total+And(X[24][22][1],X[24][23][0])
        Total=Total+And(X[24][23][1],X[24][24][0])
        Total=Total+And(X[24][24][1],X[24][25][0])
        Total=Total+And(X[24][25][1],X[24][26][0])
        Total=Total+And(X[24][26][1],X[24][27][0])
        Total=Total+And(X[24][27][1],X[24][28][0])
        Total=Total+And(X[24][28][1],X[24][29][0])
        Total=Total+And(X[24][29][1],X[24][30][0])
        Total=Total+And(X[24][30][1],X[24][31][0])
        Total=Total+And(X[24][31][1],X[24][32][0])
        Total=Total+And(X[24][32][1],X[24][33][0])
        Total=Total+And(X[24][33][1],X[24][34][0])
        Total=Total+And(X[24][34][1],X[24][35][0])
        Total=Total+And(X[24][35][1],X[24][36][0])
        Total=Total+And(X[24][36][1],X[24][37][0])
        Total=Total+And(X[4][6][1],X[4][7][0])
        Total=Total+And(X[4][7][1],X[4][8][0])
        Total=Total+And(X[4][8][1],X[4][9][0])
        Total=Total+And(X[4][9][1],X[4][10][0])
        Total=Total+And(X[4][10][1],X[4][11][0])
        Total=Total+And(X[4][11][1],X[4][12][0])
        Total=Total+And(X[4][12][1],X[4][13][0])
        Total=Total+And(X[4][13][1],X[4][14][0])
        Total=Total+And(X[4][14][1],X[4][15][0])
        Total=Total+And(X[4][15][1],X[4][16][0])
        Total=Total+And(X[4][16][1],X[4][17][0])
        Total=Total+And(X[4][17][1],X[4][18][0])
        Total=Total+And(X[4][18][1],X[4][19][0])
        Total=Total+And(X[4][19][1],X[4][20][0])
        Total=Total+And(X[4][20][1],X[4][21][0])
        Total=Total+And(X[4][21][1],X[4][22][0])
        Total=Total+And(X[4][22][1],X[4][23][0])
        Total=Total+And(X[4][23][1],X[4][24][0])
        Total=Total+And(X[4][24][1],X[4][25][0])
        Total=Total+And(X[4][25][1],X[4][26][0])
        Total=Total+And(X[4][26][1],X[4][27][0])
        Total=Total+And(X[4][27][1],X[4][28][0])
        Total=Total+And(X[4][28][1],X[4][29][0])
        Total=Total+And(X[4][29][1],X[4][30][0])
        Total=Total+And(X[4][30][1],X[4][31][0])
        Total=Total+And(X[4][31][1],X[4][32][0])
        Total=Total+And(X[4][32][1],X[4][33][0])
        Total=Total+And(X[4][33][1],X[4][34][0])
        Total=Total+And(X[4][34][1],X[4][35][0])
        Total=Total+And(X[4][35][1],X[4][36][0])
        Total=Total+And(X[4][36][1],X[4][37][0])
        Total=Total+And(X[7][6][1],X[7][7][0])
        Total=Total+And(X[7][7][1],X[7][8][0])
        Total=Total+And(X[7][8][1],X[7][9][0])
        Total=Total+And(X[7][9][1],X[7][10][0])
        Total=Total+And(X[7][10][1],X[7][11][0])
        Total=Total+And(X[7][11][1],X[7][12][0])
        Total=Total+And(X[7][12][1],X[7][13][0])
        Total=Total+And(X[7][13][1],X[7][14][0])
        Total=Total+And(X[7][14][1],X[7][15][0])
        Total=Total+And(X[7][15][1],X[7][16][0])
        Total=Total+And(X[7][16][1],X[7][17][0])
        Total=Total+And(X[7][17][1],X[7][18][0])
        Total=Total+And(X[7][18][1],X[7][19][0])
        Total=Total+And(X[7][19][1],X[7][20][0])
        Total=Total+And(X[7][20][1],X[7][21][0])
        Total=Total+And(X[7][21][1],X[7][22][0])
        Total=Total+And(X[7][22][1],X[7][23][0])
        Total=Total+And(X[7][23][1],X[7][24][0])
        Total=Total+And(X[7][24][1],X[7][25][0])
        Total=Total+And(X[7][25][1],X[7][26][0])
        Total=Total+And(X[7][26][1],X[7][27][0])
        Total=Total+And(X[7][27][1],X[7][28][0])
        Total=Total+And(X[7][28][1],X[7][29][0])
        Total=Total+And(X[7][29][1],X[7][30][0])
        Total=Total+And(X[7][30][1],X[7][31][0])
        Total=Total+And(X[7][31][1],X[7][32][0])
        Total=Total+And(X[7][32][1],X[7][33][0])
        Total=Total+And(X[7][33][1],X[7][34][0])
        Total=Total+And(X[7][34][1],X[7][35][0])
        Total=Total+And(X[7][35][1],X[7][36][0])
        Total=Total+And(X[7][36][1],X[7][37][0])
        Total=Total+And(X[10][6][1],X[10][7][0])
        Total=Total+And(X[10][7][1],X[10][8][0])
        Total=Total+And(X[10][8][1],X[10][9][0])
        Total=Total+And(X[10][9][1],X[10][10][0])
        Total=Total+And(X[10][10][1],X[10][11][0])
        Total=Total+And(X[10][11][1],X[10][12][0])
        Total=Total+And(X[10][12][1],X[10][13][0])
        Total=Total+And(X[10][13][1],X[10][14][0])
        Total=Total+And(X[10][14][1],X[10][15][0])
        Total=Total+And(X[10][15][1],X[10][16][0])
        Total=Total+And(X[10][16][1],X[10][17][0])
        Total=Total+And(X[10][17][1],X[10][18][0])
        Total=Total+And(X[10][18][1],X[10][19][0])
        Total=Total+And(X[10][19][1],X[10][20][0])
        Total=Total+And(X[10][20][1],X[10][21][0])
        Total=Total+And(X[10][21][1],X[10][22][0])
        Total=Total+And(X[10][22][1],X[10][23][0])
        Total=Total+And(X[10][23][1],X[10][24][0])
        Total=Total+And(X[10][24][1],X[10][25][0])
        Total=Total+And(X[10][25][1],X[10][26][0])
        Total=Total+And(X[10][26][1],X[10][27][0])
        Total=Total+And(X[10][27][1],X[10][28][0])
        Total=Total+And(X[10][28][1],X[10][29][0])
        Total=Total+And(X[10][29][1],X[10][30][0])
        Total=Total+And(X[10][30][1],X[10][31][0])
        Total=Total+And(X[10][31][1],X[10][32][0])
        Total=Total+And(X[10][32][1],X[10][33][0])
        Total=Total+And(X[10][33][1],X[10][34][0])
        Total=Total+And(X[10][34][1],X[10][35][0])
        Total=Total+And(X[10][35][1],X[10][36][0])
        Total=Total+And(X[10][36][1],X[10][37][0])
        Total=Total+And(X[13][6][1],X[13][7][0])
        Total=Total+And(X[13][7][1],X[13][8][0])
        Total=Total+And(X[13][8][1],X[13][9][0])
        Total=Total+And(X[13][9][1],X[13][10][0])
        Total=Total+And(X[13][10][1],X[13][11][0])
        Total=Total+And(X[13][11][1],X[13][12][0])
        Total=Total+And(X[13][12][1],X[13][13][0])
        Total=Total+And(X[13][13][1],X[13][14][0])
        Total=Total+And(X[13][14][1],X[13][15][0])
        Total=Total+And(X[13][15][1],X[13][16][0])
        Total=Total+And(X[13][16][1],X[13][17][0])
        Total=Total+And(X[13][17][1],X[13][18][0])
        Total=Total+And(X[13][18][1],X[13][19][0])
        Total=Total+And(X[13][19][1],X[13][20][0])
        Total=Total+And(X[13][20][1],X[13][21][0])
        Total=Total+And(X[13][21][1],X[13][22][0])
        Total=Total+And(X[13][22][1],X[13][23][0])
        Total=Total+And(X[13][23][1],X[13][24][0])
        Total=Total+And(X[13][24][1],X[13][25][0])
        Total=Total+And(X[13][25][1],X[13][26][0])
        Total=Total+And(X[13][26][1],X[13][27][0])
        Total=Total+And(X[13][27][1],X[13][28][0])
        Total=Total+And(X[13][28][1],X[13][29][0])
        Total=Total+And(X[13][29][1],X[13][30][0])
        Total=Total+And(X[13][30][1],X[13][31][0])
        Total=Total+And(X[13][31][1],X[13][32][0])
        Total=Total+And(X[13][32][1],X[13][33][0])
        Total=Total+And(X[13][33][1],X[13][34][0])
        Total=Total+And(X[13][34][1],X[13][35][0])
        Total=Total+And(X[13][35][1],X[13][36][0])
        Total=Total+And(X[13][36][1],X[13][37][0])
        Total=Total+And(X[16][6][1],X[16][7][0])
        Total=Total+And(X[16][7][1],X[16][8][0])
        Total=Total+And(X[16][8][1],X[16][9][0])
        Total=Total+And(X[16][9][1],X[16][10][0])
        Total=Total+And(X[16][10][1],X[16][11][0])
        Total=Total+And(X[16][11][1],X[16][12][0])
        Total=Total+And(X[16][12][1],X[16][13][0])
        Total=Total+And(X[16][13][1],X[16][14][0])
        Total=Total+And(X[16][14][1],X[16][15][0])
        Total=Total+And(X[16][15][1],X[16][16][0])
        Total=Total+And(X[16][16][1],X[16][17][0])
        Total=Total+And(X[16][17][1],X[16][18][0])
        Total=Total+And(X[16][18][1],X[16][19][0])
        Total=Total+And(X[16][19][1],X[16][20][0])
        Total=Total+And(X[16][20][1],X[16][21][0])
        Total=Total+And(X[16][21][1],X[16][22][0])
        Total=Total+And(X[16][22][1],X[16][23][0])
        Total=Total+And(X[16][23][1],X[16][24][0])
        Total=Total+And(X[16][24][1],X[16][25][0])
        Total=Total+And(X[16][25][1],X[16][26][0])
        Total=Total+And(X[16][26][1],X[16][27][0])
        Total=Total+And(X[16][27][1],X[16][28][0])
        Total=Total+And(X[16][28][1],X[16][29][0])
        Total=Total+And(X[16][29][1],X[16][30][0])
        Total=Total+And(X[16][30][1],X[16][31][0])
        Total=Total+And(X[16][31][1],X[16][32][0])
        Total=Total+And(X[16][32][1],X[16][33][0])
        Total=Total+And(X[16][33][1],X[16][34][0])
        Total=Total+And(X[16][34][1],X[16][35][0])
        Total=Total+And(X[16][35][1],X[16][36][0])
        Total=Total+And(X[16][36][1],X[16][37][0])
        Total=Total+And(X[19][6][1],X[19][7][0])
        Total=Total+And(X[19][7][1],X[19][8][0])
        Total=Total+And(X[19][8][1],X[19][9][0])
        Total=Total+And(X[19][9][1],X[19][10][0])
        Total=Total+And(X[19][10][1],X[19][11][0])
        Total=Total+And(X[19][11][1],X[19][12][0])
        Total=Total+And(X[19][12][1],X[19][13][0])
        Total=Total+And(X[19][13][1],X[19][14][0])
        Total=Total+And(X[19][14][1],X[19][15][0])
        Total=Total+And(X[19][15][1],X[19][16][0])
        Total=Total+And(X[19][16][1],X[19][17][0])
        Total=Total+And(X[19][17][1],X[19][18][0])
        Total=Total+And(X[19][18][1],X[19][19][0])
        Total=Total+And(X[19][19][1],X[19][20][0])
        Total=Total+And(X[19][20][1],X[19][21][0])
        Total=Total+And(X[19][21][1],X[19][22][0])
        Total=Total+And(X[19][22][1],X[19][23][0])
        Total=Total+And(X[19][23][1],X[19][24][0])
        Total=Total+And(X[19][24][1],X[19][25][0])
        Total=Total+And(X[19][25][1],X[19][26][0])
        Total=Total+And(X[19][26][1],X[19][27][0])
        Total=Total+And(X[19][27][1],X[19][28][0])
        Total=Total+And(X[19][28][1],X[19][29][0])
        Total=Total+And(X[19][29][1],X[19][30][0])
        Total=Total+And(X[19][30][1],X[19][31][0])
        Total=Total+And(X[19][31][1],X[19][32][0])
        Total=Total+And(X[19][32][1],X[19][33][0])
        Total=Total+And(X[19][33][1],X[19][34][0])
        Total=Total+And(X[19][34][1],X[19][35][0])
        Total=Total+And(X[19][35][1],X[19][36][0])
        Total=Total+And(X[19][36][1],X[19][37][0])
        Total=Total+And(X[22][6][1],X[22][7][0])
        Total=Total+And(X[22][7][1],X[22][8][0])
        Total=Total+And(X[22][8][1],X[22][9][0])
        Total=Total+And(X[22][9][1],X[22][10][0])
        Total=Total+And(X[22][10][1],X[22][11][0])
        Total=Total+And(X[22][11][1],X[22][12][0])
        Total=Total+And(X[22][12][1],X[22][13][0])
        Total=Total+And(X[22][13][1],X[22][14][0])
        Total=Total+And(X[22][14][1],X[22][15][0])
        Total=Total+And(X[22][15][1],X[22][16][0])
        Total=Total+And(X[22][16][1],X[22][17][0])
        Total=Total+And(X[22][17][1],X[22][18][0])
        Total=Total+And(X[22][18][1],X[22][19][0])
        Total=Total+And(X[22][19][1],X[22][20][0])
        Total=Total+And(X[22][20][1],X[22][21][0])
        Total=Total+And(X[22][21][1],X[22][22][0])
        Total=Total+And(X[22][22][1],X[22][23][0])
        Total=Total+And(X[22][23][1],X[22][24][0])
        Total=Total+And(X[22][24][1],X[22][25][0])
        Total=Total+And(X[22][25][1],X[22][26][0])
        Total=Total+And(X[22][26][1],X[22][27][0])
        Total=Total+And(X[22][27][1],X[22][28][0])
        Total=Total+And(X[22][28][1],X[22][29][0])
        Total=Total+And(X[22][29][1],X[22][30][0])
        Total=Total+And(X[22][30][1],X[22][31][0])
        Total=Total+And(X[22][31][1],X[22][32][0])
        Total=Total+And(X[22][32][1],X[22][33][0])
        Total=Total+And(X[22][33][1],X[22][34][0])
        Total=Total+And(X[22][34][1],X[22][35][0])
        Total=Total+And(X[22][35][1],X[22][36][0])
        Total=Total+And(X[22][36][1],X[22][37][0])
        Total=Total+And(X[25][6][1],X[25][7][0])
        Total=Total+And(X[25][7][1],X[25][8][0])
        Total=Total+And(X[25][8][1],X[25][9][0])
        Total=Total+And(X[25][9][1],X[25][10][0])
        Total=Total+And(X[25][10][1],X[25][11][0])
        Total=Total+And(X[25][11][1],X[25][12][0])
        Total=Total+And(X[25][12][1],X[25][13][0])
        Total=Total+And(X[25][13][1],X[25][14][0])
        Total=Total+And(X[25][14][1],X[25][15][0])
        Total=Total+And(X[25][15][1],X[25][16][0])
        Total=Total+And(X[25][16][1],X[25][17][0])
        Total=Total+And(X[25][17][1],X[25][18][0])
        Total=Total+And(X[25][18][1],X[25][19][0])
        Total=Total+And(X[25][19][1],X[25][20][0])
        Total=Total+And(X[25][20][1],X[25][21][0])
        Total=Total+And(X[25][21][1],X[25][22][0])
        Total=Total+And(X[25][22][1],X[25][23][0])
        Total=Total+And(X[25][23][1],X[25][24][0])
        Total=Total+And(X[25][24][1],X[25][25][0])
        Total=Total+And(X[25][25][1],X[25][26][0])
        Total=Total+And(X[25][26][1],X[25][27][0])
        Total=Total+And(X[25][27][1],X[25][28][0])
        Total=Total+And(X[25][28][1],X[25][29][0])
        Total=Total+And(X[25][29][1],X[25][30][0])
        Total=Total+And(X[25][30][1],X[25][31][0])
        Total=Total+And(X[25][31][1],X[25][32][0])
        Total=Total+And(X[25][32][1],X[25][33][0])
        Total=Total+And(X[25][33][1],X[25][34][0])
        Total=Total+And(X[25][34][1],X[25][35][0])
        Total=Total+And(X[25][35][1],X[25][36][0])
        Total=Total+And(X[25][36][1],X[25][37][0])
        Total=Total+And(X[2][6][1],X[2][7][0])
        Total=Total+And(X[2][7][1],X[2][8][0])
        Total=Total+And(X[2][8][1],X[2][9][0])
        Total=Total+And(X[2][9][1],X[2][10][0])
        Total=Total+And(X[2][10][1],X[2][11][0])
        Total=Total+And(X[2][11][1],X[2][12][0])
        Total=Total+And(X[2][12][1],X[2][13][0])
        Total=Total+And(X[2][13][1],X[2][14][0])
        Total=Total+And(X[2][14][1],X[2][15][0])
        Total=Total+And(X[2][15][1],X[2][16][0])
        Total=Total+And(X[2][16][1],X[2][17][0])
        Total=Total+And(X[2][17][1],X[2][18][0])
        Total=Total+And(X[2][18][1],X[2][19][0])
        Total=Total+And(X[2][19][1],X[2][20][0])
        Total=Total+And(X[2][20][1],X[2][21][0])
        Total=Total+And(X[2][21][1],X[2][22][0])
        Total=Total+And(X[2][22][1],X[2][23][0])
        Total=Total+And(X[2][23][1],X[2][24][0])
        Total=Total+And(X[2][24][1],X[2][25][0])
        Total=Total+And(X[2][25][1],X[2][26][0])
        Total=Total+And(X[2][26][1],X[2][27][0])
        Total=Total+And(X[2][27][1],X[2][28][0])
        Total=Total+And(X[2][28][1],X[2][29][0])
        Total=Total+And(X[2][29][1],X[2][30][0])
        Total=Total+And(X[2][30][1],X[2][31][0])
        Total=Total+And(X[2][31][1],X[2][32][0])
        Total=Total+And(X[2][32][1],X[2][33][0])
        Total=Total+And(X[2][33][1],X[2][34][0])
        Total=Total+And(X[2][34][1],X[2][35][0])
        Total=Total+And(X[2][35][1],X[2][36][0])
        Total=Total+And(X[2][36][1],X[2][37][0])
        Total=Total+And(X[5][6][1],X[5][7][0])
        Total=Total+And(X[5][7][1],X[5][8][0])
        Total=Total+And(X[5][8][1],X[5][9][0])
        Total=Total+And(X[5][9][1],X[5][10][0])
        Total=Total+And(X[5][10][1],X[5][11][0])
        Total=Total+And(X[5][11][1],X[5][12][0])
        Total=Total+And(X[5][12][1],X[5][13][0])
        Total=Total+And(X[5][13][1],X[5][14][0])
        Total=Total+And(X[5][14][1],X[5][15][0])
        Total=Total+And(X[5][15][1],X[5][16][0])
        Total=Total+And(X[5][16][1],X[5][17][0])
        Total=Total+And(X[5][17][1],X[5][18][0])
        Total=Total+And(X[5][18][1],X[5][19][0])
        Total=Total+And(X[5][19][1],X[5][20][0])
        Total=Total+And(X[5][20][1],X[5][21][0])
        Total=Total+And(X[5][21][1],X[5][22][0])
        Total=Total+And(X[5][22][1],X[5][23][0])
        Total=Total+And(X[5][23][1],X[5][24][0])
        Total=Total+And(X[5][24][1],X[5][25][0])
        Total=Total+And(X[5][25][1],X[5][26][0])
        Total=Total+And(X[5][26][1],X[5][27][0])
        Total=Total+And(X[5][27][1],X[5][28][0])
        Total=Total+And(X[5][28][1],X[5][29][0])
        Total=Total+And(X[5][29][1],X[5][30][0])
        Total=Total+And(X[5][30][1],X[5][31][0])
        Total=Total+And(X[5][31][1],X[5][32][0])
        Total=Total+And(X[5][32][1],X[5][33][0])
        Total=Total+And(X[5][33][1],X[5][34][0])
        Total=Total+And(X[5][34][1],X[5][35][0])
        Total=Total+And(X[5][35][1],X[5][36][0])
        Total=Total+And(X[5][36][1],X[5][37][0])
        Total=Total+And(X[8][6][1],X[8][7][0])
        Total=Total+And(X[8][7][1],X[8][8][0])
        Total=Total+And(X[8][8][1],X[8][9][0])
        Total=Total+And(X[8][9][1],X[8][10][0])
        Total=Total+And(X[8][10][1],X[8][11][0])
        Total=Total+And(X[8][11][1],X[8][12][0])
        Total=Total+And(X[8][12][1],X[8][13][0])
        Total=Total+And(X[8][13][1],X[8][14][0])
        Total=Total+And(X[8][14][1],X[8][15][0])
        Total=Total+And(X[8][15][1],X[8][16][0])
        Total=Total+And(X[8][16][1],X[8][17][0])
        Total=Total+And(X[8][17][1],X[8][18][0])
        Total=Total+And(X[8][18][1],X[8][19][0])
        Total=Total+And(X[8][19][1],X[8][20][0])
        Total=Total+And(X[8][20][1],X[8][21][0])
        Total=Total+And(X[8][21][1],X[8][22][0])
        Total=Total+And(X[8][22][1],X[8][23][0])
        Total=Total+And(X[8][23][1],X[8][24][0])
        Total=Total+And(X[8][24][1],X[8][25][0])
        Total=Total+And(X[8][25][1],X[8][26][0])
        Total=Total+And(X[8][26][1],X[8][27][0])
        Total=Total+And(X[8][27][1],X[8][28][0])
        Total=Total+And(X[8][28][1],X[8][29][0])
        Total=Total+And(X[8][29][1],X[8][30][0])
        Total=Total+And(X[8][30][1],X[8][31][0])
        Total=Total+And(X[8][31][1],X[8][32][0])
        Total=Total+And(X[8][32][1],X[8][33][0])
        Total=Total+And(X[8][33][1],X[8][34][0])
        Total=Total+And(X[8][34][1],X[8][35][0])
        Total=Total+And(X[8][35][1],X[8][36][0])
        Total=Total+And(X[8][36][1],X[8][37][0])
        Total=Total+And(X[11][6][1],X[11][7][0])
        Total=Total+And(X[11][7][1],X[11][8][0])
        Total=Total+And(X[11][8][1],X[11][9][0])
        Total=Total+And(X[11][9][1],X[11][10][0])
        Total=Total+And(X[11][10][1],X[11][11][0])
        Total=Total+And(X[11][11][1],X[11][12][0])
        Total=Total+And(X[11][12][1],X[11][13][0])
        Total=Total+And(X[11][13][1],X[11][14][0])
        Total=Total+And(X[11][14][1],X[11][15][0])
        Total=Total+And(X[11][15][1],X[11][16][0])
        Total=Total+And(X[11][16][1],X[11][17][0])
        Total=Total+And(X[11][17][1],X[11][18][0])
        Total=Total+And(X[11][18][1],X[11][19][0])
        Total=Total+And(X[11][19][1],X[11][20][0])
        Total=Total+And(X[11][20][1],X[11][21][0])
        Total=Total+And(X[11][21][1],X[11][22][0])
        Total=Total+And(X[11][22][1],X[11][23][0])
        Total=Total+And(X[11][23][1],X[11][24][0])
        Total=Total+And(X[11][24][1],X[11][25][0])
        Total=Total+And(X[11][25][1],X[11][26][0])
        Total=Total+And(X[11][26][1],X[11][27][0])
        Total=Total+And(X[11][27][1],X[11][28][0])
        Total=Total+And(X[11][28][1],X[11][29][0])
        Total=Total+And(X[11][29][1],X[11][30][0])
        Total=Total+And(X[11][30][1],X[11][31][0])
        Total=Total+And(X[11][31][1],X[11][32][0])
        Total=Total+And(X[11][32][1],X[11][33][0])
        Total=Total+And(X[11][33][1],X[11][34][0])
        Total=Total+And(X[11][34][1],X[11][35][0])
        Total=Total+And(X[11][35][1],X[11][36][0])
        Total=Total+And(X[11][36][1],X[11][37][0])
        Total=Total+And(X[14][6][1],X[14][7][0])
        Total=Total+And(X[14][7][1],X[14][8][0])
        Total=Total+And(X[14][8][1],X[14][9][0])
        Total=Total+And(X[14][9][1],X[14][10][0])
        Total=Total+And(X[14][10][1],X[14][11][0])
        Total=Total+And(X[14][11][1],X[14][12][0])
        Total=Total+And(X[14][12][1],X[14][13][0])
        Total=Total+And(X[14][13][1],X[14][14][0])
        Total=Total+And(X[14][14][1],X[14][15][0])
        Total=Total+And(X[14][15][1],X[14][16][0])
        Total=Total+And(X[14][16][1],X[14][17][0])
        Total=Total+And(X[14][17][1],X[14][18][0])
        Total=Total+And(X[14][18][1],X[14][19][0])
        Total=Total+And(X[14][19][1],X[14][20][0])
        Total=Total+And(X[14][20][1],X[14][21][0])
        Total=Total+And(X[14][21][1],X[14][22][0])
        Total=Total+And(X[14][22][1],X[14][23][0])
        Total=Total+And(X[14][23][1],X[14][24][0])
        Total=Total+And(X[14][24][1],X[14][25][0])
        Total=Total+And(X[14][25][1],X[14][26][0])
        Total=Total+And(X[14][26][1],X[14][27][0])
        Total=Total+And(X[14][27][1],X[14][28][0])
        Total=Total+And(X[14][28][1],X[14][29][0])
        Total=Total+And(X[14][29][1],X[14][30][0])
        Total=Total+And(X[14][30][1],X[14][31][0])
        Total=Total+And(X[14][31][1],X[14][32][0])
        Total=Total+And(X[14][32][1],X[14][33][0])
        Total=Total+And(X[14][33][1],X[14][34][0])
        Total=Total+And(X[14][34][1],X[14][35][0])
        Total=Total+And(X[14][35][1],X[14][36][0])
        Total=Total+And(X[14][36][1],X[14][37][0])
        Total=Total+And(X[17][6][1],X[17][7][0])
        Total=Total+And(X[17][7][1],X[17][8][0])
        Total=Total+And(X[17][8][1],X[17][9][0])
        Total=Total+And(X[17][9][1],X[17][10][0])
        Total=Total+And(X[17][10][1],X[17][11][0])
        Total=Total+And(X[17][11][1],X[17][12][0])
        Total=Total+And(X[17][12][1],X[17][13][0])
        Total=Total+And(X[17][13][1],X[17][14][0])
        Total=Total+And(X[17][14][1],X[17][15][0])
        Total=Total+And(X[17][15][1],X[17][16][0])
        Total=Total+And(X[17][16][1],X[17][17][0])
        Total=Total+And(X[17][17][1],X[17][18][0])
        Total=Total+And(X[17][18][1],X[17][19][0])
        Total=Total+And(X[17][19][1],X[17][20][0])
        Total=Total+And(X[17][20][1],X[17][21][0])
        Total=Total+And(X[17][21][1],X[17][22][0])
        Total=Total+And(X[17][22][1],X[17][23][0])
        Total=Total+And(X[17][23][1],X[17][24][0])
        Total=Total+And(X[17][24][1],X[17][25][0])
        Total=Total+And(X[17][25][1],X[17][26][0])
        Total=Total+And(X[17][26][1],X[17][27][0])
        Total=Total+And(X[17][27][1],X[17][28][0])
        Total=Total+And(X[17][28][1],X[17][29][0])
        Total=Total+And(X[17][29][1],X[17][30][0])
        Total=Total+And(X[17][30][1],X[17][31][0])
        Total=Total+And(X[17][31][1],X[17][32][0])
        Total=Total+And(X[17][32][1],X[17][33][0])
        Total=Total+And(X[17][33][1],X[17][34][0])
        Total=Total+And(X[17][34][1],X[17][35][0])
        Total=Total+And(X[17][35][1],X[17][36][0])
        Total=Total+And(X[17][36][1],X[17][37][0])
        Total=Total+And(X[20][6][1],X[20][7][0])
        Total=Total+And(X[20][7][1],X[20][8][0])
        Total=Total+And(X[20][8][1],X[20][9][0])
        Total=Total+And(X[20][9][1],X[20][10][0])
        Total=Total+And(X[20][10][1],X[20][11][0])
        Total=Total+And(X[20][11][1],X[20][12][0])
        Total=Total+And(X[20][12][1],X[20][13][0])
        Total=Total+And(X[20][13][1],X[20][14][0])
        Total=Total+And(X[20][14][1],X[20][15][0])
        Total=Total+And(X[20][15][1],X[20][16][0])
        Total=Total+And(X[20][16][1],X[20][17][0])
        Total=Total+And(X[20][17][1],X[20][18][0])
        Total=Total+And(X[20][18][1],X[20][19][0])
        Total=Total+And(X[20][19][1],X[20][20][0])
        Total=Total+And(X[20][20][1],X[20][21][0])
        Total=Total+And(X[20][21][1],X[20][22][0])
        Total=Total+And(X[20][22][1],X[20][23][0])
        Total=Total+And(X[20][23][1],X[20][24][0])
        Total=Total+And(X[20][24][1],X[20][25][0])
        Total=Total+And(X[20][25][1],X[20][26][0])
        Total=Total+And(X[20][26][1],X[20][27][0])
        Total=Total+And(X[20][27][1],X[20][28][0])
        Total=Total+And(X[20][28][1],X[20][29][0])
        Total=Total+And(X[20][29][1],X[20][30][0])
        Total=Total+And(X[20][30][1],X[20][31][0])
        Total=Total+And(X[20][31][1],X[20][32][0])
        Total=Total+And(X[20][32][1],X[20][33][0])
        Total=Total+And(X[20][33][1],X[20][34][0])
        Total=Total+And(X[20][34][1],X[20][35][0])
        Total=Total+And(X[20][35][1],X[20][36][0])
        Total=Total+And(X[20][36][1],X[20][37][0])
        Total=Total+And(X[23][6][1],X[23][7][0])
        Total=Total+And(X[23][7][1],X[23][8][0])
        Total=Total+And(X[23][8][1],X[23][9][0])
        Total=Total+And(X[23][9][1],X[23][10][0])
        Total=Total+And(X[23][10][1],X[23][11][0])
        Total=Total+And(X[23][11][1],X[23][12][0])
        Total=Total+And(X[23][12][1],X[23][13][0])
        Total=Total+And(X[23][13][1],X[23][14][0])
        Total=Total+And(X[23][14][1],X[23][15][0])
        Total=Total+And(X[23][15][1],X[23][16][0])
        Total=Total+And(X[23][16][1],X[23][17][0])
        Total=Total+And(X[23][17][1],X[23][18][0])
        Total=Total+And(X[23][18][1],X[23][19][0])
        Total=Total+And(X[23][19][1],X[23][20][0])
        Total=Total+And(X[23][20][1],X[23][21][0])
        Total=Total+And(X[23][21][1],X[23][22][0])
        Total=Total+And(X[23][22][1],X[23][23][0])
        Total=Total+And(X[23][23][1],X[23][24][0])
        Total=Total+And(X[23][24][1],X[23][25][0])
        Total=Total+And(X[23][25][1],X[23][26][0])
        Total=Total+And(X[23][26][1],X[23][27][0])
        Total=Total+And(X[23][27][1],X[23][28][0])
        Total=Total+And(X[23][28][1],X[23][29][0])
        Total=Total+And(X[23][29][1],X[23][30][0])
        Total=Total+And(X[23][30][1],X[23][31][0])
        Total=Total+And(X[23][31][1],X[23][32][0])
        Total=Total+And(X[23][32][1],X[23][33][0])
        Total=Total+And(X[23][33][1],X[23][34][0])
        Total=Total+And(X[23][34][1],X[23][35][0])
        Total=Total+And(X[23][35][1],X[23][36][0])
        Total=Total+And(X[23][36][1],X[23][37][0])
        print('Jm禁止Soft30','=',Total)
}

ソフトウェア上の加算器は、メモリを消費するので、大量の加算は性能上できれば避けたいところです。

2. ソフト制約では、エラーの数をカウントする
   -好ましい記述の例

1人の人だけが全部エラーというのはありえないし、寧ろ、各スタッフがエラーを公平に分担するべきもの、というのがGUI上の求解の設定項目の一つになっています。同じ考えで、

1人あたりの許容エラー数を設定し、それを超えない範囲でエラー最小化を行う

ように書いてみたのが次です。

for (スキル in スキルclass){//職能毎に
        for (person in スキル){//そのスキルに属する人について
                vector V,Vday;
                for (day in 全日){
                        if (day >=スケジュール開始日){
                        
                                Vday.clear();
                                Vday.push_back(X[person][day-1][J]);
                                Vday.push_back(X[person][day  ][N]);
                                V.push_back($And(Vday));

                        
                        }
                }
                Jm禁止Soft30:$SeqError(0,0,1,V);//一人当たりの許容エラー数を1に設定
        }
}

この求解は次のようになります。$SeqError=$SeqLE関数+許容エラー数の項目が増えた関数です。1番目、2番目のパラメータは、同じです。3番目のパラメータが許容値になります。戻り値は、min/max設定に対して、超えた分だけエラーとして出力されます。
ソルバは、同じレベルの制約のエラーを集め、総和が最初になるように探索します。


このようにすると、各$SeqErrorが返すのは、高々1個です。それに対してスタッフ人数24人分の総和の最小をソルバは求めればよい訳ですから、前の記述に比べてソルバの負担は大分減ることになります。

$ python3 交代3X8.py

で結果を確認しました。

3. GUIソフト制約-外部制約 混在の例


夜勤勤務回数を外部制約に置き換えるためにソフト制約レベル1に設定します。

次のような例を作成しました。


GUIのソフト制約は、青部4に設定しました。


さらに、青部列制約も置き換えてみます。



ソフトエラーが出ないと例題にならないために、ランダムの予定を入力しました。(ハード制約にしています。)




外部制約ソースは次です。


for (スキル in スキルclass){//職能毎に
	for (person in スキル){//そのスキルに属する人について
		vector V,Vday;
		for (day in 全日){
			if (day >=スケジュール開始日){
			
				Vday.clear();
				Vday.push_back(X[person][day-1][J]);
				Vday.push_back(X[person][day  ][N]);
				V.push_back($And(Vday));
				
			
			}
		}
		Jm禁止Soft30:$SeqError(0,0,1,V);//一人当たりの許容エラー数を1に設定
	}
}

for (スキル in スキルclass){//職能毎に
	for (person in スキル){//そのスキルに属する人について
		vector Va;
		for (day in 全日){
			if (day >=スケジュール開始日){
			
				
				vector Vs;
				for (shift in a){
					Vs.push_back(X[person][day][shift]);
				}
				Va.push_back($Or(Vs));
			
			}
		}
		a8希望32:$SeqError(0,8,1,Va);//8回希望 1個のエラーを許容->最大9回
	}
}

//列制約
for (day in 全日){
	if (day >=スケジュール開始日){
		vector VN;
		for (person in 全スタッフ){
			VN.push_back(X[person][day  ][N]);
		}
			
		
		if (day in 診療日){
			平日日勤者数34:   $SeqError(14,0,1,VN);//13人Min.希望14人
		}
	}
}

求解すると、次のようにソフトエラーが発生します。


当然、優先レベルが低いほど、エラーが出易くなります。
生成したpython ソースを走らせると、次のように、上の画面のo=数とスクリプトが解から計算した値が一致しています。
理屈的には、o<=xx という制約で解が存在した、ということですから、実際のエラーの個数は下回る可能性こそあれ、上回ることはないはずです。

$ python3 交代3X9.py
Checking Jm禁止Soft30
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Jm禁止Soft30 = 18
Checking a8希望32
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
a8希望32 = 0
Checking 平日日勤者数34
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
Pass.
平日日勤者数34 = 0

エラー数に関しては、試行の度に変わります。筆者の環境下では、最下位のレベルでは、常にエラーが出る状態、下位から2番目のレベルでもエラーが出るときがありました。この様子は、当然お使いのPCでも違ってくると思います。上と様子が違うときは、タイムアウト時間で調節が可能ですのでタイムアウト値をいじってみてください。


ソフト制約に関しては、スキャン中のタイムアウト がタイムアウト値になります。様子を見るには、10秒ー20秒程度でよいと思います。最終解として、気合を入れてエラー数を極小にしたいときは、60sec程度位にしています。

制約レベルを変えてみるとエラーの出方が変わるので、どういうパラメータが支配的かが体感できると思います。




[Prev] [Next] [Index] [Home]