次の図に示すように、線分に 25 個の点があり、これらの点が (空間的に) 不均一に分布しているとします。
私の質問は、これらの 25 点の中から 10 点を選択して、これらの 10 点をできるだけ空間的に均等に分散させるにはどうすればよいかということです。アイデアの状況では、選択されたポイントは次のようになります。
編集: 「均等な分布」を正当化する基準を知ることができれば、この質問がより洗練されたものになることは事実です。私が知っているのは、選択した点に対する私の期待です: 線分を 10 個の等しい線分に分割した場合。小さな線分ごとに 1 つの点があるはずです。もちろん、いくつかの小さな線分では、代表点を見つけることができない場合があります。その場合、代表点を持つ隣接する小さな線分に頼ります。次のステップでは、選択した隣接セグメントをさらに 2 つの部分に分割します。各部分に代表点がある場合、空の代表点の問題は解決されます。小さい線分の 1 つに代表点が見つからない場合は、さらに小さな線分に分割できます。または、次の隣接する線分に頼ることができます。
編集: 動的プログラミングを使用すると、可能な解決策は次のように実装されます。
#include <iostream>
#include <vector>
using namespace std;
struct Note
{
int previous_node;
double cost;
};
typedef struct Note Note;
int main()
{
double dis[25] =
{0.0344460805029088, 0.118997681558377, 0.162611735194631,
0.186872604554379, 0.223811939491137, 0.276025076998578,
0.317099480060861, 0.340385726666133, 0.381558457093008,
0.438744359656398, 0.445586200710900, 0.489764395788231,
0.498364051982143, 0.585267750979777, 0.646313010111265,
0.655098003973841, 0.679702676853675, 0.694828622975817,
0.709364830858073, 0.754686681982361, 0.765516788149002,
0.795199901137063, 0.823457828327293, 0.950222048838355, 0.959743958516081};
Note solutions[25];
for(int i=0; i<25; i++)
{
solutions[i].cost = 1000000;
}
solutions[0].cost = 0;
solutions[0].previous_node = 0;
for(int i=0; i<25; i++)
{
for(int j= i-1; j>=0; j--)
{
double tempcost = solutions[j].cost + std::abs(dis[i]-dis[j]-0.1);
if (tempcost<solutions[i].cost)
{
solutions[i].previous_node = j;
solutions[i].cost = tempcost;
}
}
}
vector<int> selected_points_index;
int i= 24;
selected_points_index.push_back(i);
while (solutions[i].previous_node != 0)
{
i = solutions[i].previous_node;
selected_points_index.push_back(i);
}
selected_points_index.push_back(0);
std::reverse(selected_points_index.begin(),selected_points_index.end());
for(int i=0; i<selected_points_index.size(); i++)
cout<<selected_points_index[i]<<endl;
return 0;
}
結果を次の図に示します。ここでは、選択したポイントが緑色で示されています。