数学?に関する質問です。工場に多くの機械があります。記録簿には、各機械の運転の開始時間と終了時間が記録されています。


  例:
  機械A 2006年10月1日08:35:40運転開始 2006年10月1日10:21:07運転終了
  機械B 2006年10月1日09:24:54運転開始 2006年10月1日09:35:19運転終了

ある機械とある機械が同時に使用されていた時間(秒数)を求めたいのです。簡単に、機械Aと機械Bの2台の機械があるとお考えください。機械AとBの運転の開始時間をAoとBo、終了時間をAsとBsとします(openとstopのつもり)。この4つの変数を用いて、同時使用の時間を求める一般式をお教え下さい。条件として、

  ・一般の加減剰余の演算だけで算出する
  ・変数の大小によって場合分けしない(1つの式で表現)
  ・絶対値記号の使用はあり

# 記録によっては、同時使用の時間がない場合もあります。

質問文が不明瞭かもしれません。その点はご指摘ください。あまり自信のないご回答は、ご遠慮ください。

以上、よろしくお願いいたします。

追伸:((As-Ao)+(Bs-Bo))-(|Bs-Ao|+|As-Bo|+|As-Bs|+|Ao-Bo|)/2 などいろいろ考えましたがNGでした。この式の場合、同時時間ナシの場合が、上手くいかないようです。

回答の条件
  • 1人3回まで
  • 登録:2006/09/15 17:03:46
  • 終了:2006/09/21 09:24:29

回答(6件)

id:hengsu No.1

hengsu回答回数185ベストアンサー獲得回数102006/09/15 17:42:46

ポイント10pt

((Bs-Ao)+|Bs-Ao|)/2 + ((Ao-Bs)+|Ao-Bs|)/2

では?

id:Mugicha2004

さっそくのご回答、ありがとうございます。単括弧と絶対値括弧を、このように組み合わせる発想はありませんでした。簡単に検算してみました。すると....

******Ao*********As************

***********Bo***********Bs*****

のような時系列の組合せの場合、図から解は「As-Bo」ということはすぐに分かると思います。ご提示の一般式を解くと、Bs-Aoとなり、求める解とは異なるような気がします。

いかがでしょうか?私の勘違いでしょうか?

2006/09/15 17:52:33
id:Baku7770 No.2

Baku7770回答回数2832ベストアンサー獲得回数1812006/09/15 18:17:45

ポイント25pt

 意外と簡単でしたね。

 Ao、As、Bo、Bs総てが等しくなくという仮定がつきます。

 Ao<As、Bo<Bsですから、

Ao<Boの場合、

 Ao,Bo,Bs,As

 Ao,Bo,As,Bs

 Ao,As,Bo,Bs

の3通りしか組み合わせはありません。Ao>Boの場合も同様です。

まず、0となる組み合わせを排除します。

((Bo-As)/|Bo-As|+1)・((Ao-Bs)/|Ao-Bs|+1)/4となります。後は実際に計算を行うべき式にこれを掛ければいいのです。

 Ao,Bo,Bs,Asの場合、Bs-Boを計算するわけです。

 その場合、As>Bs、Bo>Aoですから

(Bs-Bo)・((As-Bs)/|As-Bs|+1)・((Bo-Ao)/|Bo-Ao|+1)/4

で計算されます。

 後はそれぞれのケースの式を立てて足し算するだけです。

id:Mugicha2004

詳細なご回答をありがとうございます。ご指摘のとおり、それぞれの値の大小について場合分けをすると、ご提示の式でOKのようです。一部、文章がわかりにくかったです。「後は実際に計算を行うべき式にこれを掛ける」との部分です。飲み込みが悪くてすみません。

追記ですが、

  ・4つの値は、一部が同一のこともあります。全て同一のこともあります。

  ・重複する運転時間がないため、結果がゼロとなることもあります。そのような場合も処理できる式が希望です

  ・4つの値の前後関係や同一など、全ての場合において成立する式が希望です。

ご回答内容が、値の前後関係(大小関係)によって場合分けをしなければならないのであれば、当方の希望情報とは異なります。

もう少しご回答を待ちたいと思います。よろしくお願いいたします。

2006/09/15 22:20:37
id:hengsu No.3

hengsu回答回数185ベストアンサー獲得回数102006/09/15 18:28:23

ポイント30pt

すみません。

[X]=(X+|X|)/2で、Xが正の時に、X、負の時に0になるというのを使うつもりで、うっかり、oとsを逆に書いてしまった上に、全体を引くのを忘れると言う、見落としがありました。

上の記号を使うと、今度は、

[Bo-As]+[Ao-Bs]

になると思います。

id:Mugicha2004

追加のご回答を、ありがとうございます。[]という算術記号があるのですね。これを用いると、[Bo-As]+[Ao-Bs]と定式できるとのご回答だと思います。

大変すみませんが、よく理解できません。アタマがずいぶんと固くなっているようです。「Xが正の時に、X、負の時に0になる」というのは、[]記号内での「裸のX」に適用するルールでしょうか?ということでしたら、

 ・Xが正の場合、[X]はX

 ・Xが負の場合、[X]はX/2

なのでしょうか? もしくは、後者は「ゼロ」なのでしょうか?

その辺りからつまずいてしまい、検証が満足にできていません。少々永くなっても構いませんので、+-*/と絶対値記号だけで表記していただけると助かります。よろしくお願いいたします。

2006/09/15 22:27:46
id:toohigh No.4

toohigh回答回数291ベストアンサー獲得回数372006/09/15 18:50:53

ポイント30pt

G = ((As-Bo)+|As-Bo|) / 2 / (As-Bo)

・・という式を考えると、同時時間なしの場合は G=0 , ありの場合は G=1 になるので、

例示されている式を F として、

F = ((As-Ao)+(Bs-Bo))-(|Bs-Ao|+|As-Bo|+|As-Bs|+|Ao-Bo|)/2

G = ((As-Bo)+|As-Bo|) / 2 / (As-Bo)

Answer = F * G

・・・で、期待通りの結果になるかと思います。

ただし、As = Bo の時に、G が 0/0 の不定値になるのを許してもらえるなら、という条件付きですが・・。

id:Mugicha2004

次々のご回答、ありがとうございます。一部、当方の式をFとしてお使いいただいたようで、少しうれしく思います。アルコール濃度が上がっているため、連休中にゆっくりと検証したいと思います。早く結論を知りたいのですが...

基本的に、ややこしい式・長い式になってしまうようですね。ご提示の内容ですが、0/0が発生してしまうのが残念ですね。As=Boのケースも、もちろん想定されます。一部、除外ケースを設けないと、一般化はムリなのかもしれません。

数式に詳しい方のご回答を、いましばらく待ちたいと思います。よろしくお願いいたします。

2006/09/15 22:31:35
id:Z9M9Z No.5

Z9M9Z回答回数343ベストアンサー獲得回数112006/09/15 20:22:31

ポイント30pt

1の回答の方にもあるように(x+|x|)/2はx>0のときx、x<0のとき0になり、判別式のように使えます。

AoとBoの小さい方からAsとBsの大きい方までの長さを全体の長さT、As-AoとBs-Boの和を個別長さの総計とするとSとすると、S-Tが正のときだけ値を返し、負のときは0になればよいわけです。

T1=(|Ao-Bo|-(Ao-Bo))/2

T2=(|Bo-Ao|-(Bo-Ao))/2

To=T1+T2

とすると、T1はAo<BoのときだけAo、T2はAo>BoのときだけBoですので、Toには小さい方が入り、同様に

T3=((As-Bs)+|As-Bs|)/2

T4=((Bs-As)+|Bs-As|)/2

Ts=T3+T4

でTsには大きい方が入ります。これでTは

T=Ts-To

とかけます。

S=(As-Ao)+(Bs-Bo)

ですので、以上から、求める長さは

((S-T)+|S-T|)/2

となるはずです。‥以上を代入するとすごい式なので省略させてください。

id:Mugicha2004

詳細なご回答を、ありがとうございます。第一印象ですが、これでキマリ!のような気がしています。

判別式的な使い方のできる(x+|x|)/2は、とても有用そうな部分ですね。しかし、すべてA~Bで表記すると、ずいぶんと長い式になるんですね。場合ごとに考えると、それぞれとても簡単な式で表現できるとのですが、一般化するとトタンに長くなるのですね... ううむ

せっかくですので、もう少しご回答を募集したいと思います。ご提示いただいた式の検証も、今しばらくお時間をください。ご参考までに私が手計算で用いている各パターンを、以下に示します。よろしくお願いいたします。


パターン1

===Ao==========As========

=======Bo===========Bs===


パターン2

=======Ao===========As===

===Bo==========Bs========


パターン3

===Ao================As==

=======Bo====Bs==========


パターン4

=======Ao====As==========

===Bo================Bs==


パターン5

===Ao===As===============

==============Bo===Bs====


パターン6

==============Ao===As====

===Bo===Bs===============


パターン7

===Ao===As===============

========Bo=========Bs====


パターン8

========Ao=========As====

===Bo===Bs===============


追伸:個人的(素人的)には、もう少し「エレガントな解を求む」の気分です。

追伸2:4の方も5の方も正しい場合、それぞれの式は同一なのでしょうか?展開すれば分かりそうですが....

2006/09/15 22:44:20
id:Z9M9Z No.6

Z9M9Z回答回数343ベストアンサー獲得回数112006/09/16 01:54:22

ポイント50pt

すみません、だいぶまわりくどく、しかも勘違いしていました。

Ao>BoのときBo、そうでないときAoにするToは、AoとBoの中点から差の半分だけ小さくすればいいので

To=[(Ao+Bo)-|Ao-Bo|]/2

As>BsのときAs、そうでないときBsにするTsは、AsとBsの中点から差の半分だけ大きくすればいいので

Ts=[(As+Bs)+|As-Bs|]/2

これでT=Ts-Toは

T=[(As+Bs)-(Ao+Bo)+|As-Bs|+|Ao-Bo|]/2

S-Tと|S-T|は

S-T =[(Bs-Bo)+(As-Ao)-|Bs-As|-|Ao-Bo|]/2

|S-T|=|(Bs-Bo)+(As-Ao)-|Bs-As|-|Ao-Bo||/2

で、答は[(S-T)+|S-T|]/2。これ以上は簡単にならない‥かな。

id:Mugicha2004

さらなるご回答、ありがとうございます。だいぶイメージしやすい式になったようです。後ほど、検証しますね。検証結果は、この返信欄に追記します。本当にありがとうございました。

2006/09/16 08:41:07
  • id:kurukuru-neko
    以下のようなパターンは想定していませんか?

    N回の複数の開始停止

    CASE 1:

    ========Ao=========As====
    ===Bo===Bs==Bo==Bs=======

    CASE 2
    ======Ao==As=Ao==As======
    ===Bo================Bs==

  • id:Mugicha2004
    コメント、ありがとうございます。はい、想定しています。例えば前者の場合、

     Ao~AsとBo1~Bs1、Ao~AsとBo2とBs2
     
    に分けて計算します。このような重複ケースの場合まで、一般化する必要はないのです。1つの運転時間の間隔と、1つの運転時間の間隔の場合の、重複時間を求める一般式があれば十分です。 
  • id:Mugicha2004
    バタバタしており、まだ十分な検証ができていません。みなさまから丁寧なご回答をいただいたので、この中に正解があることを確信しております。本当にありがとうございました。
  • id:rero
    既にこの質問の使い所は終わっているでしょうが…,

    この問題は max (および min) と upto0 (負の値を 0 に切り上げ) があれば相当シンプルな式になるので,
    この問題の肝は max, min, upto0 を if なしでどうやって実現するか,となります.

    aaa = A_s - A_o
    bbb = B_s - B_o
    ccc = max(A_s,B_s) - min(A_o,B_o)
    answer = upto0( aaa + bbb - ccc )

    ここで,max, min, upto0 は以下のように実現できます.
    max(a,b) = (a+b)/2 + |a-b|/2
    min(a,b) = (a+b)/2 - |a-b|/2
    upto0(a) = (x + |x|)/2

    まあ,絶対値 || が潜在的に if を含んでいるので,当然できるでしょうね.

    図示すると以下のようになります.

    case1: answer = aaa + bbb - ccc
    aaaaaaaaaa_____ ; aaa = A_s - A_o
    _____bbbbbbbbbb ; bbb = B_s - B_o
    ccccccccccccccc ; ccc = max(A_s,B_s) - min(A_o,B_o)

    case2: answer = aaa + bbb - ccc
    aaaaaaaaaaaaaaa ; aaa = A_s - A_o
    _____bbbbb_____ ; bbb = B_s - B_o
    ccccccccccccccc ; ccc = max(A_s,B_s) - min(A_o,B_o)

    case3: answer = 0 (aaa + bbb - ccc < 0)
    aaaaa__________ ; aaa = A_s - A_o
    __________bbbbb ; bbb = B_s - B_o
    ccccccccccccccc ; ccc = max(A_s,B_s) - min(A_o,B_o)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません