人為変数や二段階を不要とする 実数型simplex法の解き方の 提案と検証 環境都市デザイン工学科 6番 鎌倉勇輝 15番 中平歩 指導教員 竹内光生 研究の背景と目的 背景 本研究では、2段階単体法の人為変数や2段階なしの1段階 の解法を提案している。 2段階単体法はピボット選択が常に列・行の順であるが、提案 する解法では等式・逆式は行・列の順としている。 この方法は、2変数問題については提案済みであるが、多変 数問題にも適用できるかの実証がないと指摘をうけている。 目的 昨年示した2変数問題について提案simplex法の再検証を行う。 多変数問題に対応するためのプログラミングの作成をする。 2変数問題と同様に人為変数を追加しなくても解けることを、 巡回問題や人員配置問題など多変数問題を用いて検証する。 プログラミングの特徴 特徴 • 従来の2段階単体法や図解法を 用いることなく、巡回問題や多変 数問題が簡単な操作で解ける • Fortranプログラムを用いる • 最小化問題に対応している • 等式、逆式、順式の順番で解く • 逆式の段階で実行可能解の有 無の判定可能 図1.提案simplex法の流れ図 提案simplex法のfortranプログラム 生産計画問題(3変数) 問)ある工場で4種類の原料A,B,C,Dを用いて、3種類の製品 Ⅰ,Ⅱ,Ⅲを生産する。利益が最大となる組み合わせを求めよ。 原料の 使用可能量 C:7kg A 80kg B 50kg A:5kg D 70kg C 100kg C:15kg A:6kg D:11kg D:3kg B:8kg B:2kg 製品Ⅰ(70万円) 製品Ⅲ(30万円) 製品Ⅱ(120万円) 定式化(数式を使って表現) 変数の決定 →各製品Ⅰ,Ⅱ,Ⅲの生産量をx1,x2,x3とおく 目的関数 総利益はZ=70x1+120x2+30x3(万円) 制約条件式(原料の使用可能量を超えない) 原料A:5x1 原料B: +6x3≦80 2x2+8x3≦50 原料C:7x1 +15x3≦100 原料D:3x1+11x2 生産量は0以上 x1≧0,x2≧0,x3≧0 ≦70 テキストにデータ入力 Max Z= 70x1+120x2+30x3 最小化問題にする! Mini Z= -70x1-120x2-30x3 ファイル名:seisan_in.txt 3,4 変数の数と ←制約条件式の数 0,-70,-120,-30 ←目的関数 Subject to 5x1+6x3≦80 80,5,0,6 2x2+8x3≦50 50,0,2,8 7x1+15x3≦100 100,7,0,15 3x1+11x2≦70 70,3,11,0 And x1≧0,x2≧0,x3≧0 1,1,1,1 ←制約条件式 ←制約条件式の順式、 等式、逆式の判断 ≦(順式):1 ,=(等式):0 , ≧(逆式):-1 プログラムでの処理 ②上書き保存 ③コンパイル ④実行 ①プログラムのファイル名を変える 入力データ:seisan_in.txt 出力結果:seisan_out.txt 出力結果 ファイル名: seisan_out.txt データ入力した値→ 制約条件式のMUKIを示す→ ≦(順式) → 1 ピボット選択・操作2回→ 答え. <各製品の生産量> 製品Ⅰ:X( 1)= 14.286≒14.3kg 製品Ⅱ:X( 2)= 2.468≒2.5g 製品Ⅲ:X( 3)= 0kg <最大の利益> Z= 1296.104≒1296万円 3 variables 4 constraints 0.000 -70.000 -120.000 -30.000 80.000 5.000 0.000 6.000 50.000 0.000 2.000 8.000 100.000 7.000 0.000 15.000 70.000 3.000 11.000 0.000 Inequality sign 1 1 1 0.000 -70.000 -120.000 80.000 5.000 0.000 50.000 0.000 2.000 100.000 7.000 0.000 70.000 3.000 11.000 1 -30.000 0.000 0.000 0.000 0.000 6.000 1.000 0.000 0.000 0.000 8.000 0.000 1.000 0.000 0.000 15.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 763.636 80.000 37.273 100.000 6.364 -37.273 0.000 -30.000 0.000 0.000 0.000 10.909 5.000 0.000 6.000 1.000 0.000 0.000 0.000 -0.545 0.000 8.000 0.000 1.000 0.000 -0.182 7.000 0.000 15.000 0.000 0.000 1.000 0.000 0.273 1.000 0.000 0.000 0.000 0.000 0.091 1296.104 8.571 45.065 14.286 2.468 0.000 0.000 49.870 0.000 0.000 5.325 10.909 0.000 0.000 -4.714 1.000 0.000 -0.714 0.000 0.000 0.000 9.169 0.000 1.000 0.078 -0.182 1.000 0.000 2.143 0.000 0.000 0.143 0.000 0.000 1.000 -0.584 0.000 0.000 -0.039 0.091 Calculation Feasible Result X( 1)= 14.286 X( 2)= 2.468 X( 3)= 0.000 Z= 1296.104 ←問題の答え 人員配置問題(24変数) 問1)シカゴ校外の北東有料道路の料金所は、24時間に以下の 人員を必要とする。料金所の人間は4時間働き、1時間休み、又4 時間働く。何時から働いてもよい。雇う人数の最少を求めたい。 表4.各時間内での必要とする人員 時間 必要とする人員 0時から午前6時 2 午前6時から10時 8 午前10時から正午 4 正午から午後16時 3 午後16時から18時 6 午後18時から22時 5 午後22時から24時 3 変数の決定 X1 = 真夜中から働く人の数 X2 = 午前1時から働く人の数 X3 = 午前2時から働く人の数 ・ ・ ・ X23 = 午後10時から働く人の数 X24 = 午後11時から働く人の数 問題の定式化 Minimize Subject to 制約行 x1 0~1 1 1~2 1 1 2~3 1 1 3~4 1 4~5 x2 And1 1 x3 x4 x5 1 1 1 1 1 1 Z=x1+x2+x3+ ・・・ +x24 x1+x17+x18+x19+x20+x22+x23+x24≧2 : 0~1時は2人 xx61+xx72+xx818+x +xx11 +x23x14 +xx15 : 1~2時は2人 x9 19 x10 x12 x16 x17 x18 x19 x20 x21 x22 x23 20+x 21x13 24≧2 1 1 1 1 1 1 ・・・ 1 1 1 1 1 x16+x17+x18+x19+x21+x22+x23+x24≧3 : 23~24時は3人 1 1 1 1 1 1 1 1 x1~x24≧0 制約行1 x1 x2 1 x3 1 x4 1 x5 1 x6 5~6 0~1 1 6~7 1 1 1 1 1 1~2 1 1 7~82~3 1 1 1 1 1 1 1 1 8~93~4 1 1 1 1 1 1 1 1 1 4~5 1 1 1 1 9~10 1 1 1 1 5~6 1 1 1 1 1 10~11 1 1 1 1 6~7 1 1 1 1 1 11~12 1 1 1 7~8 1 1 1 1 1 8~9 1 1 1 1 1 12~13 1 1 9~10 1 1 1 1 13~14 1 10~11 1 1 1 1 14~15 11~12 1 1 1 15~16 12~13 1 1 13~14 1 16~17 14~15 17~18 15~16 18~19 16~17 17~18 19~20 18~19 20~21 19~20 21~22 20~21 22~23 21~22 22~23 23~24 23~24 1 x7 x8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 11 1 1 1 1 1 x24 -1 制限 1 ≧ 2 1 ≧ 2 1 ≧ 2 ≧ 2 ≧ 2 1 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x221 x231 x24 1 -1 ≧制限 2 1 1 1 1 1 1 1 ≧ 2 1 1 ≧ 8 1 1 1 1 1 1 ≧ 2 1 1 1 1 1 1 ≧ ≧ 2 8 1 1 1 1 ≧ ≧ 2 8 1 1 1 1 1 ≧ ≧ 2 8 1 1 1 1 1 ≧ 2 1 1 1 ≧ 4 1 1 ≧ 8 1 1 1 1 1 ≧ ≧ 8 4 1 1 ≧ ≧ 8 3 1 1 1 1 1 ≧ 8 1 1 1 1 1 ≧ 3 1 1 1 ≧ 4 1 1 11 11 1 1 1 1 ≧ ≧ 4 3 1 11 11 11 1 1 1 1 ≧ ≧ 3 3 1 1 1 1 1 ≧ ≧ 3 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ≧ 3 1 1 1 1 1 1 1 1 ≧ 6 1 1 1 1 1 1 1 ≧ 3 11 11 1 11 1 1 1 1 1 11 11 ≧ ≧ 6 5 1 1 11 1 11 11 ≧ ≧ 6 5 11 11 1 1 1 1 1 1 1 1 1 1 1 ≧ ≧ 5 1 1 1 1 1 1 1 1 5 1 1 1 1 1 1 1 1 ≧ 5 1 1 1 1 1 1 1 1 ≧ 1 1 1 1 1 1 1 1 ≧ 5 5 1 1 1 11 11 11 1 11 1 1 1 1 ≧ ≧ 5 3 1 11 11 11 1 1 1 1 1 1 1 1 1 ≧ ≧ 3 3 1 1 1 1 1 1 1 1 ≧ 3 プログラム結果 x1 0 x2 4 x3 1 x4 1 x5 1 x6 1 x7 1 x8 0 x9 0 x10 0 x11 0 x12 0 x13 0.5 x14 0.75 x15 1.75 x16 1.75 x17 1.75 x18 0.25 x19 0 x20 0 x21 0 x22 0 x23 0 x24 0 雇う人数の最少:Z=15.75人 Excel表を用いて、 小数解を整数解に 処理すると… x1 0 x2 4 x3 1 x4 1 x5 1 x6 1 x7 1 x8 0 x9 0 x10 0 x11 0 x12 0 x13 0 x14 1 x15 1 x16 2 x17 2 x18 1 x19 0 x20 0 x21 0 x22 0 x23 0 x24 0 雇う人数の最少: Z=16人 巡回問題の概要 巡回問題とは? → 定まった順序で永久に 回り続ける問題のことである。 概要 ・最適解がある。(Blandの規則) ・巡回し、最適解に至らない。 なぜ、巡回問題を検証するのか? → 多変数問題にも適用できるのか という指摘があったので、多変数 問題の事例の1つとして検証。 提案simplex法 (1)最適解が得られる。 (2)巡回する。 (3)最適解・巡回現象が得られない。 検証事例問題 ・H.W.Kuhnの巡回問題 ・V.Chvatalの巡回問題 提案simplex法の評価。 (1)→◎ (2)→○従来の解法の代替解法である (3)→×提案としてはダメである H.W.kuhnの巡回問題(7変数,3つの等式) Minimize z=-2X4-3X5+X6+12X7 Subject to X1-2X4-9X5+X6+9X7=0 X2+(1.0/3.0)X4+X5-(1.0/3.0)X6-2X7=0 X3+2X4+3X5-X6-12X7=2 And (X1, X2, X3, X4, X5, X6, X7)≧0 プログラム入力データ 7,3 0,0,0,0,-2,-3,1,12 0,1,0,0,-2,-9,1,9 0,0,1,0,0.333333,1,-0.333333,-2 2,0,0,1,2,3,-1,-12 0,0,0 H.W.Kuhnの巡回問題の解析 H.W.Kuhnの巡回問題 提案simplex法 (1)最適解が得られる。 (2)巡回する。 (3)最適解・巡回現象が得られない。 提案simplex法の評価。 (1)→◎ (2)→○従来の解法の代替解法である。 (3)→×提案としてはダメである 解析結果 7 variables 3 constraints 0.000 0.000 0.000 0.000 -2.000 -3.000 1.000 12.000 0.000 1.000 0.000 0.000 -2.000 -9.000 1.000 9.000 0.000 0.000 1.000 0.000 0.333 1.000 -0.333 -2.000 2.000 0.000 0.000 1.000 2.000 3.000 -1.000 -12.000 Inequality sign 0 0 0 0.000 0.000 0.000 2.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 -2.000 -3.000 1.000 12.000 0.000 -2.000 -9.000 1.000 9.000 0.000 0.333 1.000 -0.333 -2.000 1.000 2.000 3.000 -1.000 -12.000 0.000 0.000 0.000 2.000 0.000 3.000 0.000 -1.000 0.000 0.000 6.000 1.000 9.000 0.000 1.000 0.000 -2.000 -9.000 0.000 1.000 0.000 0.333 1.000 -0.333 -2.000 0.000 -3.000 1.000 1.000 0.000 -0.000 -6.000 0.000 1.000 12.000 0.000 0.000 0.000 -2.000 -3.000 0.000 1.000 9.000 0.000 1.000 0.000 -2.000 -9.000 0.000 -0.333 -2.000 0.000 0.000 1.000 0.333 1.000 2.000 -1.000 -12.000 1.000 0.000 0.000 2.000 3.000 0.000 -0.000 6.000 0.000 0.000 -2.000 -9.000 0.000 0.000 -0.333 -2.000 0.000 2.000 0.000 -6.000 1.000 0.000 3.000 -1.000 1.000 9.000 1.000 0.000 1.000 0.333 0.000 -3.000 1.000 0.000 0.000 1.000 0.000 0.000 -2.000 -3.000 0.000 1.000 12.000 0.000 0.000 0.000 -2.000 -9.000 0.000 1.000 9.000 1.000 0.000 0.000 0.333 1.000 0.000 -0.333 -2.000 0.000 1.000 2.000 2.000 3.000 1.000 -1.000 -12.000 0.000 0.000 0.000 -1.000 0.000 0.000 -0.000 6.000 0.000 3.000 0.000 1.000 0.000 0.000 -2.000 -9.000 1.000 9.000 0.000 0.333 1.000 0.000 -0.333 -2.000 0.000 1.000 2.000 1.000 0.000 1.000 0.000 -6.000 0.000 -3.000 0.000 0.000 0.000 2.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000 0.000 ????? Not Solved ????? 0.000 -2.000 -3.000 1.000 12.000 0.000 -2.000 -9.000 1.000 9.000 0.000 0.333 1.000 -0.333 -2.000 1.000 2.000 3.000 -1.000 -12.000 誤差値入力 Minimize Z=-2X4-3X5+X6+12X7 Subject to X1-2X4-9X5+X6+9X7=0 X2+(1.0/3.0)X4+X5-(1.0/3.0)X6-2X7=0 X3+2X4+3X5-X6-12X7=2 And (X1, X2, X3, X4, X5, X6, X7)≧0 プログラム入力データ 7,3 0,0,0,0,-2,-3,1,12 0,1,0,0,-2,-9,1,9 0,0,1,0,0.333333,1,-0.333333,-2 2,0,0,1,2,3,-1,-12 0,0,0 プログラム入力データ 7,3 0,0,0,0,-2,-3,1,12 0.00001,1,0,0,-2,-9,1,9 0,0,1,0,0.333333,1,-0.333333,-2 2,0,0,1,2,3,-1,-12 0,0,0 誤差値入力解析 解析結果 H.W.Kuhnの巡回問題 提案simplex法 (1)最適解が得られる。 (2)巡回する。 (3)最適解・巡回現象が得られない。 提案simplex法の評価。 (1)→◎最適解が得られる解法である。 (2)→○従来の解法の代替解法である。 (3)→×提案としてはダメである 最適解 x1=2.0,x2=0,x3=0 x4=2.0,x5=0,x6=2.0,x7=0 Z=2.0 7 variables 3 constraints 0.000 0.000 0.000 0.000 -2.000 -3.000 1.000 12.000 0.000 1.000 0.000 0.000 -2.000 -9.000 1.000 9.000 0.000 0.000 1.000 0.000 0.333 1.000 -0.333 -2.000 2.000 0.000 0.000 1.000 2.000 3.000 -1.000 -12.000 Inequality sign 0 0 0 0.000 0.000 0.000 2.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 2.000 0.000 3.000 0.000 -1.000 0.000 0.000 6.000 1.000 9.000 0.000 1.000 0.000 -2.000 -9.000 0.000 1.000 0.000 0.333 1.000 -0.333 -2.000 0.000 -3.000 1.000 1.000 0.000 -0.000 -6.000 0.000 0.000 0.000 2.000 0.000 6.000 0.000 0.000 3.000 -1.000 -0.000 1.000 6.000 0.000 0.000 -3.000 -1.000 -3.000 0.000 3.000 0.000 1.000 3.000 -1.000 -6.000 0.000 -6.000 1.000 0.000 -3.000 1.000 0.000 2.000 2.000 2.000 2.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 -6.000 0.000 -3.000 0.000 -3.000 1.000 1.000 -0.000 0.000 -6.000 0.000 -6.000 1.000 0.000 -3.000 1.000 0.000 Calculation Feasible Result X( 1)= 2.000 X( 2)= 0.000 X( 3)= 0.000 X( 4)= 2.000 X( 5)= 0.000 X( 6)= 2.000 X( 7)= 0.000 Z= 2.000 0.000 -2.000 -3.000 1.000 12.000 0.000 -2.000 -9.000 1.000 9.000 0.000 0.333 1.000 -0.333 -2.000 1.000 2.000 3.000 -1.000 -12.000 Chvatalの巡回問題の例(4変数,3つの順式) Minimize Z=-10x1+57x2+9x3+24x4 Subject to -0.5x1-5.5x2-2.5x3-9x4≦0 0.5x1-1.5x2-0.5x3+x4 ≦0 x1≦1 And (x1,x2,x3,x4)≧0 プログラム入力データ 4,3 0,-10,57,9,24 0,0.5,-5.5,-2.5,9 0,0.5,-1.5,-0.5,1 1,1,0,0,0 1,1,1 Chvatalの巡回問題の解析 Chvatalの巡回問題 提案simplex法 (1)最適解が得られる。 (2)巡回する。 (3)最適解・巡回現象が得られない。 提案simplex法の評価。 (1)→◎ (2)→○従来の解法の代替解法である。 (3)→×提案としてはダメである 解析結果 4 variables 3 constraints 0.000 -10.000 57.000 9.000 0.000 0.500 -5.500 -2.500 0.000 0.500 -1.500 -0.500 1.000 1.000 0.000 0.000 Inequality sign 1 1 24.000 9.000 1.000 0.000 1 0.000 -10.000 57.000 9.000 24.000 0.000 0.000 0.000 0.000 0.500 -5.500 -2.500 9.000 1.000 0.000 0.000 0.000 0.500 -1.500 -0.500 1.000 0.000 1.000 0.000 1.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 -53.000 -41.000 204.000 20.000 0.000 0.000 1.000 -11.000 -5.000 18.000 2.000 0.000 0.000 0.000 4.000 2.000 -8.000 -1.000 1.000 0.000 0.000 11.000 5.000 -18.000 -2.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 -14.500 98.000 6.750 13.250 0.000 0.000 0.500 -4.000 -0.750 2.750 0.000 1.000 0.500 -2.000 -0.250 0.250 0.000 0.000 -0.500 4.000 0.750 -2.750 1.000 0.000 29.000 0.000 0.000 0.000 2.000 0.000 1.000 0.000 -1.000 1.000 0.000 1.000 1.000 0.000 0.000 -18.000 -15.000 93.000 0.000 -8.000 -1.500 5.500 0.000 2.000 0.500 -2.500 0.000 0.000 0.000 0.000 1.000 0.000 20.000 9.000 0.000 0.000 -10.500 70.500 0.000 0.000 -2.000 4.000 1.000 0.000 0.500 -4.500 0.000 0.000 -0.500 0.500 0.000 1.000 0.250 -1.250 0.000 1.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 -22.000 93.000 21.000 0.000 0.000 -24.000 0.000 0.000 -4.000 8.000 2.000 0.000 1.000 -9.000 0.000 0.000 0.500 -1.500 -0.500 1.000 0.000 1.000 0.000 1.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 -10.000 57.000 9.000 24.000 0.000 0.000 0.000 0.000 0.500 -5.500 -2.500 9.000 1.000 0.000 0.000 0.000 0.500 -1.500 -0.500 1.000 0.000 1.000 0.000 1.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 ????? Not Solved ????? 誤差値入力 Minimize Z=-10x1+57x2+9x3+24x4 Subject to -0.5x1-5.5x2-2.5x3-9x4≦0 0.5x1-1.5x2-0.5x3+x4 ≦0 x1≦1 And プログラム入力データ 4,3 0,-10,57,9,24 0,0.5,-5.5,-2.5,9 0,0.5,-1.5,-0.5,1 1,1,0,0,0 1,1,1 (x1,x2,x3,x4)≧0 プログラム入力データ 4,3 0,-10,57,9,24 0.00001,0.5,-5.5,-2.5,9 0,0.5,-1.5,-0.5,1 1,1,0,0,0 1,1,1 Chvatalの巡回問題の誤差値入力解析 Chvatalの巡回問題 解析結果 (1)最適解が得られる。 4 variables 3 constraints 0.000 -10.000 57.000 9.000 0.000 0.500 -5.500 -2.500 0.000 0.500 -1.500 -0.500 1.000 1.000 0.000 0.000 (2)巡回する。 Inequality sign 1 1 提案simplex法 (3)最適解・巡回現象が得られない。 提案simplex法の評価。 (1)→◎最適解が得られる解法である。 (2)→○従来の解法の代替解法である。 (3)→×提案としてはダメである 最適解 x1=1.0, x2=0,x3=1.0,x4=0 Z=1.0 24.000 9.000 1.000 0.000 1 0.000 -10.000 57.000 9.000 24.000 0.000 0.000 0.000 0.000 0.500 -5.500 -2.500 9.000 1.000 0.000 0.000 0.000 0.500 -1.500 -0.500 1.000 0.000 1.000 0.000 1.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 27.000 -1.000 44.000 0.000 20.000 0.000 0.000 -4.000 -2.000 8.000 1.000 -1.000 0.000 1.000 -3.000 -1.000 2.000 0.000 2.000 0.000 0.000 3.000 1.000 -2.000 0.000 -2.000 1.000 1.000 2.000 1.000 1.000 0.000 30.000 0.000 42.000 0.000 18.000 1.000 0.000 2.000 0.000 4.000 1.000 -5.000 2.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 3.000 1.000 -2.000 0.000 -2.000 1.000 Calculation Feasible Result X( 1)= 1.000 X( 2)= 0.000 X( 3)= 1.000 X( 4)= 0.000 Z= 1.000 提案simplex法の概要 • • • • まとめ 人為変数や二段階不要 等式、逆式、順式の順に解く 等式、逆式は、行・列の順でピボット選択するべき 逆式の段階で実行可能解の有無の判定可能 提案simplex法の検証(任意変数問題) • • • • • • • • FORTRANプログラムの作成 OK 生産計画問題(3変数) OK 輸送問題①(起点2、終点3、計6変数問題) OK 輸送問題②(起点3、終点5、計15変数問題) OK 人員配置問題 (全員8h常勤、0~23時各勤務開始24変数問題) OK 人員配置問題(8h常勤3人および4h勤務アルバイト雇用27変数問題) OK H.W.Kuhn(ハロルド・クーン)の巡回問題 OK Chvatal(フバータル)の巡回問題 OK • 提案simplex法で、上記の2変数~27変数問題の最適解が得られた。 本報告は、多変数問題に拡張し、提案simplex法の事例検証を行った。 • 今後は、その他の事例検証および事例検証以外の検証方法(プログラムの公開によ る検証)が必要と考えている。 • 非・整数・線形計画法が得意とする組み合わせ最適化問題の社会現象は多いと思わ れる。本報告が提案する単純な解き方が問題解決の一助となれば幸いである。 ご清聴ありがとうございました。
© Copyright 2024 ExpyDoc