Ios 背包逻辑按最大值和持续时间排序

Ios 背包逻辑按最大值和持续时间排序,ios,objective-c,xcode,knapsack-problem,Ios,Objective C,Xcode,Knapsack Problem,我的背包逻辑遇到了瓶颈 我有一系列的歌曲(60分钟),我想把时间限制在15分钟(900秒) 我将歌曲分为8种不同情绪,我希望至少有一首歌曲在限制范围内,但并非所有8种情绪都必须在限制范围内 我用值为1的第一首歌曲对它们进行排序 和processingWeightIndex,以查找15分钟内适合的最大可能歌曲,但该功能未考虑该值。我不太确定我哪里做错了 感谢您的评论和指点,谢谢 -(NSMutableArray*)sortSongsWithWeight:(NSMutableArray*)plArr

我的背包逻辑遇到了瓶颈

我有一系列的歌曲(60分钟),我想把时间限制在15分钟(900秒)

我将歌曲分为8种不同情绪,我希望至少有一首歌曲在限制范围内,但并非所有8种情绪都必须在限制范围内

我用值为1的第一首歌曲对它们进行排序

processingWeightIndex
,以查找15分钟内适合的最大可能歌曲,但该功能未考虑该值。我不太确定我哪里做错了

感谢您的评论和指点,谢谢

-(NSMutableArray*)sortSongsWithWeight:(NSMutableArray*)plArray
{
    NSMutableArray *weightArray = [NSMutableArray array];

    __block int mood = 0;
    __block int value = 1;

    [plArray enumerateObjectsUsingBlock:^(Song* songObj, NSUInteger idx, BOOL *stop) {

        if (![songObj isKindOfClass:[NSNull class]]) // check for null
        {
            WeightObject *obj = [[WeightObject alloc]init];

            if ([songObj.mood intValue] == mood)
            {
                obj.songIndex = @(idx); //index of array of songs
                obj.songDurationORweight = songObj.playbackDuration; //song duration
                obj.mood = songObj.mood;
                obj.songName = songObj.songName;
                obj.Value = @(value);
            }
            else if([songObj.mood intValue] <= mood || [songObj.mood intValue] >= mood )
            {
                obj.songIndex = @(idx); //index of array of songs
                obj.songDurationORweight = songObj.playbackDuration; //song duration
                obj.mood = songObj.mood;
                obj.songName = songObj.songName;
                obj.Value = @(1);
                value = 0;
                mood = [songObj.mood intValue];
            }
            [weightArray addObject:obj];
            NSLog(@"obj index %@ songName %@ songDurations %@ and Value %@ Mood %@ ",obj.songIndex,obj.songName, obj.songDurationORweight,obj.Value,obj.mood);
        }
    }];
    return  weightArray;
}


#define max(a,b) (a > b ? a : b)

int matrix[200][200] = {0}; //40000 songs 200 * 200
int picks[200][200] = {0};

//main chunk of code for Knapsack logic
-(int)processingWeightIndex:(int)index withWeightObj:(NSMutableArray*)weightArray andLimits:(int)limits
{
    //     index = index of the item that need to decide to pick or not, start with the last inde of the array to first
    //     limits = size of durations, reduced when songs picked
    //     weightArray = array with the weight obj of all items

    int take,dontTake;
    take = dontTake = 0;

    WeightObject *obj = weightArray[index];

    if (matrix[index][limits]!=0)
    return matrix[index][limits];

    if (index==0)
    {
        if ([obj.songDurationORweight intValue] <= limits) //205 <= 900
        {
            picks[index][limits] = 1; // picked equal true index is [0][900]
           // matrix[index][limits] = [obj.songDurationORweight intValue]; // martix value @ index [0][900]
             matrix[index][limits] = [obj.songDurationORweight intValue]; // martix value @ index [0][900]
            //return [obj.songDurationORweight intValue];
            return [obj.songDurationORweight intValue];
        }
        else
        {
            picks[index][limits] = -1; // not picked
            matrix[index][limits] = 0; // value equal 0
            return 0;
        }
    }

    if ([obj.songDurationORweight intValue] <= limits) //205 <= 900
    {
        take = [obj.songDurationORweight intValue] + [self processingWeightIndex:index - 1 withWeightObj:weightArray andLimits:limits - [obj.songDurationORweight intValue]];
        //take = [obj.Value intValue] + [self processingWeightIndex:index - 1 withWeightObj:weightArray andLimits:limits - [obj.songDurationORweight intValue]];
    }

    dontTake = [self processingWeightIndex:index - 1 withWeightObj:weightArray andLimits:limits];
    matrix[index][limits] = max (take, dontTake);

    if (take > dontTake)
    picks[index][limits] = 1;
    else
    picks[index][limits] = -1;

    NSLog(@"picks[%d][%d] picks %d  %d",index,limits,picks[index][limits],matrix[index][limits]);
    return matrix[index][limits];
}
-(NSMutableArray*)排序宽度:(NSMutableArray*)方阵
{
NSMutableArray*weightArray=[NSMutableArray];
__块int=0;
__块int值=1;
[plArray enumerateObjectsUsingBlock:^(歌曲*songObj,整数idx,布尔*stop){
if(![songObj isKindOfClass:[NSNull类]])//检查是否为null
{
WeightObject*obj=[[WeightObject alloc]init];
if([songObj.mood intValue]==mood)
{
obj.songIndex=@(idx);//歌曲数组的索引
obj.songDurationORweight=songObj.playbackDuration;//歌曲持续时间
obj.mood=songObj.mood;
obj.songName=songObj.songName;
对象值=@(值);
}
else if([songObj.mood intValue]=mood)
{
obj.songIndex=@(idx);//歌曲数组的索引
obj.songDurationORweight=songObj.playbackDuration;//歌曲持续时间
obj.mood=songObj.mood;
obj.songName=songObj.songName;
目标值=@(1);
数值=0;
mood=[songObj.mood intValue];
}
[weightArray addObject:obj];
NSLog(@“obj index%@songName%@songDurations%@和Value%@Mood%@),obj.songIndex,obj.songName,obj.songDurationORweight,obj.Value,obj.Mood);
}
}];
返回权重数组;
}
#定义最大值(a,b)(a>b?a:b)
int矩阵[200][200]={0}//40000首歌曲200*200
整数选取[200][200]={0};
//背包逻辑的主要代码块
-(int)正在处理weightIndex:(int)带有weightObj:(NSMutableArray*)的索引weightArray和limits:(int)limits
{
//索引=需要决定是否拾取的项的索引,从数组的最后一个索引开始到第一个索引
//限制=持续时间的大小,在拾取歌曲时减少
//weightArray=包含所有项的权重对象的数组
内接,唐塔克;
take=dontTake=0;
WeightObject*obj=weightArray[index];
如果(矩阵[索引][限制]!=0)
回报矩阵[指数][限额];
如果(索引==0)
{

如果在else块中([obj.songDurationORweight intValue],则将该值设置为0:

            value = 0;
然后,当下一个元素命中if块时,它将为歌曲指定一个0值,因此,从此以后匹配的所有歌曲都将是value=0,而所有不匹配的歌曲都将是value=1。因此,您的背包将不考虑这些值,除了在第一个元素之前匹配过情绪的任何歌曲之外不符合情绪的歌曲


代码可能还有其他问题,但由于调用这两个方法的代码不可用,因此很难弄清楚发生了什么,尤其是processingWeightIndex方法是否在做它应该做的事情。

我不确定它是否导致了问题,但
矩阵[200][200]
选择[200][200]
看起来很可疑,应该是
…[200][901]
,其中200是歌曲数量,901是背包容量+1。这意味着什么:“我有一系列歌曲(60分钟)”。总共60分钟?还是什么?