SPSS Modelerのみでマッチング最適化を実行する(SPSS Modeler データ加工逆引き9-21)

# SPSS Modelerのみでマッチング最適化を実行する

![スクリーンショット 2023-11-04 9.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fb29cefc-cd59-0e6a-d2ce-71a967c1127c.png)

組み合わせは40320通り（8 * 7 * 6 * 5 * 4 * 3 * 2 * 1）

この記事では組み合わせ総当たりを紹介します。CLPEXノード（最適化ソルバー）を利用する方法は逆引き9-22を参照ください。


この記事は2023年秋のSPSSユーザーイベントで扱われたModeler詰将棋①を題材にしています

https://www.ibm.com/blogs/solutions/jp-ja/smuc-2023-autumn/

## 1.想定される利用目的

・想定されるすべての組み合わせから最適解を求める
・想定されるすべての組み合わせから予測モデルによるシミュレーションを実行する

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/matching.str

## 3.サンプルストリームの説明

![スクリーンショット 2023-11-04 9.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/014ecc52-1f86-4d89-e397-6f8c9335b8a6.png)

a.入力するデータは以下の通りです。男性の座席1（M1）から座席8（M8）までに想定される組み合わせ40320通りがこの時点で作られています。
![スクリーンショット 2023-11-04 10.32.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/be2e1719-d273-f28d-0dfa-092e6f249724.png)

このテーブルの作成方法は次のとおりです。

スーパーノードの中でシンプルな1から8までの8行１列のデータをM1からM８まで作成します。
![スクリーンショット 2023-11-04 10.38.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/906acf96-6fe2-70a2-b1fd-17da36718ff3.png)

![スクリーンショット 2023-11-04 10.41.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0975c3e3-9ff9-b557-67bb-6159d9ec94e8.png)

レコード結合では重複がないように以下の条件を用います。

![スクリーンショット 2023-11-04 10.38.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/da5ed28c-1958-2e8e-c02e-37f38e9c660b.png)

接続時に崩れた列の順序を修正します。
![スクリーンショット 2023-11-04 10.50.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/87cab110-f3ce-3d91-efa5-0ae1fd5fe932.png)

b.[ソート]ノードを編集します。
![スクリーンショット 2023-11-04 10.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a217f2e2-ec49-586a-544f-f7c0827f2331.png)

c.[フィールド作成]ノードを編集します。逆引き4-1で紹介した連番を振ります。
![スクリーンショット 2023-11-04 10.56.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1b94d98e-f7c9-2d5e-17fe-66d35f787053.png)

[プレビュー]します。　パターンIDが割り当てられました。
![スクリーンショット 2023-11-04 10.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/54a6a3e6-d32e-1660-b5f8-713064ea5966.png)

d.マッチング対象となる女性の背番号データを入力します。
![スクリーンショット 2023-11-04 11.00.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ba4b44ed-44c8-7a3f-b2fd-e9586ba7eed9.png)

e.[レコード結合]ノードを編集します。[キー]結合を選択しますが、[キー]はブランクにして40320レコードに8名の女性IDを総当たりさせます。
![スクリーンショット 2023-11-04 11.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f842f88e-6828-054d-6bcf-137976264503.png)

[テーブル]を表示します。男性のパターンに女性8名の組み合わせテーブルができました。40320　＊　8 で３２2,560とおりの総当たりのパターンが成立しました。
![スクリーンショット 2023-11-04 11.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/699876d9-3549-92de-4ea0-2a6bb42b030f.png)

f.[フィールド作成]ノードを編集します。
![スクリーンショット 2023-11-04 16.57.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0a2bd75b-86a8-0b68-ee2d-095059866f5f.png)

g.[フィルター]ノードを編集します。
![スクリーンショット 2023-11-04 17.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ec3139ff-186e-735c-1a11-2550f1fe30ef.png)

[テーブル]を表示します。女性に対応する男性の編成ができました。
![スクリーンショット 2023-11-04 17.06.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3a17d318-8f3a-d27c-1fde-47e734fbf1fd.png)

h.男性の属性データを入力します。
![スクリーンショット 2023-11-04 17.07.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/67e7e49d-52f9-11cf-ef6c-0fda4b31bd03.png)

i.[レコード結合]ノードを編集します。
![スクリーンショット 2023-11-04 17.08.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2e26ab06-90eb-1d74-d94a-7a86ab504f64.png)

j.女性の属性データを入力します。
![スクリーンショット 2023-11-04 17.09.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fcabcb21-51d9-2721-f86d-01d979b67faf.png)

k.[レコード結合]ノードを編集します。
![スクリーンショット 2023-11-04 17.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0af60748-b797-68c2-5b09-af4f3fa6c646.png)

l.[ソート]ノードを編集します。
![スクリーンショット 2023-11-04 17.10.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/032efe41-a7ec-5928-7933-037aca91d107.png)

[テーブル]を表示します。このテーブルでPID毎にスコアを集計すれば最適化計算が可能になります。
![スクリーンショット 2023-11-04 17.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6f9ac7e6-4a48-dc91-9174-691baccaf0ae.png)

m.[フィールド作成]ノードを編集します。同一または隣接県に居住する制約フラグを作成しています。
![スクリーンショット 2023-11-04 17.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b1a46b16-3f09-6312-7dbf-6d226889fbd6.png)

n.[フィールド作成]ノードを編集します。季節の好みが一致すると2点スコアされるようにしています。
![スクリーンショット 2023-11-04 17.18.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6c6b6a5c-bb6b-ab27-6765-450f61cfa3e5.png)
　
o.[フィールド作成]ノードを編集します。季節の好みが正反対の場合にはペナルティとして1点減点されます。
![スクリーンショット 2023-11-04 17.18.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/18d1f4de-cf31-c452-6da2-d0b5ef00ee78.png)

p.[フィールド作成]ノードを編集します。制約条件として年齢差が3歳以内を満たすとフラグを立てます。
![スクリーンショット 2023-11-04 17.20.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c6626a74-a529-e614-e202-3d1f9c575c18.png)

q.[フィールド作成]ノードを編集します。年齢差を絶対値で求めています。
![スクリーンショット 2023-11-04 17.21.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/54873c54-927f-509a-c684-0757e10a2d99.png)

r.[レコード集計]ノードを編集します。パターンID毎に集計します。
![スクリーンショット 2023-11-04 17.22.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cf044659-14cc-f76e-7c8f-9f4408683a68.png)

S.[フィールド作成]ノードを編集します。nとoで求めた季節スコアを調整します。
![スクリーンショット 2023-11-04 17.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c384799c-49a1-fef1-3b77-1a8b9548750a.png)]

[プレビュー]します。
![スクリーンショット 2023-11-04 17.28.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/19f9bbaa-c372-157d-c9a1-915ee5774caf.png)

t.[条件抽出]ノードを編集します。制約条件を絞り込みます。
![スクリーンショット 2023-11-04 17.28.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5723ea01-d03a-a0f4-bdd7-66400530400b.png)

u.[ソート]ノードを編集します。年齢差が最小を優先した上で季節スコアが高いパターンを探します。
![スクリーンショット 2023-11-04 17.28.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/31fe5d18-fa2f-2966-ed22-b9b1e5ec4d48.png)

[プレビュー]します。最適なパターンが特定されました。セルをハイライトしたままメニューから条件抽出ノードを生成します。
![スクリーンショット 2023-11-04 17.29.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fd424bdd-9401-d38e-2619-f25db36eba1c.png)

v.[条件抽出]ノードを確認します。
![スクリーンショット 2023-11-04 17.29.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cf725d22-066e-819a-50e8-896435917e3d.png)

[テーブル]を実行します。

#### 注意事項

男性8名と女性8名でも組み合わせが32万通りになるため、20秒程度の処理時間が必要です。業務で想定されるような人数でマッチングを行うにはCLPEXのような最適化ソルバーが必要になります。逆引き9-22も参照ください。


## 4.参考情報

#### 通し番号の振り方を紹介した記事

https://qiita.com/416nishimaki/items/8cd1fc55261fd36a9013

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008