CPLEXでC#のプログラム作成のチュートリアルを行う

CPLEXでは.netのC#のAPIがあり、そのチュートリアルがマニュアルに載っています。
このチュートリアルを実行してみます。

https://www.ibm.com/docs/ja/icos/20.1.0?topic=apis-concert-technology-netusers

* テスト環境
    * CPLEX 22.1.1
    * Microsoft Visual Studio Community 2022 Version 17.4.4
    * Windows 11 64bit

# プロジェクトの作成

Visual Studioを起動し、「ファイルメニュー」＿「新規作成」＿「プロジェクト」でプロジェクトを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ee9e1e13-854a-30df-3c46-b7b0fda13c49.png)

「C#コンソールアプリ」を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/faecd977-1aff-c5c3-9004-b6888062268a.png)

「プロジェクト名」に名前を入力します。ここでは「DietLesson」を入力しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6dce4729-7704-9b52-5a06-960f0b4b13e2.png)

「フレームワーク」に「.Net 7.0」を選んで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3bd67bb3-00ac-624c-1a60-2cecd8ddde1c.png)

デフォルトでできる「Program.cs」を削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/59036b62-9c8b-00e1-bf8c-c80fe4584637.png)

# CPLEXのDDLの参照設定
プロジェクトを選択し、「追加」＿「プロジェクト参照」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fa45f46a-ba57-4e41-c17c-de2bb8e9b301.png)

参照を選択し、「参照」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/be2fc956-c8c7-04f9-dd7c-46c6d3228056.png)

「C:\Program Files\IBM\ILOG\CPLEX_Studio2211\cplex\bin\x64_win64」から、
"ILOG.CPLEX.dll" "ILOG.Concert.dll" を選択し、「追加」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b3b233fd-dd3b-587a-09b1-9b1164b13b19.png)

「OK」で設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2e03be3f-3cde-a5c1-231b-b79d67faf429.png)

「依存関係」＿「アセンブリ」に「ILOG.CPLEX」、「 ILOG.Concert」が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/da27e7ab-0dbf-f175-17bd-5c928804bc1f.png)

# C#ファイルの追加
このチュートリアルでは以下の二つの.csを追加する必要があります。

DietLesson.cs：チュートリアルで編集するプログラムファイル
InputDataReader.cs：DietLessonから参照する.datファイル読み込みのプログラム

サンプルを導入したディレクトリからこれらのファイルを追加します。この例では「「C:\Users\dsuser1\Documents\IBM\ILOG\CPLEX_Studio2211\cplex\examples」です。


プロジェクトを選択し、「追加」＿「既存の項目」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/37656dc1-c14e-20a1-d3d5-9081b2d9ec64.png)


サンプルソースのある「C:\Users\dsuser1\Documents\IBM\ILOG\CPLEX_Studio2211\cplex\examples\src\cs」から「InputDataReader.cs」を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b39876aa-0102-a59d-6440-6160404187e7.png)

続いて同様にプロジェクトを選択し、「追加」＿「既存の項目」を選び、tutorialsのある「C:\Users\dsuser1\Documents\IBM\ILOG\CPLEX_Studio2211\cplex\examples\tutorials」（「InputDataReader.cs」と異なるディレクトリです）から「Dietlesson.cs」を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/43723980-f2f6-5aad-b2c1-6cd5c951d091.png)


「DietLesson.cs」と「InputDataReader.cs」が追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/82dd93f4-dffc-54d8-716e-2b4d68e573f4.png)

# チュートリアルの実行

「DietLesson.cs」を開きチュートリアルを実行していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f1be648b-d517-a656-fb1f-27b8f9186d63.png)

マニュアル各ステップにあるソースコードを対応するコメントの下にコピーしていきます。以下の例はステップ2のコードを貼り付けています。

https://www.ibm.com/docs/ja/icos/20.1.0?topic=netusers-step-2-open-file

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/18d07a16-011d-7200-6873-6828c81d01f4.png)

必ずしも上から下ではないので、Step ＃の番号をよく見て、Step2からStep18までをコピペしてください。

最終的なソースコードは以下になります。

https://github.com/hkwd/230404cplex/blob/master/230404cs_sample/Dietlesson.cs

# コンパイル
「ビルド」メニューから「ソリューションのビルドを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/dd330ad5-646d-e273-66b7-7de5307029e4.png)

出力のタブに「ビルド：成功１」がでたら成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8c11642e-e589-3ddc-21b8-e7ca18946af4.png)

プロジェクトを作成したディレクトリの下「Dietlesson\Dietlesson\bin\Debug\net7.0」に「Dietlesson.exe」がコンパイルされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a17b1fff-89ac-4da8-c895-82aa7bd8352e.png)

# テスト実行

コマンドプロンプトを開き、プロジェクトを作成したディレクトリの下にcdで移動し、exampleディレクトリにあるデータファイルdiet.datを指定して実行します。


```batch:テスト実行
cd C:\Users\dsuser1\Documents\cs\Dietlesson\Dietlesson\bin\Debug\net7.0

Dietlesson.exe -i C:\Users\dsuser1\Documents\IBM\ILOG\CPLEX_Studio2211\cplex\examples\data\diet.dat
```

```cmd:実行結果
C:\Users\dsuser1\Documents\cs\Dietlesson\Dietlesson\bin\Debug\net7.0>Dietlesson.exe -i C:\Users\dsuser1\Documents\IBM\ILOG\CPLEX_Studio2211\cplex\examples\data\diet.dat
Version identifier: 22.1.1.0 | 2022-11-27 | 9160aff4d
Tried aggregator 1 time.
Reduced MIP has 7 rows, 16 columns, and 65 nonzeros.
Reduced MIP has 0 binaries, 9 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.00 sec. (0.02 ticks)
Found incumbent of value 21.080000 after 0.00 sec. (0.08 ticks)
Tried aggregator 1 time.
Reduced MIP has 7 rows, 16 columns, and 65 nonzeros.
Reduced MIP has 0 binaries, 9 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.00 sec. (0.02 ticks)
MIP emphasis: balance optimality and feasibility.
MIP search method: dynamic search.
Parallel mode: deterministic, using up to 8 threads.
Root relaxation solution time = 0.00 sec. (0.02 ticks)

        Nodes                                         Cuts/
   Node  Left     Objective  IInf  Best Integer    Best Bound    ItCnt     Gap

*     0+    0                           21.0800        0.0000           100.00%
*     0+    0                           20.4800        0.0000           100.00%
      0     0       14.8557     3       20.4800       14.8557        5   27.46%
*     0+    0                           15.6200       14.8557             4.89%
      0     0       14.9349     5       15.6200       Cuts: 2        9    4.39%
*     0+    0                           15.2300       14.9349             1.94%
      0     0       14.9637     4       15.2300       Cuts: 2       12    1.75%
*     0+    0                           15.0500       14.9637             0.57%
      0     0       14.9650     5       15.0500      Fract: 1       13    0.56%
      0     0        cutoff             15.0500       15.0500       13    0.00%
Elapsed time = 0.03 sec. (0.50 ticks, tree = 0.01 MB, solutions = 5)

Zero-half cuts applied:  1
Gomory fractional cuts applied:  2

Root node processing (before b&c):
  Real time             =    0.03 sec. (0.50 ticks)
Parallel b&c, 8 threads:
  Real time             =    0.00 sec. (0.00 ticks)
  Sync time (average)   =    0.00 sec.
  Wait time (average)   =    0.00 sec.
                          ------------
Total (root+branch&cut) =    0.03 sec. (0.50 ticks)

Solution status = Optimal

 cost = 15.05
 Buy0 = 4
 Buy1 = 0
 Buy2 = 0
 Buy3 = 1
 Buy4 = -0
 Buy5 = 5
 Buy6 = 0
 Buy7 = 4
 Buy8 = 0
```