ujimushi(@旧sradjp(15364))の日記

旧スラドの日記の引越先です

休日子供の昼ごはんを作る(イワシの蒲焼)

妻は私が休みの日はだいたい仕事でいないので,週に一回ぐらい子供の昼ご飯を作ることになっている。 この時作る食事の材料の費用は私持ちなので,子供には申し訳ないがだいたいケチる。 良く言えば家計のため…

一週間に一回ぐらいなので,そこそこ時間をかけて作る。単に要領が悪いともいう。。。

まず起きている方の子供の了解をとりつけてイワシの蒲焼丼に献立を決定。 なぜなら安価で,まぁ何となく旬(?)だから。 子供と私含めて3人分,4尾1パック(171円税込み)を2パック購入。

手開きにするところはどのメニューも同じだと思うが,参考にしたレシピは手間がかかるもの。 でも美味しい(個人の感想)のでまぁいいか。

だらだら1時間半ぐらいかけて完成。

野菜も添えないと子供からクレームがくるので冷蔵庫の余り物(?)を探す。

ちょうど季節なので,桜の型でにんじんをくり抜いてキャベツと併せてレンチンしたものを添える。 生物(なまもの)管理に自信がないので,だいたい熱を通すようにしている。

いつもは卵スープなのだが,卵がないのでイワシの骨の部分を焼いてダシの代わりにして カットわかめとレンチンしたキャベツを放り込んで味噌を溶いた「味噌汁っぽい何か」

ニンジンをくり抜いた余りも一緒にレンチンして自分用に適当に添える。 食べれば一緒だ。

このイワシの蒲焼のメニューも

「子供は魚嫌いだけど,蒲焼の味付なら大丈夫だろう。私が子供の時この味付けが好きだったから」

という思い込みで始めたもの。まぁ食べ残してないからすごい嫌いという訳でもないのだろう。

複数の制約があるなかでの価値最大化。(ナップサック問題応用) ~勝手に回答

久しぶりの「勝手に回答」シリーズ。今回はTeratail複数の制約があるなかでの価値最大化。(ナップサック問題応用) です。

質問では「Pythonで」ということでしたがPythonはよく分からないので, 自分のためのJuliaのJuMPの勉強としてJulia言語で実装してみます。

幸いにしてJuMPのサイトにはナップサック問題の例があるので, これに対してうんうん悩みながら条件を追加していきます。

実装例は次のような感じです。 もうちょっと簡単にできるのかもしれないですけど, あまりコーディング能力がない自分が初めて書いたにしては上出来かなと思います。

using JuMP, HiGHS

価格 = Float64[5, 6, 12, 3, 4, 4, 5, 6, 5, 6, 10]   # 円
体積 = Float64[2, 2, 9, 2, 5, 4, 3, 7, 2, 4, 8]     # リットル

可黄袋 = Float64[0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1]   # 黄&白のボールが可能
可青袋 = Float64[0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1]   # 青&白のボールが可能
可赤袋 = Float64[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1]   # 赤&白のボールが可能
可白袋 = Float64[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]   # 全色のボールが可能

const n = length(価格)
キャパ = 10.0     # リットル

model = Model(HiGHS.Optimizer)

@variable(model, x[1:n, ["黄", "青", "赤", "白"]], Bin)
# 容量制限
@constraint(model, cキャパ, sum(体積[i] * sum(x[i, :]) for i in 1:n)  キャパ)
# 各色袋に可能なボール
@constraint(model, c黄[i = 1:n], x[i, "黄"]  可黄袋[i])
@constraint(model, c青[i = 1:n], x[i, "青"]  可青袋[i])
@constraint(model, c赤[i = 1:n], x[i, "赤"]  可赤袋[i])
@constraint(model, c白[i = 1:n], x[i, "白"]  可白袋[i])
# 各色袋毎にボール一つずつの条件
@constraint(model, c袋[f = ["黄", "青", "赤", "白"]], sum(x[i, f] for i in 1:n)  1.0)
# 各ボールは一度に複数の袋に入らない条件
@constraint(model, c[i = 1:n], sum(x[i, :])  1.0 )
# 価格最大化
@objective(model, Max, sum(価格[i] * sum(x[i, :]) for i in 1:n))
# 最適化
optimize!(model)
# 結果表示
for i in 1:n, j in ["黄", "青", "赤", "白"]
    if value(x[i, j]) > 0.5
        println("$(i)番目のボール($(j)袋))")
    end
end

出力結果は次の通りです。 Julia言語はあくまでラッパーで,HiGHSのSolverのお蔭といえるかもしれません。

Running HiGHS 1.7.0 (git hash: 50670fd4c): Copyright (c) 2024 HiGHS under MIT licence terms
Coefficient ranges:
  Matrix [1e+00, 9e+00]
  Cost   [3e+00, 1e+01]
  Bound  [1e+00, 1e+00]
  RHS    [1e+00, 1e+01]
Presolving model
13 rows, 21 cols, 60 nonzeros  0s
6 rows, 15 cols, 43 nonzeros  0s
6 rows, 10 cols, 26 nonzeros  0s
Objective function is integral with scale 1

Solving MIP model with:
   6 rows
   10 cols (10 binary, 0 integer, 0 implied int., 0 continuous)
   26 nonzeros

        Nodes      |    B&B Tree     |            Objective Bounds              |  Dynamic Constraints |       Work      
     Proc. InQueue |  Leaves   Expl. | BestBound       BestSol              Gap |   Cuts   InLp Confl. | LpIters     Time

         0       0         0   0.00%   34              -inf                 inf        0      0      0         0     0.0s
 S       0       0         0   0.00%   34              14               142.86%        0      0      0         0     0.0s
 R       0       0         0   0.00%   20              19                 5.26%        0      0      0         6     0.0s

40.0% inactive integer columns, restarting

Solving report
  Status            Optimal
  Primal bound      19
  Dual bound        19
  Gap               0% (tolerance: 0.01%)
  Solution status   feasible
                    19 (objective)
                    0 (bound viol.)
                    0 (int. viol.)
                    0 (row viol.)
  Timing            0.00 (total)
                    0.00 (presolve)
                    0.00 (postsolve)
  Nodes             0
  LP iterations     6 (total)
                    0 (strong br.)
                    0 (separation)
                    0 (heuristics)
2番目のボール(赤袋))
4番目のボール(黄袋))
7番目のボール(青袋))
9番目のボール(白袋))

質問で示された種類とは別解がでていますが,違いは体積と価格が同じボール(白袋なので色はどうでもいい) なので多分合っているだろうということは分かります。

条件の記述をまとめて表現出来るのはJulia言語ならではでしょうか。

plot_title(|vspan|location|font([hv]align)) (Plots.jl(GR))

大方の予想通り,今回はplot_title*(plot_title関係)です。 全部まとめてやる予定でしたが,色々あって2回に分けます。

それぞれplotアトリビュートです。

最初は簡単だと思ったのですが,plot_titlelocationがくせ物で分量が多くなりました。

plot_title

ほぼtitle(Subplot)と同じで図のタイトルの文字列を指定します。

別名

最近はソースに別名を列挙していましたが, 図に一つしか指定できないので,別名は箇条書きにします。

  • plot_title
  • plot_grid_title
  • plot_titles
  • plotgridtitle
  • plottitles
  • sgtitle
  • subplot_grid_title
  • subplotgridtitle
  • suptitle

多いです。一番短いのを選ぶならsgtitleでしょうか?

使用例

title(|location|font(family|size|color|rotation|[vh]align)) (Plots.jl(GR))の再掲です。

続きを読む

title(|location|font(family|size|color|rotation|[vh]align)) (Plots.jl(GR))

全部覚えている訳ではないので,個人的には日常的にすごく役に立っている Plots.jlの個別のアトリビュートの使用例を残すこのシリーズ。 今回は(ようやく)よく使うtitleに関する内容です。

title

titleで図のタイトルの文字列を指定します。 subplotに関するアトリビュートで,全体のタイトルはplot_titleに相当します。

なのでうっかり次のような感じにしてしまうと,全てのsubplotのタイトルがABCDになります。

using Plots
gr()
plts = [plot(sin, title=k) for k in ["A", "B", "C", "D"]]
plot(plts...; title = "ABCD")
savefig("ABCD.png")
続きを読む

貴方の知らないPlots.jlのGRバックエンドのフォントの挙動

今回の内容は私がMacを持ってないのでMacの挙動は多分違うと思います。あしからず。

今から記述することはあくまで自分が試して推定している内容なので,話半分で聞いて欲しい内容 です。

どうもGRのバックエンド(ただし,LinuxWindowsの場合)には「見つからないフォントが指定されると,とりあえずOS標準のフォントで表示する」という挙動があるようなふしが見受けられます。

ということは,何かOSに存在しないフォントを指定するとOSデフォルトのフォントで表示する, むしろOSにないフォントを指定した方が表示可能な文字が増える可能性がある訳です。

Windowsで試してみた例を次に示します。

続きを読む

Plots.jl 開発状況(Road to plots 2.0)

どうもPlots.jlの次期メジャーバージョンの開発がそこそこ進んでいるらしい。

GRとUnicodePlotのバックエンドはかなり開発が進んでいるっぽい。現在90%のテストが通っている状況。 ただ,まだチェックが入っていない項目も多いので今すぐリリースという感じにはならなさそう。

大きな変更点としてはデフォルトでGRがバックエンドになっているのが廃止される。 あらかじめimportしておく必要がある。 UnicodePlotsをバックエンドにする時は

using Plots; import UnicodePlots
unicodeplots()
plot(1:10)

のような感じで使うらしい。 この時using UnicodePlotsとかすると,plot関数の名前解決ができなくて変なことになるので, importする感じになると思う。

で大きな問題があって,「2.0が出ると今までこの日記に書いた内容は役に立たなくなるかも」 というところであるが,まぁ順次更新していこう。 どちらかというと,この日記は自分用の参考資料的なところも大きいので, 2.0に変更されたらblogの記事を細々と誰にもアナウンスせず修正していく予定。

2.0からの大きな変更(追記)

  • pyplot,pgfplots(pgfplotsxではない)のバックエンドは完全廃止
  • pyplotの代替であるpythonplotの作業がバックエンドの中で一番遅れている

Plots.jlのGRバックエンド(@ubuntu)で絵文字を表示する

Plots.jlのイシューに[BUG] GR backend does not support emoji in legendとあった。

でも「これってバグか?絵文字が含まれるフォントで表示すればいいだけじゃん。」と思ったので試してみた。

ところがubuntuにインストールされているNoto Color Emojiではうまくいかない。 これは普通の文字のところのグリフがなく,少し特殊なフォントっぽい。

ということで色々探してみたところ,「Symbola」というフォントがあるようだ。 ubuntuなら

$ sudo apt install ttf-ancient-fonts-symbola 

でインストールできる。

でフォント名を調べて次のようなスクリプトを作成。

続きを読む