专题一 Problem E

本文介绍了一道利用贪心算法解决的典型题目——电视节目选择问题。该问题要求从一系列重叠的电视节目中选出最多数量的不重叠节目。通过将节目按结束时间排序,并采用贪心策略来实现全局最优解。

一、题目编号:

           Problem E

二、简单题意:

          输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。  对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。

三、解题思路形成过程

        典型的利用贪心算法的题,通过局部最优以达到整体最优。这个题的贪心策略是,按节目的结束时间按升序排序,结束时间相同的则按开始时间升序 。然后开始选择节目,首先第一个一定会选上,后面的依次判断,开始时间晚于或等于结束时间则通过选择,最终输出个数即可

四、感想

       开始是用自己写的代码进行排序,怎么改都是WA。过了几天再想这个题,利用sort函数,很简单就通过了。另外,还是应该多注意细节。

五、AC代码     

#include<iostream>

#include<algorithm>
using namespace std;
struct tv
{
    int s,e;
}index[101];
bool cmp(tv a,tv b)
{
    if(a.e<b.e)
        return true;
    if(a.e==b.e&&a.s<=b.s)
        return true;
    else
        return false;
}
int main()
{
    int n;
    while(cin>>n&&n!=0)
    {
        for(int i=0;i<n;i++)
        cin>>index[i].s>>index[i].e;
        sort(index,index+n,cmp);
        int num=1;
        int w=index[0].e;
        for(int i=1;i<n;i++)
        if(index[i].s>=w)
        {
            num++;
            w=index[i].e;
        }
        cout<<num<<endl;
    }
    return 0;
}

<think>我们正在讨论pymop库中的Problem类。根据用户需求,需要了解Problem类的用法和定义。首先,pymop是个用于多目标优化问题的Python库。Problem类是该库中定义优化问题的基础类。根据pymop文档,Problem类用于定义个新的优化问题。用户需要继承这个基类并实现其中的方法,特别是`_evaluate`方法,该方法用于评估给定解的目标函数值和约束(如果有)。定义问题通常需要指定:-变量个数(n_var)-目标个数(n_obj)-约束个数(n_constr)-变量的类型(例如,实数、整数等)-变量的上下界然后,在`_evaluate`方法中,对于传入的种群(组解),计算每个解的目标函数值和约束违反程度。下面是个简单的示例,展示如何定义个自定义问题:</think>### pymop.problemProblem 类的用法与定义 `pymop` 是 Python 中用于**多目标优化**的库,其核心 `Problem` 类用于定义优化问题。以下是关键要点: #### 1. Problem 类定义 ```python class Problem: def __init__(self, n_var: int, # 变量维度 n_obj: int, # 目标函数数量 n_constr: int = 0, # 约束数量(默认0) xl=None, # 变量下界 xu=None, # 变量上界 type_var=np.double): # 变量类型 self.n_var = n_var self.n_obj = n_obj self.n_constr = n_constr self.xl = xl self.xu = xu self.type_var = type_var def _evaluate(self, x: np.ndarray, # 决策变量矩阵 (n_pop x n_var) out: dict, # 输出字典 *args, **kwargs): # 需用户实现:计算目标函数和约束 out["F"] = ... # 目标矩阵 (n_pop x n_obj) out["G"] = ... # 约束矩阵 (n_pop x n_constr) ``` [^1] #### 2. 基础用法示例(ZDT1问题) ```python from pymop.problems import Problem import numpy as np class ZDT1(Problem): def __init__(self): super().__init__(n_var=30, n_obj=2, xl=0, xu=1) def _evaluate(self, x, out, *args, **kwargs): f1 = x[:, 0] # 第个目标 g = 1 + 9.0 / (self.n_var - 1) * np.sum(x[:, 1:], axis=1) f2 = g * (1 - np.sqrt(f1 / g)) out["F"] = np.column_stack([f1, f2]) # 目标输出 # 使用问题 problem = ZDT1() x = np.random.rand(10, 30) # 10个解 out = {} problem.evaluate(x, out) print(out["F"].shape) # (10, 2) ``` #### 3. 关键特性 - **变量边界**:通过 `xl` 和 `xu` 设置(标量或向量),例如 `xl=[0,0], xu=[1,2]` - **约束处理**:在 `out["G"]` 中返回违反约束的值($\leq 0$ 表示可行) - **并行评估**:通过 `evaluate_all()` 支持并行计算[^2] - **内置问题**:库预置了 `ZDT`, `DTLZ`, `CEC` 等标准测试问题 #### 4. 高级用法 **带约束的自定义问题:** ```python class MyConstraintProblem(Problem): def __init__(self): super().__init__(n_var=2, n_obj=1, n_constr=1, xl=-5, xu=5) def _evaluate(self, x, out, *args, **kwargs): out["F"] = np.sum(x**2, axis=1) # 目标:最小化x1²+x2² out["G"] = x[:, 0] + x[:, 1] - 1 # 约束:x1 + x2 ≤ 1 ``` **使用预置问题:** ```python from pymop.problems.zdt import ZDT2 problem = ZDT2(n_var=10) # 10维变量 x0 = np.array([0.5] * 10) print("目标值:", problem.evaluate(x0)["F"]) ``` ### 注意事项 1. 必须重写 `_evaluate` 方法,否则抛出 `NotImplementedError` 2. 目标函数需最小化(最大化问题需手动转换) 3. 变量边界未设置时默认为 `None`(需在评估函数中检查可行性)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值