記事ディレクトリ
序文
問題解決:
貪欲な方法でアクティビティ スケジューリング問題を解く
[問題の説明] あるリソースを使用する必要がある 11 個のアクティビティからなる集合 S、S={1,...,11} があるとします。このリソースは、常に 1 つのアクティビティによってのみ占有できます。アクティビティ i には開始時刻 bi と終了時刻 ei (bi<ei) があり、最も早いアクティビティ実行時刻が 0 であると仮定すると、その実行時刻は ei-bi です。
アクティビティの実行が開始されると、実行が完了するまで中断できません。アクティビティ i とアクティビティ j が bi≧ej または bj≧ei である場合、2 つのアクティビティは互換性があると言われます。
たとえば、次の表の n=11 アクティビティの場合、
設計アルゴリズムは、配置されたすべてのアクティビティの数が最大になるように、最適なアクティビティ配置スキームを探します。
1. 実験手順と結果
コード:
#include<stdio.h>
#include<string.h>
int n;
int b[100];
int e[100];
int cnt=0;
int B[100];
int E[100];
void solve();
void output();
void fun();
int main()
{
int j;
memset(B,0,sizeof(B));
memset(E,0,sizeof(E));
printf("请输入活动的数量:\n");
scanf("%d",&n);
fun();
printf("请输入活动起始时间:\n");
for(j=0;j<n;j++)
{
printf("请输入第%d个活动起始时间: ",j+1);
scanf("%d",&b[j]);
}
fun();
printf("请输入活动结束时间:\n");
for(j=0;j<n;j++)
{
printf("请输入第%d个活动结束时间: ",j+1);
scanf("%d",&e[j]);
}
fun();
printf("活动名称:");
for(j=0;j<n;j++)
{
printf("%3d",j+1);
}
printf("\n起始时间:");
for(j=0;j<n;j++)
{
printf("%3d",b[j]);
}
printf("\n结束时间:");
for(j=0;j<n;j++)
{
printf("%3d",e[j]);
}
printf("\n");
fun();
solve();
output();
return 0;
}
void solve()
{
int i,j=0;
B[0]=b[0];
E[0]=e[0];
for(i=0;i<=n;i++){
if(b[i]>=e[j]){
j=i;
cnt++;
B[cnt]=b[j];
E[cnt]=e[j];
}
}
}
void output()
{
int i;
printf("求解结果为:\n");
printf("选取的活动为:\n");
for(i=0;i<=cnt;i++){
printf("第%d个活动:[%d,%d]\n",B[i],E[i]);
}
printf("\n共选取%d个活动\n",cnt+1);
}
void fun()
{
printf(" ******************************************\n");
}
結果は次のとおりです。
要約する
この実験は比較的簡単に実装できます. 2 つの配列を作成することにより, 開始時刻と終了時刻をそれぞれ記録し, 貪欲なアルゴリズムを設定します.構造体を使用する効率を大幅に低下させる入れ込みは、それらの効果をグローバル変数と空の配列に置き換えますが、同時に、アクティビティの終了時刻をインクリメンタルにソートする効果がないためです。リビジョンには、長所と短所があります。学習する前に使用を検討できます。このプログラムのソート アルゴリズムは改善する価値があります。