数学科と連携した
情報の授業実践について
令和 4年 度全 国高等学 校情報 教育研究 会
東京 都 立新宿山 吹高等学校
中山享司

東京都⽴新宿⼭吹⾼等学校 中⼭享司

1

これからお話しすること
l授業計画
l数理最適化とはlこんなところで使われていますl（計画に即して）問題
l数学科との連携
lアプリ作ってみました
l結びの言葉
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 2

l授業計画l数理最適化とはlこんなところで使われていますl（計画に即して）問題
l数学科との連携
lアプリ作ってみました
l結びの言葉
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 3

指導計画について（３）コンピュータとプログラミング（１）情報社会の問題解決（ア）問題を発⾒・解決する⽅法

4（ア）コンピュータのしくみと処理

3（イ）法・情報セキュリティ・情報モラル

4（イ）アルゴリズムとプログラム

8（ウ）情報技術と情報社会

4（ウ）モデル化とシミュレーション

5（２）コミュニケーションと情報デザイン（４）情報通信ネットワークとデータの活⽤（ア）メディアとコミュニケーション

4（ア）ネットワークのしくみと構成要素

4（イ）情報デザインと役割

2（イ）データベースの仕組みと活⽤

5（ウ）コミュニケーションと情報デザイン

6（ウ）データの収集と傾向の可視化

7（できるだけ）毎回５～１０分程度、プログラムの指導に充てたい→（３）の指導の効率化を目指す

ここでの実施を想定「情報Ⅰ」ミニマムモデルより

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 4

授業計画
l全３時間を（ひとまず）想定
時間

内容

ねらい

１

数理最適化とは︖線形計画法の紹介、実装少ない変数の題材をモデル化できるようにする

２

複数の式での解法、ナップサック問題

制約条件が複雑になった題材をモデル化できる
題材をもとに、⾃らモデルを構築できるようになる

３

外部ファイルを使った解法（主婦問題）

コンピュータの特性を活かして、条件が多数ある題材でもモデルを構築することができるようになる

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 5

l授業計画l数理最適化とはlこんなところで使われていますl（計画に即して）問題
l数学科との連携
lアプリ作ってみました
l結びの言葉
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 6

数理最適化とは
l現実の問題を数式（数理モデル）として定義
l制約条件を満たしつつlコストの最小化や利益が最大化されるような変数の値を求める手法
こんなことに使われています

数式で表したものを目的関数という商品の配置最適化
店員のシフトスケジューリング
列車の乗務員スケジューリング
生産計画の作成など

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 7

こんな会話ありませんか？
数式モデルって数学ができな
いとわからないんだよね。
数学苦⼿だから嫌だな〜

何か宇宙と交信している感
じだよね〜勉強しても結局役に⽴たなさそうだよね〜

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 8

この世は喝︕︕

l数理最適化だらけなんです。
l数理最適化で世の中は成り立っているんですよ！？

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 9

l授業計画l数理最適化とはlこんなところで使われていますl（計画に即して）問題
l数学科との連携
lアプリ作ってみました
l結びの言葉
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 10

たとえば１l宅配業者の宅配・集荷業務
⾞に積める荷物の量は決まっています
宅配をしながら集荷をしたいです。
（できれば）何度も同じ道を通りたくありません
どのようなルートが⼀番効率がいいでしょうか︖

数理最適化で解決可能効率化が図れるのはいいことだわ
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 11

やるわね～たとえば２lアルバイトのシフト問題
従業員ごとに、出勤できる曜⽇・時間が決まっている
従業員ごとに、専⾨の業務がある
その⽇ごとに、必要な従業員数が違う
Ｋ⽥くんがいる⽇はいいけど、他の⽇は弱い︕対策を︕

⼈件費の問題もある
ので、⼀筋縄ではいかないですよ〜
https://www.msiism.jp/article/jrs-shiftscheduling.html
東京都⽴新宿⼭吹⾼等学校 情報科

数理最適化で解決可能そうなのね～

私の⽣活にもつながっているのね
Takashi Nakayama© 12

たとえば3l配車計画
週末はなかなかタクシーがつかまらない
呼んでも待ち時間が⻑い

数理最適化で解決可能

需要予測（機械学習）もしている配⾞の最適化（待ち時間を全体で最適・最短にする）
すごいわ～
便利なサービスの中には数理最適化があるのね
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 13

l授業計画l数理最適化とはlこんなところで使われていますl（計画に即して）問題
l数学科との連携
lアプリ作ってみました
l結びの言葉
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 14例題
lx+yが最大となるxとyのそれぞれ浮動小数点と整数の組み合わせを求めよ＜条件＞
x≧0,y ≧0
2x+y ≦5x+2y ≦4
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 15

まずは!pip install pulp

解答例
ライブラリのインストール（グーグルドライブは必須）

from pulp import *pulpというライブラリに⼊っている関数やクラスを全て使える

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 16

解答例

プログラムの実装

problem = LpProblem('simple_problem', LpMaximize)

x = LpVariable('x')
y = LpVariable('y')# 変数の定義
カンマで区切って、cat=“Integer”と⼊れると整数で定義される

problem += x + y# 問題の定義# ⽬的関数（これを最⼤化したい）

problem += -1*x + 3 >= yproblem += -1/2*x +2 >= y

# 制約条件の定義

右辺のyに係数がつくとエラー

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 17

プログラムの実装
lstatus = problem.solve()
lprint(LpStatus[status])
lprint("x:",x.value())
lprint("y:",y.value())

解答例
解けたらoptimal（最適）と表⽰
このコード⾃体は使いまわせば良い
結果の表⽰

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 18

指導のポイントlコードはl問題の定義l変数の定義l目的関数の定義
l制約条件の定義

何を最⼤化（最⼩化）したいのか（⽬的関数は何か）と制約条件は何かを考えさせる＝定式化・・・を記述する。

l書き方として・・・
l目的関数は式１
problem += x + y となっているのに対して
式１
式２（⽚⽅は定数でも良い）
l制約条件はproblem += -1*x + 3 >= yとなっているところに注意
等式でつなぐ
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 19指導のポイント
lなんで線形計画法をやるんですか？
→身の回りのことを抽象化（モデル化）できるようにする
lこの時にモデル化された数式の解法が線形計画法（基礎的なので取っ掛かりやすい）l意外とたくさんのことが解決できる！
lどのように抽象化したら良いのかを検討
l基本的な手法で広範囲の問題を解決できる
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 20食事問題問題）食品A,B,Cの３種類を組み合わせて摂取する。
栄養素摂取量を満たした上で，食費を最小限にできる摂取量を求める。
●食品
・食品A：価格=20, 栄養素1=22, 栄養素2=20, 栄養素3=10
・食品B：価格=12, 栄養素1=13, 栄養素2=30, 栄養素3=5
・食品C：価格=18, 栄養素1=17, 栄養素2=5, 栄養素3=12●必要な栄養素摂取量
・栄養素１：200
・栄養素２：200
・栄養素３：100
https://www.y-shinno.com/pulp-intro/より

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 21

プログラムの実装

解答例

problem = LpProblem(‘syokuji', LpMinimize)
A = LpVariable(name = "A", lowBound = 0, cat="Integer")
B = LpVariable(name = "B", lowBound = 0, cat="Integer")

価格の最⼩値を求める# lowBound
変数の下限値catで変数の種
C = LpVariable(name = "C", lowBound = 0, cat="Integer") #類を宣⾔。

problem += 20*A + 12*B + 18*C
problem += 22*A + 13*B + 17*C >= 200

Integer＝整数# ここを隠して、⽬的関数と制約条件を考えさせる

problem += 20*A + 30*B + 5*C >= 200
problem += 10*A + 5*B + 12*C >= 100

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 22ナップサック問題問題）様々な冒険を経て宝島に辿り着いたあなたは、そこにある全ての宝をリュックに入れて持ち帰ろうとしました。しかし残念ながら、リュックには65kgまでしか宝を詰めることが出来ないため、うまくお宝を選びながら利益が最大になるような組み合わせを考える必要があります。
ここではそれぞれのお宝は無限にあるとします
宝島のお宝
宝0 : value0 = 105万円 / weight0 = 10kg
宝1 : value1 = 140万円 / weight1 = 13kg
宝2 : value2 = 65万円 / weight2 = 6kg
宝3 : value3 = 90万円 / weight3 = 11kg
宝4 : value4 = 220万円 / weight4 = 20kg

利益が最⼤になるように、お宝をリュックに詰めたい︕

宝5 : value5 = 170万円 / weight5 = 18kg
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 23

指導のポイントl目的関数、制約条件が問題文だけだと分かりづらい
⼀⾔で⾔えば利益（＝価値）l目的関数：お宝の価値×お宝を持っていく個数（これを最大化したい）
⼀⾔で⾔えば重量

これの存在に気づかせる
⼀⾔で⾔えば利益（＝価値）l制約条件：お宝の重さ×お宝を持っていく個数

東京都⽴新宿⼭吹⾼等学校 情報科

24

解答例

formatメソッドにより、amountというリスト全体を初期設定

lvalues = [105,140,65,90,220,170]
lweights = [10,13,6,11,20,18]

リストの要素数
今回は0〜5のループ

lproblem = LpProblem('knapsack', LpMaximize)lamounts = [LpVariable('amount_{0}'.format(i), lowBound = 0, cat = "Integer") for i in range(len(weights))]

lproblem += lpDot(values, amounts)
lproblem += lpDot(weights, amounts) <= 6５lprint(problem)

右の（）内の内積

formatメソッドについては https://www.javadrive.jp/python/string/index24.html
東京都⽴新宿⼭吹⾼等学校 情報科

25

動かしたらlコンピュータを使うと、一瞬であらゆる組み合わせを試行することができる（そういうプログラムを作る）
l数字を変えてやり直すことも簡単に可能
すぐに解が求まるモデルを作るメリットl身の回りのことを題材にして、問題を作らせる（スマホの契約で、最低料金になるプランの検討など）

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 26主婦問題問題）food.csv にリストアップされている７７種類の食料品から何をどのくらい購入すれば、nutrient.csvに記載された１日に健康維持に必要な栄養素を最安で充足することができるか？

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 27

food.csvの一部
foodC alories

P roteinC alciumIron

V itam in A Thiam ine (VR iibofl
tam aviin Bn 1)(VN iaciitamn in B A2)scorbic A cid (V itam in C )W heat Flour (Enri44.
ched)
71411

2

365055.4

33.3

441

0M acaroni

418

0.7

5403.2

1.9

680

W heat C ereal (Enri11.ched)
8377

14.4

175014.4

8.8

1140

C orn Flakes

11.4

252

0.1

560

13.5

2.3

680

C orn M eal

36897

1.7

99

30.9

17.4

7.9

106

0

H om iny G rits

28.6

680

0.8

800

10.6

1.6

110

0

R ice

21.2

460

0.6

4102

4.8

60

0

R olled O ats

25.3

907

5.1

341

0

37.1

8.9

640

W hite B read (Enriched)
15488

2.5

115

0

13.8

8.5

1260

W hole W heat B read
12.2

484

2.7

1250

13.9

6.4

1600R ye B read

12.4

439

1.1

820

9.9

3660

P ound C ake8

1300.4

31

18.9

2.8

3170Soda C rackers 12.5

288

0.5

50

00000

M ilk

310

10.5

1816.8

4

167

177

422

15.1

926

3

23.5

1160

10.8

90.2

3

44.2

0

0.2

20

O leom argarine 20.6

170.6

6

55.8

0.2

000

Eggs

2.9

238

152

18.6

2.8

6.5

10

C heese (C heddar)7 .4

448

16.4

19

28.1

0.8

10.3

40C ream

3.5

49

1.7

3

16.9

0.6

2.5017

P eanut B utter 15.7

661

1

480

9.6

8.1

471

0

M ayonnaise180.2

8

2.7

0.4

0.5

00

11.6

6.1

Evaporated M ilk (can)8.4
B utter

8.6

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 28

nutrient.csv
N utrient Intake

U nit

C alories

3 kilocalories

P rotein

70 gram s

C alcium

0.8 gram s

Iron

12 m illigram s

V itam in A

5 1000IU

Thiam ine (V itam in1.B8 1)m illigram s
R iboflavin (V itam i2.
n 7B m2)illigram s
N iacin18 m illigram s

A scorbic A cid (V itam
75 min ilCli)gram s

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 29

解答例
lfrom pulp import *ライブラリを⼀通り準備

limport numpy as np
limport pandas as pdcsv読み込み

ldf_food = pd.read_csv(’food.csv’)
ldf_nutrient = pd.read_csv(’nutrient.csv’)

東京都⽴新宿⼭吹⾼等学校 情報科

30

解答例
lproblem = LpProblem(‘syufu’,LpMinimize)
問題の定義（最⼩化）lfood_amount = [LpVariable('food_{0}'.format(i), lowBound=0) for i in range(len(df_foods))]

変数の定義

lproblem += lpSum(food_amount)
⽬的関数

lfor k,v in df_nutrient.iterrows():
problem += lpDot(food_amount,df_foods[v.Nutrient]) >= v.Intake
制約条件
東京都⽴新宿⼭吹⾼等学校 情報科

31

例えばこんな問題が作れます
東京都⽴新宿⼭吹⾼等学校 情報科

32

（現代にアレンジ）スムージー問題
l栄養とりたいlカロリー摂りたくない
lバナナ・トマト・きゅうり・・・・・の栄養表を用意
lどれを組み合わせて、どんな商品にする？

こんな問題どうでしょう
東京都⽴新宿⼭吹⾼等学校 情報科

33

指導のポイントl問題（題材）を定式化するイメージが持てるか。
l文章題の文書を読んで、式にすることができるか

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 34

l授業計画l数理最適化とはlこんなところで使われていますl（計画に即して）問題
l数学科との連携
lアプリ作ってみました
l結びの言葉
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 35

数学科との連携
lある題材について・・・
l数学科でやること
l情報科でやること
l教材を共有し検討する〇〇は数学■■は情報と⼀概に⾔えない

l有機的な連携を図り、問題解決のための資質・能力を育成！ 異なる役割を持ったものたちが組織全体として１つの⽬標を達成するために相互作⽤

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 38

l授業計画l数理最適化とはlこんなところで使われていますl（計画に即して）問題
l数学科との連携
lアプリ作ってみました
l結びの言葉
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 39

ここで
lアプリを作りました
l会計時に硬貨をを・なるべく少ない数で支払う・なるべく多くの数で支払う
これらがシミュレーションできるアプリ
lhttps://coin-problem.herokuapp.com

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 40

l授業計画l数理最適化とはlこんなところで使われていますl（計画に即して）問題
l数学科との連携
lアプリ作ってみました
l結びの言葉
東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 41

l最初は３時間の指導計画を構想していたが、「自分で問題を作らせる」という活動を入れると、５時間くらい欲しい

東京都⽴新宿⼭吹⾼等学校 情報科42

身の回りのことを抽象化（モデル化）して、問題解決する力は、コンピュータがこれだけ普及した現代においては、必要な力！

東京都⽴新宿⼭吹⾼等学校 情報科

Takashi Nakayama© 43