プログラムの実験値について

色々制約をつけていますが、これは問題の本質を変えるものではありません。例えば挿入前の配列には制限酵素の切断サイトがないと仮定していて、実際はそうでもないのですが、この場合切断サイトがあるところを、前述の問題での挿入部位と考えてしまえば解決できます。また、電気泳動で使う酵素の数についてですが、また酵素の種類が増えても、同様のコードで並行して(もしくは一方で得られたデータを渡してあげることで)解決できます。

理想化されきっちり設定された問題なら上のコードで解けますが、実際はそうは行かないことが多いです(誤差とかで)。
それを回避するには、上では条件を全て満たすものがあれば終わり、としていたのですが、そうはせずに全探索の際、ある特定の状態の時想定されるバンドの長さと実際のデータとの差の二乗を足し、それがMinとなるものを採用する、というように書き換えるという方法が考えられます。
実際の実験では(特にこの実験では)あまり正確な値が取れないことと、バンドが複数本あるはずなのにそれを見逃してしまうことなどにより
このプログラムをそのまま回そうとすると絶対うまくいきません。
一つプログラムをロバストにする方法として、以下のようなものがあげられます。
バンドがたとえば、それまでの情報から4本あると期待されるが3本ある、というケースを考えてみます。言うまでもなく電気泳動の結果の
再検討が必要になります。ただ、バンドの発色の程度や、サチっているのを抑えたりしてもわからない場合があります。そういう場合には、
気休めに過ぎないですが「丸め込む」ことで一応制限酵素地図の出力をしてしまう、ということはできます。実際プログラムを回すときはそんなピタッと綺麗にならないのは普通なので、このようなロバスト性を高める工夫が実用になることが往々にしてあります。
vectorのvec(4)にその期待される4本のバンドの情報がソートされた状態で入っていて、実際のデータ(3つ)がソートされた状態でvectorのvect(3)に入っているとします。
このような場合一つ考えられるのは、4本のうち、2本がとても長さが近いのでバンドとしてはそれらが一本に見えてしまうということです。
そのような場合、実際にある3本のバンドの長さの推定としては、
ll a1=(vec.at(0)+vec.at(1))/2;
ll a2=vec.at(2);
ll a3=vec.at(3);
もしくは
ll b1=vec.at(0);
ll b2=(vec.at(1)+vec.at(2))/2;
ll b3=(vec.at(3));
もしくは
ll c1=vec.at(0);
ll c2=vec.at(1);
ll c3=(vec.at(2)+vec.at(3))/2;
の3パターンがlikelyだと考えられます。そこで、これらを実際のデータと比較して、誤差の二乗和を計算します。たとえばケース1なら、
ll suma=pow(a1-vect.at(0),2)+pow(a2-vect.at(1),2)+pow(a3-vect.at(2),2)
といった感じです。
これらをb、cについても計算し、誤差の二乗和が最小になるものを採用する、というふうにします。

ざっとこんな感じですが、実データを扱うのは難しいですね。

お読みいただきありがとうございました。

よろしければサポートをよろしくお願いいたします。頂いたサポートは新しい勉強用の本の購入に使わせていただきます。